嵌入式系统综合实验一
- 格式:doc
- 大小:4.44 MB
- 文档页数:13
嵌入式系统应用实验报告姓名:学号:学院:专业:班级:指导教师:实验1、流水灯实验编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。
实验主要考察对STM32F10X系列单片机GPIO的输出操作。
参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式:◇输入浮空◇输入上拉◇输入下拉◇模拟输入◇开漏输出◇推挽式输出◇推挽式复用功能◇开漏式复用功能根据实验要求,应该首先将GPIO配置为推挽输出模式。
由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。
由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。
反之,LED灯熄灭。
软件方面,在程序启动时,调用SystemInit()函数〔见附录1〕,对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。
GPIO配置函数为SZ_STM32_LEDInit()〔见附录2〕,函数中首先使能GPIO 时钟:RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;再配置GPIO端口翻转速度:GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;最后将配置好的参数写入寄存器,初始化完成:GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。
初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,到达流水灯的效果〔程序完整代码见附录3〕。
实验程序流程图如下:硬件方面,根据实验指南,将实验板做如下连接:实验二、按键实验利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。
嵌入式系统实验一存储器实验嵌入式系统实验一-存储器实验2022春季嵌入式系统课程实验报告《嵌入式系统》课程实验报告学生姓名:班级:讲师:记分及评价:项目满分:5分一、实验名称记忆实验二、实验目的了解S3C2410X处理器的内部存储空间分配;掌握存储区域配置方法;掌握对存储区进行读写访问的方法。
三、实验内容熟练使用命令脚本文件对arm存储控制器进行正确配置。
使用c语言编程,实现对ram的读写访问。
四、实验原理s3c2410a的存储器控制器提供访问外部存储器所需要的存储器控制信号,具有以下特性:●支持小/大端(通过软件选择)。
●地址空间:每个bank有128mb(总共有8个bank,共1gb)。
●除bank0只能是16/32位宽之外,其他bank都具有可编程的访问位宽(8/16/32位)。
●总共有8个存储器bank(bank0~bank7):一其中6个用于rom,sram等;一剩下2个用于rom,sram,sdram等。
●7个固定的存储器bank(bank0~bank6)起始地址。
●最后一个bank(bank7)的起始地址是可调整的。
●最后两个bank (bank6和bank7)的大小是可编程的。
● 所有内存库的访问周期都是可编程的。
● 可以通过插入外部等待来延长总线访问周期。
● 支持SDRAM的自刷新和断电模式。
《嵌入式系统》课程实验报告2021年春季五、实验结果超级终端上显示一下信息:六、练习编写程序对sram进行字节的读写访问。
#包括\voidmemory_test(void){因蒂;uint16tdata;intmemerror=0;uint16t*pt;2022春季嵌入式系统课程实验报告uart_printf(\0x00e00000,_ram_startaddress+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e0000);//记忆书写while((uint32t)pt<(_ram_startaddress+0x00f00000)){*pt=(uint16t)pt;pt++;}//memoryreaduart_uuuprintf(\memorytest(%xh-%xh):rd\\n\uuu内存_uuuu起始地址+0x00e00000,uuu内存_uuu起始地址+0x00f00000);pt=(uint16t*)(_ram_startaddress+0x00e00000);而((uint32t)pt<(_ram_startaddress+0x00f00000)){data=*pt;如果(数据!=(uint16t)pt){memerror=1;uart_uPrintf(\break;}pt++;}if(memerror==0)uart_printf(\}。
《嵌入式系统设计(实验课)》内容安排《嵌入式系统设计(实验课)》是《嵌入式系统设计》课程的一个重要环节。
通过实验,学生可以对嵌入式系统的设计与开发过程有更深地体会。
实验课共八次,每次2学时,实验内容结合课程内容,介绍一般的实验开发流程和软件硬件开发环境,并辅之以典型的嵌入式程序设计实例,使学生掌握基本的嵌入式软件开发技能。
大量的具有实际应用背景的实验,更将理论与实践结合起来,使实验内容更加生动。
实验报告要求一、实验名称:说明:本次实验的名称二、实验目的:说明:本次实验的主要目的,参考每次的实验指导书三、实验环境:说明:实验用到的硬件软件环境。
四、实验内容与步骤:说明:实现实验目的而进行的实验内容,如果有步骤要求则简要列出步骤五、实验报告总结:说明:对本次实验的总结,1.画出主函数的程序流程图,2.重写主程序.或者:自拟一个新的应用,参照本次实验的主程序,重新设计主程序并给出详尽注释。
3.其他,本次实验得到了什么?收获是什么?有些什么别的想法?六、建议与意见:说明:对于此次实验内容或在实验过程中有任何问题或建议,以及对于改善实验效果有什么建议,均可提出。
在书写实验报告的过程中,主要是帮助自己回顾和总结实验。
重点放在第五部分,前四项可以十分简要地列写,第六项有则提出,无则不写。
实验一嵌入式微处理器系统的开发环境一、实验环境PC机一台软件: ADS 1.2集成开发环境一套二、实验目的1.了解嵌入式系统及其特点;2.熟悉嵌入式系统的开发环境和基本配置并能编写简单的汇编程序三、实验内容1.嵌入式系统的开发环境、基本配置2.使用汇编指令完成简单的加法实验四、实验步骤(1)在D:\新建一个目录,目录名为experiment。
(2)点击 WINDOWS 操作系统的“开始|程序|ARM Developer Suite v1.2 |Code Warrior for ARM Developer Suite”启动Metrowerks Code Warrior,或双击“ADS 1.2”快捷方式启动。
实验一最小系统实验一、实验目的熟悉最小系统的硬件构成,掌握复位电路、晶振电路、电源电路(尤其是滤波电容的应用),编写一个例程,并在最小系统上运行;了解嵌入式开发的基本思想和过程。
掌握最小系统的构成,在将来的项目运用中能根据不同的场合选择相应的复位电路。
二、实验原理本实验通过一个简短的 Boot 引导程序介绍 ARM 开发平台的启动过程,同时该引导程序也可其他章节程序引导的示例程序。
本程序主要为了让读者能够清晰理解启动程序的基本架构组成部分以及掌握ARM 引导程序的编写方法。
三、主要实验设备1.硬件:宿主机、ARM教学试验箱;2.软件:Windows操作系统、ADS1.2集成开发环境。
四、实验内容构建最小系统,用示波器观察一下晶振电路的波形,测一下晶振正常工作时的电压。
编写一个例程,编译并运行。
设置ARM仿真器的开发环境。
程序架构如下:1.程序头IMPORT MDCNFG ;声明 MDCNFG(读写寄存器)物理地址0x48000000IMPORT MDREFR ;声明 MDREFR(刷新寄存器)0x48000004IMPORT MDMRS ;声明 MDMRS(模式/设置寄存器 0x48000040IMPORT init_MDCNFG ; 声明 init_MDCNFG 0x02000ac9IMPORT init_MDREFR ; 声明 init_MDREFR 0x0011e018IMPORT init_MDMRS ; 声明 init_MDMRS 0x320032IMPORT StackSvc ; 声明 StackSvc 0xa0600000IMPORT StackIrq ; 声明 StackIrq 0xa0605000IMPORT StackFiq ; 声明 StackFiq 0xa060a000IMPORT StackAbt ; 声明 StackAbt 0xa060e000IMPORT StackUnd ; 声明 StackUnd 0xa0714000IMPORT StackUsr ; 声明 StackUsr 0xa0720000IMPORT mainIMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
课程实验报告实验名称:嵌入式系统实验专业班级:计算机科学与技术x班学号:Ux姓名:x合作者:x实验时间:xxxx年xx月xx日计算机科学与技术学院试验一:bootloader (ads、引导)一、实验任务1、熟悉ADS 1.2开发工具创建、编译、下载、调试工程2、串口通讯串口控制器初始化、收/发数据3、配置主机端的nfs服务器配置主机端的nfs服务器,以连接linux核心4、下载并运行linux核心使用自己的串口程序下载并运行linux核心二、实验内容编写串口接收数据函数编写串口发送数据函数学习ads、jtag调试、flash烧写打印菜单,等待用户输入下载并运行linux核心配置主机的nfs服务器,与linux核心连接三、实验步骤1.编写串口接收数据函数编写串口发送数据函数修改bootloader:菜单、串口收发、命令行;接收串口数据并做相应处理:while(1){打印菜单并等待用户输入;switch(ch) //根据用户输入做相应处理{case '1':imgsize=xmodem_receive((char *)KERNEL_BASE, MAX_KERNEL_SIZE);if(imgsize==0) //下载出错;else //下载成功;break;case '3':nand_read((unsigned char *)KERNEL_BASE, 0x00030000, 4*1024*1024);case '2':BootKernel(); //这里是不会返回的,否则出错;break;default:break;}}Bootloader的main()函数打印菜单:int main(void){ARMTargetInit(); //目标板初始化;//接收用户命令,传递linux核心;Uart_puts("Menu:\n\r");Uart_puts("1.Load kernel via Xmodem;\n\r");Uart_puts("2.Boot linux; \n\r");Uart_puts("3.Load kernel from flash and boot; \n\r");Uart_puts("Make your choice.\n\r");do{ch=Uart_getc();}while(ch!='1' && ch!='2' && ch!='3');return 0;}串口读写:void Uart_putc(char c){while(!SERIAL_WRITE_READY());((UTXH0) = (c));}unsigned char Uart_getc( ){while(!SERIAL_CHAR_READY());return URXH0;}2.使用ads1.2编译bootloader;3.使用uarmjtag下载、调试bootloader;4.使用axd查看变量、内存,单步跟踪;5.配置超级终端,与bootloader通讯;6.配置nfs;编辑/etc/export文件:/home/arm_os/filesystem/rootfs 目标板ip(rw,sync)/home/arm_os/filesystem/rootfs 主机ip(rw,sync)启动nfs服务器:/etc/init.d/nfs restart测试nfs服务器是否正常运行:mount 主机ip:/home/arm_os/filesystem/rootfs /mnt7.以root用户启动cutecom,将cutecom配置改为115200 bps,8位,1位停止位,无校验,xmodem,no line end;8.使用bootloader重新下载Linux核心映像,启动核心运行后,察看是否成功加载nfs上的root文件系统;9.启动Linux核心运行,察看结果;10.linux核心能够运行到加载root步骤,说明bootloader正常运行;11.将bootloader烧写到flash中,重启目标板电源,察看bootloader是否烧写正常,下载核心测试;目标板linux系统正常运行到命令行模式下,能够正常输入linux命令,说明实验成功。
嵌入式系统实验报告学号:姓名:班级:13电子信息工程指导老师:苏州大学电子信息学院2016年12月实验一:一个灯的闪烁1、实验要求实现PF6-10端口所连接的任意一个LED灯点亮2、电路原理图图1 LED灯硬件连接图3、软件分析RCC_Configuration(); /* 配置系统时钟*/GPIO_Configuration(); /* 配置GPIO IO口初始化*/ for(;;){GPIOF->ODR = 0xfcff; /* PF8=0 --> 点亮D3 */Delay(1000000);GPIOF->ODR = 0xffff; /* PF8=1 --> 熄灭D3 */Delay(1000000);4、实验现象通过对GPIOF8的操作,可以使LED3闪烁5、实验总结这是第一次使用STM32开发板,主要内容是对IO端口进行配置,点亮与IO端口相连接的LED灯,闪烁周期为2S。
通过本实验对STM32开发板的硬件原理有了初步了解。
实验二:流水灯1、实验要求实现PF6-10端口所连接的5个LED灯顺次亮灭2、电路原理图图1 流水灯硬件连接图3、软件分析int main(void){RCC_Configuration();/* 配置系统时钟*/GPIO_Configuration();/* 配置GPIO IO 口初始化*/for(;;){GPIOF->ODR = 0xffbf;/* PF6=0 --> 点亮LED1 */Delay(5000000);GPIOF->ODR = 0xff7f;/* PF7=0 --> 点亮LED2 */Delay(5000000);GPIOF->ODR = 0xfeff;/* PF8=0 --> 点亮LED3 */Delay(5000000);GPIOF->ODR = 0xfdff;/* PF9=0 --> 点亮LED4 */Delay(5000000);GPIOF->ODR = 0xfbff;/* PF10=0 --> 点亮LED5 */ }}4、实验现象LED1~LED5依次点亮,亮灭的时间间隔都为1S。
实验一 ARM汇编语言程序设计一、实验目的1.了解IAR Embedded Workbench 集成开发环境2.掌握ARM汇编指令程序的设计及调试二、实验设备1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿真驱动程序三、实验内容1.熟悉IAR Embedded Workbench 集成开发环境2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释程序实现的功能分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F程序代码:AREA Examl, CODE,READONLY ;定义一个代码段ENTRY ;程序入口MOV R0,#0;设置R0寄存器的值为0MOV R8,#0;设置R8寄存器的值为0ADR R2,N;将R2寄存器的值设为数据域N的地址LDR R1,[R2];将以R2的值为地址的数据读入R1MOV R2,#0;设置R2的值为0ADR R3,C; 将R3寄存器的值设为数据域C的地址ADR R5,X; 将R5寄存器的值设为数据域X的地址LOOPLDR R4,[R3,R8];将R3+R8的数据读入R4LDR R6,[R5,R8];将R5+R8的数据读入R6MUL R9,R4,R6;R9 = R4*R6ADD R2,R2,R9;R2 = R2+R9ADD R8,R8,#4;R8 = R8+4ADD R0,R0,#1;R0 = R0+1CMP R0,R1;比较R0和R1的值BLT LOOP;R0<R1的话执行循环N DCD 0X03;C DCD 0X01,0X02,0X03,0X04,0X05,0X06;X DCD 0X01,0X02,0X03,0X04,0X05,0X06;END程序结果:各个寄存器的结果执行结果如下:3.实现1+2+3+4+····+100,求的值,并保存在地址0x90018的地址里面程序代码:MOV R0,#100;设置R0寄存器的值为100LDR R2,=0X90018;设置R2寄存器指向地址0x90018MOV R1,#0;设置R1的值为0MOV R3,#0;设置R3的值为0LOOPADD R3,R3,R0;R3 = R3+R0SUB R0,R0,#1;R0 = R0-1CMP R0,R1;将R0和R1的值比较BNE LOOP;不相等的话继续执行循环STR R3,[R2];将R3的值装入到R2指向的地址块中。
嵌入式系统设计实验报告班级: 20110612学号: ***********名:***成绩:指导教师:武俊鹏、刘书勇1. 实验一1.1 实验名称博创UP-3000实验台基本结构使用方法1.2 实验目的1.熟悉嵌入式系统开发式流程概述。
2.熟悉UP-net3000实验平台的核心硬件电路和外设。
3.熟悉ARM JTAG的安装与使用。
1.3 实验环境硬件:ARM 嵌入式开发平台、用于ARM7TDMI的JTAG仿真器、PC 机Pentium100以上、串口线。
软件:PC机操作系统win98、Win2000或WinXP、ARM SDT 2.51或ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
1.4 实验内容及要求1.熟悉嵌入式系统开发式流程概述。
2.熟悉UP-net3000实验平台的核心硬件电路和外设。
3.熟悉ARM JTAG的安装与使用。
1.5 实验设计与实验步骤1.新建超级终端2.选择ARM 开发实验台串口。
完成新建超级终端的设置以后,可以选择超级终端文件菜单中的保存,将当前设置3.保存为一个特定超级终端到桌面上,以备后用。
用串口线将PC机串口和平台UART0 正确连接后,就可以在超级终端上看到程序输出的信息了。
4.启动开发板,按住任意键,使开发板进入BIOS设置状态。
5.在超级终端的界面上,显示BIOS版本信息,以及相应的测试指令。
操作时,要在PC机上输入小写的字母快捷键,进入到相应的功能中去。
6.按照超级终端上的提示信息,进行功能的测试。
1.6 实验过程与分析本次实验操作起来并不困难,因为此次实验属于验证型实验,按照实验资料所给的提示信息,以上面的步骤,即可得到实验的结果。
进入到BIOS界面后,按照超级终端上的提示信息来进行功能1.7 实验结果总结在实验过程中,我们进行的很顺利,没有遇到什么问题,在超级终端界面,按提示的快捷键来测试对应的功能。
如e:测试由ZLG7289 驱动的LED 显示,共分3 步,请看超级终端提示按任意键继续,同时观察LED 的变化,最后返回主菜单。
一、实验背景与目的随着信息技术的飞速发展,嵌入式系统在各个领域的应用越来越广泛。
为了提升学生对嵌入式系统的理解和应用能力,本实验课程旨在通过综合实训,让学生全面掌握嵌入式系统的开发流程,包括硬件选型、软件开发、系统调试以及项目实施等环节。
通过本实验,学生能够熟悉嵌入式系统的基本原理,提高实际操作能力,为今后从事嵌入式系统相关工作打下坚实基础。
二、实验环境与工具1. 硬件平台:选用某型号嵌入式开发板作为实验平台,具备丰富的外设接口,如GPIO、UART、SPI、I2C等。
2. 软件平台:采用某主流嵌入式Linux操作系统,支持交叉编译工具链,方便软件开发和调试。
3. 开发工具:集成开发环境(IDE),如Eclipse、Keil等,提供代码编辑、编译、调试等功能。
4. 其他工具:示波器、逻辑分析仪、电源适配器等。
三、实验内容与步骤1. 硬件平台搭建(1)根据实验要求,连接嵌入式开发板与计算机,确保硬件连接正确无误。
(2)配置开发板电源,检查开发板各个外设是否正常工作。
2. 软件环境搭建(1)在计算机上安装嵌入式Linux操作系统,并配置交叉编译工具链。
(2)安装集成开发环境(IDE),如Eclipse或Keil,并进行相关配置。
3. 嵌入式系统开发(1)根据实验要求,设计嵌入式系统功能模块,编写相关代码。
(2)利用IDE进行代码编辑、编译、调试,确保程序正常运行。
4. 系统调试与优化(1)使用示波器、逻辑分析仪等工具,对系统进行调试,检查各个模块是否正常工作。
(2)根据调试结果,对系统进行优化,提高系统性能和稳定性。
5. 项目实施(1)根据实验要求,设计并实现一个嵌入式系统项目,如智能家居控制系统、工业自动化控制系统等。
(2)编写项目报告,总结项目实施过程和心得体会。
四、实验结果与分析通过本次嵌入式综合实训,我们完成了以下实验内容:1. 熟悉嵌入式开发平台的基本硬件和软件环境。
2. 掌握嵌入式系统开发流程,包括硬件选型、软件开发、系统调试等环节。
《嵌入式系统技术》实训报告1、实验目的z了解S3C2440A 外部中断的工作原理。
z掌握S3C2440A 外部中断的使用方法。
2、实验设备z PC 机、Multi-ICE 仿真器、2440A 实验箱。
3、实验内容z通过外部K1、K2、K3、K4、K5、K7 按键触发外部中断E INT1、EINT2、EINT3、EINT4、EINT5、EINT74、实验原理4.1 ARM 的异常中断类型在嵌入式系统中外部设备的功能实现主要是靠中断机制来实现的。
中断功能可以解决CPU 内部运行速度远远快于外部总线速度而产生的等待延时问题。
ARM 提供的FIQ 和IRQ 异常中断用于外部设备向C PU 请求中断服务,一般情况下都是采用I RQ 中断。
七种异常中断中断过程框图4.2 异常中断响应过程和返回过程异常中断的响应过程:1).保存处理器当前状态寄存器C PSR 的值到备份程序状态寄存器S PSR 中。
2).设置但前程序状态寄存器CPSR 的值,其中包括:设置CPSR 响应位的值,使处理器进入特定的处理器模式;按要求屏蔽中断,通常应该屏蔽I RQ 中断。
在F IQ 中断时屏蔽F IQ 中断。
3).设置L r 寄存器。
将相应中断模式的L r 寄存器的值设为异常中断的返回地址。
4).处理程序计数器PC,将PC 值设为相应的中断向量的地址,从而实现跳转以执行中断服务程序。
异常中断的返回当处理器执行完以上流程之后,处理器已经从中断向量进入异常处理的状态。
异常中断处理完毕之后,在异常中断程序的末端,处理器进入异常中断的返回状态,其流程如下:1).恢复状态寄存器。
将保存的备份程序状态寄存器SPSR 值赋给当前程序状态寄存器CPSR。
2).将返回地址赋值到程序计数器(PC)。
这样程序将返回到异常中断产生的下一条指令或出现问题的指令处执行。
需要注意的是:对于不同的异常中断,其返回地址的计算方法也是不同的,IRQ 和F IQ 异常中断产生时,程序计数器PC 已经更新,而SWI 中断和未定义指令中断时由当前指令自身产生的,程序计数器P C 尚未更新,所以要计算出下一条指令的地址来执行返回操作;指令预取指中指异常中断和数据访问中断要求,返回到出现异常的执行现场,重新执行操作。
嵌入式实验(1-8)第一次实验1. 用汇编语言编程实现:若R0=0,则转移到标号L0处;若R0=1,则转移到标号L1处;若R0=2,则转移到标号L2处。
否则不转移。
2. 用汇编语言编程实现128位整数减法。
3. 用汇编语言编程实现:有4个数分别存放在R0~R3中,编程实现:4数相乘,其积存放在R4中。
4. 用汇编语言编程实现:R0中的高24位[31:8]保持不变,低8位[7:0]设置为0xB。
5. 用汇编语言编程实现:快速中断的使能和禁止。
第二次实验1. 用汇编语言编程实现:将存储器中起始地址M1处的4个字数据复制到地址M2处。
2. 用汇编语言编程实现:100+101+102+…+200,其和存于R0。
3. 用汇编语言编程实现:从存储器中起始地址M1处的20个字节数据中,找出一个最小数存放在R0中。
4. 利用跳转表的思想编写一个汇编子程序,根据键入的值(存放在R0中)不同来完成不同的子程序跳转(假设有四个子程序SUB0、SUB1、SUB2、SUB3)。
第三次实验1 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,完成字符串STR1与STR2内容的互换(假设STR1和STR2长度一致)。
2. 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,将输入的20个字节数据,从大到小加以排序,大数在前,小数在后。
3. 用C语言和汇编语言混合编程实现:用汇编语言完成对C语言全局变量的访问。
假设CV AR1和CV AR2是C语言中定义的全局变量,请用一段汇编语言访问它们,完成两者的相加运算,结果存放在CV AR1中。
第四次实验1. 用C语言和汇编语言混合编程实现:在C语言程序中调用汇编语言代码,完成两个字符串的比较,并返回比较结果。
如果比较字符串相同,返回1,否则返回0。
2. 用C语言和汇编语言混合编程实现:请完成一段字符串“Hello Zhejiang University of Technology!”的拷贝,要求主程序用C语言编写,字符串拷贝子程序用汇编语言编写。
【精品】嵌入式系统实验报告-1-外部中断实验名称:外部中断
实验目的:了解外部中断的概念和原理,学习在Keil中配置和使用外部中断,掌握外部中断的应用。
实验器材:Keil软件,STC89C52RC单片机,LED灯,按键开关。
实验原理:
外部中断是指单片机外部设备(如按键开关、定时器等)产生的中断请求信号,使得单片机能够在执行程序的过程中,根据需要接受来自外部设备的中断请求,并立即处理中断请求所需的相关程序,在处理完中断请求后再返回到原来程序的执行。
在Keil中使用外部中断需要用到的库函数有:
void EX0_init(void); //外部中断0(P3.2)初始化函数
void EX1_init(void); //外部中断1(P3.3)初始化函数
void INT0_ISR(void) interrupt 0; //外部中断0的中断处理函数
void INT1_ISR(void) interrupt 2; //外部中断1的中断处理函数
其中,EX0_init()和EX1_init()函数用于初始化外部中断0和外部中断1,将相应的引脚设置为中断请求引脚,并设置相应的中断触发方式;INT0_ISR()和INT1_ISR()函数用于处理外部中断0和外部中断1的中断请求。
实验结果:
在Keil中编译程序后,烧录程序到单片机中,并将单片机连接到外部电路中。
当按下按键时,会模拟产生外部中断请求信号,LED灯会闪烁3次后停止闪烁。
当按键松开后,LED灯将停止闪烁,恢复到初始状态。
嵌入式系统实验报告学院:计算机科学与工程姓名:学号:______________专业:指导老师:完成日期:实验一:流水灯案例、8位数码管动态扫描案例一、实验目的1.1进一步熟悉Keil C51集成开发环境调试功能的使用;1.2学会自己编写程序,进行编译和仿真测试;1.3利用开发板下载hex文件后验证功能。
二、实验原理2.1:实验原理图2.2:工作原理2.2.1:流水灯电路中有LO,1,L2,L3,4,L5,L6,L7 共八个发光二极管,当引脚LED_ SEL输入为1,对于A、B、C、D、E、F、G、H引脚,只要输入为1,则点亮相连接的发光二极管。
A~H引脚连接STM32F108VB芯片的PE8~PE15,程序初始化时,对其进行初始设置。
引脚LED_ SEL 为1时,发光二极管才工作,否则右边的数码管工作。
注意,LED SEL 连接于PB3,该引脚具有复用功能,在默认状态下,该引脚的I0不可用,需对AFIO_ MAPR寄存器进行设置,设置其为10可用。
2.2.2:8位数码管数码管中的A~G、DP段分别连接到电路图中的A~G、H线上,当某段上有一-定的电压差值时,便会点亮该段。
当E3输入为1,也就是LED_ SEL输入为0时,根据SELO~SEL2的值确定选中的数码管,即位选,再根据A~H引脚的高低电平,点亮对应段,即段选。
三、实验结果3.1:流水灯对于给出的流水灯案例,下载HEX文件后,在开发板上可观察到L0-L7从左至右依次点亮,间隔300ms。
当全部点亮八个发光二极管后,八个发光二极管同时熄灭,间隔300ms后,发光二极管再次从左至右依次点亮。
如此反复循坏。
3.2:8位数码管对于给出的8位数码管动态扫描案例,下载后,在开发板上可观察到8个数码管从左至右依次显示对应的数字,且每一个数码显示的数字在1-9之间循环。
可以通过加快扫描频率,使得八位数码管在人眼看上去是同时显示。
在后续的案例中可以看到该现象。
西南科技大学嵌入式实验报告《嵌入式系统》
实验报告
姓名:
学号:
班级:
20xx年4月
实验一ARM汇编指令实验1
一、实验目的
1.初步学会使用ADS1.2 开发环境及ARM软件模拟器;
2.通过实验掌握简单ARM汇编指令的使用方法。
二.实验设备
1.硬件:PC机;
2.软件:ADS1.2集成开发环境。
Windows98/2000/NT/XP。
三.实验内容
1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。
2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。
四.实验原理
ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器
也是32位,但只使用了其中的12位。
1.ARM通用寄存器
通用寄存器(R0~R15)可分为3类,即不分组寄存器
R0~R7.分组寄存器R8~R14.程序计数器R15。
2.存储器格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。
字节0~3存放第一个字,字节4~7存放第2个字,以此类推。
ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
五.实验程序
1. 实验A参考程序
X EQU 45 :定义变量x,并赋值为45
Y EQU 64 :定义变量y,并赋值为64
STACK_TOP EQU 0x1000 :定义栈顶0x1000
AREA Example,CODE,READONLY :声明代码段
ENTRY :标识入口。
实验一:汇编指令实验1.实验目的z了解Keil uVision集成开发环境及软件仿真功能使用。
z掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序。
z掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。
z掌握基本的汇编程序调试。
2.实验设备z硬件:PC机一台z软件:WindowsXP系统,Keil uVision 4.0集成开发环境3.实验内容(1)使用LDR指令读取0x40000100地址上的数据,将数据加1。
若结果小于10,则使用STR指令把结果写回原地址;若结果大于等于10,则把0写回原地址。
(2)使用Keil uVision软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口监视R0和R1的值,打开存储器观察窗口监视0x40000100地址上的值。
4.实验预习要求(1)学习ARM指令系统的内容,重点掌握LDR/STR指令和指令条件执行;(2)查阅Keil uVision 软件的介绍,了解软件的功能和操作方法。
5.实验步骤(1)启动Keil uVision,新建一个工程ex01。
见图1-1、图1-2、图1-3。
图1-1 建立工程图1-2 选择目标芯片图1-3 不需要系统提供的Startup文件(2)建立汇编源文件ex01.s,编写实验程序,然后添加到工程中。
见图1-4、图1-5、图1-6、图1-7。
图1-4 建立新文件图1-5 保存扩展名为.s的汇编程序文件图1-6 把文件添加到工程图1-7 添加文件到工程后(3)设置工程选项,存储器映射。
见图1-8、图1-9。
图1-8 设置工程选项图1-9 设置存储器映射(4)编译链接工程。
见图1-10。
(5)进行软件仿真调试。
见图1-11、图1-12、图1-13、图1-14。
图1-11 调试运行图1-12 调试界面图1-13 设置断点图1-14 运行程序6.实验参考程序汇编指令实验的参考程序见程序清单1.1。
程序清单1.1 汇编指令实验参考程序COUNT EQU 0X40000100 ;定义一个变量,地址为0x40000100 AREA RESET, CODE, READONLY ;声明代码段RESETENTRY ;表示程序入口CODE32 ;声明32位ARM指令START LDR R1,=COUNT ;R1 ← COUNTMOV R0,#0 ;R0 ← 0STR R0,[R1] ;[R1] ← R0,即设置COUNT为0LOOP LDR R1,=COUNTLDR R0,[R1] ;R0 ← [R1]ADD R0,R0,#1 ;R0 ← R0 + 1CMP R0,#10 ;R0与10比较,影响条件码标志MOVHS R0,#0 ;若R0 >= 10, 则此指令执行,即R0 ← 0STR R0,[R1] ;[R1] ← R0,即保存COUNTB LOOPEND7.思 考(1)若使用LDRB/STRB代替程序清单中的所有加载/存储指令(LDR/STR),程序会得到正确的执行吗?(2)LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明?(提示:LDR伪指令的形式为“LDR Rn,=expr”。
计算机与信息学院《嵌入式系统》实验报告学生姓名:学号:专业班级:2014 年 6 月20 日实验一(1):熟悉Linux 开发环境一、实验目的熟悉Linux 开发环境,学会基于Mini6410 的Linux 开发环境的配置和使用。
使用Linux 的arm-linux-gcc 编译,minicom串口方式下载调试二、实验内容本次实验使用Fedora 9.0 操作系统环境,安装ARM-Linux 的开发库及编译器。
创建一个新目录,并在其中编写hello.c 和Makefile 文件。
学习在Linux 下的编程和编译过程,以及ARM 开发板的使用和开发环境的设置。
下载已经编译好的文件到目标开发板上运行。
三、实验设备及工具(包括软件调试工具)硬件:Mini6410嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统Fedora9+MINICOM+ARM-LINUX 开发环境四、实验步骤1 、建立工作目录[root@zxt smile]# mkdir hello[root@zxt smile]# cd hello2 、编写程序源代码在 Linux 下的文本编辑器有许多,常用的是 vi 和 Xwindow 界面下的 gedit 等,开发过程中推荐使用 vi。
Kdevelope、anjuta 软件的界面与 vc6.0 类似,使用它们对于熟悉 windows 环境下开发的用户更容易上手。
实际的 hello.c 源代码较简单,如下:#include <stdio.h>main() {printf(“hello world \n”);}我们可以是用下面的命令来编写 hello.c 的源代码,进入 hello 目录使用 vi 命令来编辑代码:[root@zxt hello]# vi hello.c按“i”或者“a”进入编辑模式,将上面的代码录入进去,完成后按 Esc 键进入命令状态,再用命令“:wq”保存并退出。
实验名称: 姓名: 学号:装订线P.1实验报告课程名称: 嵌入式系统设计 指导老师:马永昌 成绩:________________实验名称:综合实验一dht11和人体感应传感器 实验类型:验证型 同组学生姓名:孙凡原 一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、讨论、心得一、实验目的和要求1.掌握字符设备驱动程序的基本结构和开发方法2.掌握用户空间调用设备驱动的方法3.掌握用户和内核的交互二、实验内容和原理1.编写温湿度传感器DHT11驱动,传输打印温湿度信息2.编写人体感应传感器驱动,控制LED 灯亮灭原理:温湿度传感器DHT11:1.引脚图实际使用传感器没有NC 引脚 2.数据采集 a.数据总时序用户主机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发专业:测控技术与仪器姓名:颜睿 学号:3130103850日期:2018.4.28地点:创客空间装订线送响应信号,送出40bit 的数据,幵触发一次信采集。
b.主机发送起始信号连接DHT11的DATA引脚的I/O口输出低电平,且低电平保持时间不能小于18ms,然后等待DHT11 作出应答信号。
c.检测从机应答信号DHT11 的DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11 的DATA引脚处于输出状态,输出80 微秒的低电平作为应答信号,紧接着输出80 微秒的高电平通知外设准备接收数据。
d.接收数据(1)数据判定规则位数据“0”的格式为:50 微秒的低电平和26-28 微秒的高电平,位数据“1”的格式为:50 微秒的低电平加70微秒的高电平。
接收数据时可以先等待低电平过去,即等待数据线拉高,再延时60us,因为60us大于28us且小于70us,再检测此时数据线是否为高,如果为高,则数据判定为1,否则为0。
装订线(2)数据格式一次传送40 位数据,高位先出8bit 湿度整数数据+ 8bit 湿度小数数据+8bit 温度整数数据+ 8bit 温度小数数据+8bit 校验位。
(3)数据校正判断“8bit 湿度整数数据+ 8bit 湿度小数数据+8bit 温度整数数据+ 8bit 温度小数数据”的结果是否等于8bit 校验位。
如果等于则数据接收正确,否则应该放弃这一次的数据,重新接收。
人体感应传感器HCSR-501:1、全自动感应:人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平2、光敏控制(可选择,出厂时未设)可设置光敏控制,白天或光线强时不感应。
3、温度补偿(可选择,出厂时未设):在夏天当环境温度升高至 30~32℃,探测距离稍变短,温度补偿可作一定的性能补偿。
4、两种触发方式:(可跳线选择)a、不可重复触发方式:即感应输出高电平后,延时时间段一结束,输出将自动从高电平变成低电平;b、可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。
5、具有感应封锁时间(默认设置:2.5S 封锁时间):感应模块在每一次感应输出后(高电平变成低电平),可以紧跟着设置一个封锁时间段,在此时间段内感应器不接受任何感应信号。
此功能可以实现“感应输出时间”和“封锁时间”两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。
(此时间可设置在零点几秒—几十秒钟)。
6、工作电压范围宽:默认工作电压 DC4.5V-20V。
7、微功耗:静态电流<50 微安,特别适合干电池供电的自动控制产品。
装订线8、输出高电平信号:可方便与各类电路实现对接。
三、主要仪器设备树莓派、PC机、温湿度传感器、人体感应传感器四、操作方法和实验步骤1.根据说明书编写传感器驱动2.编写可执行程序五、实验数据记录和处理1.传感器驱动demo.c#include<linux/init.h>#include<linux/module.h>#include<linux/device.h>#include<linux/gpio.h>#include<linux/interrupt.h>#include<linux/cdev.h>#include<linux/ioctl.h>#include<linux/fs.h>#include<linux/delay.h>#include<asm/uaccess.h>#define DRIVER_NAME"Demo"#define DEVICE_NAME"Demo"static dev_t demo_devno; //设备号static struct class *demo_class;static struct cdev demo_dev;static struct gpio_config{int button_num;//人体传感器输出端int out_num;//温湿度传感器数据端int led_num;//人体红外传感器连接的ledint led1_num;//温湿度传感器连接的ledint humidity;//湿度值int temperature;//温度值}config;static int i=0;static int flag = 0;装订线//open 函数,应用程序调用open系统调用时会调用本函数static int demo_open(struct inode *inode,struct file *filp){printk(KERN_INFO"Demo open\n");return0;}//release 函数,应用程序调用close系统调用时会调用本函数static int demo_release(struct inode *inode, struct file *filp){if(flag){gpio_free(config.button_num);gpio_free(config.led_num);flag = 0;}printk(KERN_INFO"Demo release\n");return0;}//ioctl 控制函数,应用程序调用ioctl系统调用时会调用本函数static long demo_ioctl(struct file *filp,unsigned int cmd,unsigned long arg){int err = 0;int buff[40];int humi=0;int temper=0;switch(cmd){case0://0 表示命令号,一般都用宏定义来控制{if(copy_from_user(&config,(void *)arg,sizeof(struct gpio_config))) { //从用户程序中获取配置数据printk(KERN_ERR"[%s %d] : copy_from userfailed !\n",__func__,__LINE__);return -EFAULT;}printk(KERN_INFO"[%s %d]: Get button gpio num: %d and led gpio num: %d\n ",__func__,__LINE__,config.button_num,config.led_num);err = gpio_request_one(config.button_num,GPIOF_IN,"Light Button");装订线if(err){printk(KERN_ERR"[%s %d]:Request button gpiofailed\n",__func__,__LINE__);return -EFAULT;}err = gpio_request_one(config.led_num,GPIOF_OUT_INIT_LOW,"LED light");if(err){printk(KERN_ERR"[%s %d]:Request led gpiofailed\n",__func__,__LINE__);gpio_free(config.button_num);return -EFAULT;}err = gpio_request_one(config.out_num,GPIOF_IN,"Light Button");if(err){printk(KERN_ERR"[%s %d]:Request button gpiofailed\n",__func__,__LINE__);gpio_free(config.button_num);gpio_free(config.led_num);return -EFAULT;}err = gpio_request_one(config.led1_num,GPIOF_OUT_INIT_LOW,"LED light");if(err){printk(KERN_ERR"[%s %d]:Request led gpiofailed\n",__func__,__LINE__);gpio_free(config.out_num);gpio_free(config.button_num);gpio_free(config.led_num);}flag = 1;break;}case1:{gpio_direction_output(config.led_num,0);//设置led输出gpio_direction_input(config.button_num);//设置人体传感器输入gpio_set_value(config.led_num,0);//关led装订线if(gpio_get_value(config.button_num)==0)//人体感应输入低电平,led灭 {gpio_set_value(config.led_num,0);}else if(gpio_get_value(config.button_num)==1)//人体感应输入高电平,led 亮{gpio_set_value(config.led_num,1);}gpio_direction_output(config.led1_num,0);//设置led1输出(实际并未使用)gpio_direction_output(config.out_num,1);//设置温湿度传感器数据端的引脚为输出gpio_set_value(config.led1_num,0);gpio_set_value(config.out_num,0);//根据dht11的数据传输规则进行操作mdelay(20);gpio_set_value(config.out_num,1);udelay(40);gpio_direction_input(config.out_num);while(gpio_get_value(config.out_num)==0){}while(gpio_get_value(config.out_num)==1){}for(i=0;i<40;i++){while(gpio_get_value(config.out_num)==0){}udelay(50);if(gpio_get_value(config.out_num)==1)//获得的数据存入buff[40]数组{buff[i]=1;while(gpio_get_value(config.out_num)==1){}}elsebuff[i]=0;}for(i=0;i<16;i++)//湿度移位相加{humi=humi*2+buff[i];装订线 }for(i=16;i<32;i++)//温度移位相加{temper=temper*2+buff[i];}config.humidity=humi;config.temperature=temper;gpio_direction_output(config.out_num,1);//测量结束引脚置高电平gpio_set_value(config.out_num,1);mdelay(2000);//延时一段时间再测量if(copy_to_user((void *)arg,&config,sizeof(struct gpio_config)))//数据传入用户态{printk(KERN_ERR"[%s %d] : copy to userfailed !\n",__func__,__LINE__);return -EFAULT;}flag=1;break;}default:printk(KERN_INFO"[%s %d]:Invalid cmd", __func__,__LINE__);break;}return0;}static struct file_operations demo_fops = {.owner = THIS_MODULE,.open = demo_open,.release = demo_release,.unlocked_ioctl = demo_ioctl,};static int __init demo_init(void){int err;装订线printk(KERN_INFO"Demo Init \n");err = alloc_chrdev_region(&demo_devno,0,1,DRIVER_NAME);if(err < 0){goto err;}cdev_init(&demo_dev,&demo_fops);err = cdev_add(&demo_dev,demo_devno,1);if(err < 0){printk(KERN_ERR"[%s,%d]add cdev failed\n",__func__,__LINE__);goto FREE_DEVNO;}//自动生成设备文件在/dev目录下,文件名为DEVICE_NAMEdemo_class = class_create(THIS_MODULE,DEVICE_NAME);if(IS_ERR(demo_class)){printk(KERN_ERR"[%s,%d]class create failed\n",__func__,__LINE__);goto DEV_FREE;}device_create(demo_class,NULL,demo_devno,NULL,DEVICE_NAME);return0;DEV_FREE:cdev_del(&demo_dev);FREE_DEVNO:unregister_chrdev_region(demo_devno, 1);err:return err;}static void demo_exit(void){if(flag){gpio_free(config.button_num);gpio_free(config.led_num);gpio_free(config.out_num);gpio_free(config.led1_num);}装订线device_destroy(demo_class,demo_devno);class_destroy(demo_class);cdev_del(&demo_dev);unregister_chrdev_region(demo_devno, 1);printk(KERN_INFO"Demo exit\n");}module_init(demo_init);module_exit(demo_exit);MODULE_AUTHOR("hyg");MODULE_DESCRIPTION("BUTTON LED Driver"); MODULE_LICENSE("GPL");2.应用程序demo.c#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/ioctl.h>#include<sys/time.h>#include<sys/ioctl.h>#include<errno.h>#include<fcntl.h>struct gpio_config{int button_num;int out_num;int led_num;int led1_num;int humidity;int temperature;};int main(int argc, char **argv){int fd;float h;float t;struct gpio_config config;config.button_num = 26;//人体感应传感器引脚装订线 config.led_num = 3;//led引脚config.out_num = 5;//dht11引脚config.led1_num = 6;//未使用config.humidity = 0;//湿度config.temperature = 0;//温度fd = open("/dev/Demo", O_RDWR);if (fd < 0) {perror("/dev/Demo");exit(0);}ioctl(fd,0,&config);//分配引脚传入内核态while(1){ioctl(fd,1,&config); //启动驱动进行数据采集h=(float)config.humidity/256;t=(float)config.temperature/256;printf("humidity: %0.2f %rh\n",h);printf("temperature: %0.2f C\n",t);sleep(0.5);}close(fd);return0;}3.makefile修改a用户程序makefile更改gcc路径为本机路径:CC := /home/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-gcc b.驱动程序makefile修改linux文件夹路径KERNELDIR:=/home/linux/4.硬件接线装订线5.编译加载运行a.环境变量b.编译c.拷贝d.加载运行装订线六、实验结果与分析人体传感器有反应,led灯亮实验完成七、讨论、心得由于之前实现了超声波传感器的驱动,这次实验还是比较简单的,主要要看懂传感器说明书的流程,多调试几次就可以实现。