嵌入式系统实训教程飘飘布道师_第1页
嵌入式系统实训教程飘飘布道师_第2页
嵌入式系统实训教程飘飘布道师_第3页
嵌入式系统实训教程飘飘布道师_第4页
嵌入式系统实训教程飘飘布道师_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、飘飘·布道师嵌入式系统实训教程飘飘2016-03目录第1章 单片机实验教程11.1 单片机开发环境的搭建11.1.1 单片机开发环境介绍11.1.2 单片机开发环境的搭建11.1.3 联机调试31.1.4 练习41.2 单片机联机调试功能试验51.2.1 观察各类存储单元51.3 单片机定时器实验71.3.1 实验目的71.3.2 设计要求71.3.3 实验原理71.3.4 实验步骤71.3.5 常见问题81.3.6 练习81.4 单片机中断系统实验91.4.1 实验目的91.4.2 设计要求91.4.3 实验原理91.4.4 实验步骤101.4.5 练习131.5 简单交通灯控制系

2、统的设计141.5.1 实验目的141.5.2 实验要求141.5.3 程序设计141.5.4 练习151.6 单片机串行通讯接口实验161.6.1 实验目的161.6.2 实验要求161.6.3 实验原理161.6.4 通讯协议171.6.4 实验步骤181.7 单片机课程设计191.7.1 课程设计要求191.7.2 提交19第2章 ARM程序设计实验202.1 ARM混合编程实验202.1.1 实验目的202.1.2 实验要求202.1.3 实验原理202.1.4 实验内容222.2 ARM的GPIO接口实验232.2.1 实验目的232.2.2 实验要求232.2.3 实验原理232.

3、2.4 实验步骤252.2.5 练习252.3 ARM的AD接口实验262.3.1 实验目的262.3.2 实验要求262.3.3 实验原理262.3.4 实验步骤27第3章 嵌入式操作系统uC/OS-II实验293.1 基于uC/OS-II的多任务编程实验293.1.1 实验目的293.1.2 实验要求293.1.3 实验原理293.1.4 实验步骤303.1.5 思考题323.1.6 练习32第4章 嵌入式Linux实验334.1 嵌入式Linux交叉开发环境的搭建334.1.1 实验目的334.1.2 实验要求334.1.3 实验步骤334.2 嵌入式Linux系统的打造及安装344.2

4、.1 实验目的344.2.2 实验要求344.2.3 实验步骤3443第1章 单片机实验教程1.1 单片机开发环境的搭建本节目标:搭建Keil C51单片机编程开发环境,以及Proteus仿真环境,实现两者的联机调试。1.1.1 单片机开发环境介绍目前,51单片机的开发大都使用C51编程语言,基本不再使用汇编语言。这大大简化了单片机应用程序的开发。当前使用最多的开发环境是Keil C51。目前最高版本为uVision 4,除支持51系列单片机外,还可支持大多数的ARM芯片。Keil开发环境本身带有模拟器,可以模拟调试单片机应用程序。也可以与Proteusl联合实现软硬件联调,达到更好的仿真效果

5、。Protues是硬件线路板的设计开发软件,用来设计硬件线路连接原理图及印刷电路板图等,是常用的硬件线路版设计软件。同时,它还具有较强的硬件仿真能力,可以形象直观地仿真硬件的运行情况,特别是它可以仿真多种常见的处理器,允许给处理器提供相应的程序并仿真运行。因此目前最为流行的单片机学习及开发环境是Keil C51 + Proteus。1.1.2 单片机开发环境的搭建本文以Proteus 7.5和Keil uVision 2为例来搭建51单片机的开发环境。(1) 安装Keil uVision2。(安装完后,要将补丁文件复制到keilC51bin文件夹内)(2) 安装Ptoteus 7.5。(安装c

6、rack时,要关闭杀毒软件;Keil驱动要等安装完Keil之后再安装)上述两软件均安装在默认文件夹内。Proteus安装在C:Program FilesLabcenter Electronics文件夹内,Keil安装在c:keil文件夹内。如果只使用keil编写C51应用程序,编译生成可执行文件(后缀为.hex)供Proteus使用,则两个软件无需配置,各自独立使用即可,以下步骤则无需进行。如想实现Keil与Proteus的联机调试功能,则需要进行如下配置:(1)运行Proteus软件包内的 "Keil驱动vdmagdi.exe" ,将驱动安装到keil的文件夹内。安装时,

7、选择“AGDI Driver for uVision2”,然后选择安装目录为c:keil即可。(2)运行"ISIS 7 Professional"菜单"Debug(调试)",选中"Use Remote Debug Monitor(使用远程调试监控)",该选项前应该有“”。(3)创建或打开Keil C的工程后,选择菜单"Project"->"Options for Target 'Target 1' ",打开"Options for Target 'Targ

8、et 1' "窗口后,选择"Debug"选项卡,选择右边的Use:"Proteus VSM Simulators",确定,如下图所示:图1 Keil工程的调试选项(4) 确保keil生成的可执行文件与proteus项目中单片机所执行的文件为同一个文件。Keil的输出配置:如输出文件名为ledc.hex,所在文件夹选择好,Create HEX File选项前打“”。图2 Keil 工程的输出选项然后在Proteus的项目中,双击单片机器件,弹出如下窗口:图3 Proteus项目内的单片机程序文件在该窗口内选择Program File为ke

9、il生成输出的ledc.hex。1.1.3 联机调试寻找可用的Proteus简单例程。如51单片机的流水灯例程。内部包括Proteus项目(后缀为.DSN)以及对应的C51程序项目文件(后缀为.uv2)。用Proteus打开.DSN的项目。确保该项目中的单片机程序为ledc.hex,菜单选项"Use Remote Debug Monitor"前应该有“”。进入Keil环境,打开.uv2的项目文件。确保编译输出为ledc.hex;确保Debug选项如图1所示。(1) 编译C51工程。选择菜单选项ProjectàBuild target(2) 进入调试模式。选择菜单选

10、项DebugàStart/Stop Debug Session为观察方便,可将两个软件窗口并排在桌面上,如下图所示:(3) 在Keil内单步执行C51程序(按F10),可以看到Proteus内的指示灯有相应的亮灭变化。(选择菜单ViewàDisassembly Windows可以只保留C语句 )1.1.4 练习(1)针对流水灯硬件设计实例,自行创建相应的C51应用项目,实现流水灯从中间向两边流动的效果。(2)在Proteus内,自行添加红、黄、绿不同颜色的指示灯,然后编写C51程序,让这些灯闪烁起来。1.2 单片机联机调试功能试验本实验要学会利用Keil开发环境,观察单片机

11、内部的各类存储器,掌握程序存储器、数据存储器、SFR各自的特点及使用方法。熟练掌握联机调试单片机程序的方法。1.2.1 观察各类存储单元(1)CPU内部寄存器的观察进入程序调试运行模式,Keil开发环境界面如图所示:左侧显示CPU内部的各寄存器名称及其内容,随着程序的运行,内容发生变化的寄存器会议高亮颜色标注出来。(2) C语言变量内容的观察:打开“ViewàWatch & Call Stack Window”。在C语言变量名字上按鼠标右键,选择“Add XXX to Watch Window”,这样,该变量的内容就会显示在Watch Windows中,并随着程序的执行而变化

12、。如图所示:按F2可以修改变量名或删除该变量。(3) 断点的设置:在C语句的最左端双击(或选择菜单项DebugàInsert/Remove Breakpoint)可以添加或删除断点。这样可以使用DebugàGo(或F5键)全速运行至断点位置。1.3 单片机定时器实验1.3.1 实验目的本实验要学会单片机定时器的设定及使用。1.3.2 设计要求设计一个倒计时秒表。要求利用两个7端数码管组成一个2位数的倒计时秒表,根据给定初始值,倒计数至0。1.3.3 实验原理(1)单片机定时器8051单片机内部集成了2个16位的计数器。可以根据需要将其作为定时器使用。这时,定时器的计数频率为

13、系统CLK/12。如果CPU采用12MHz的晶振,则定时信号源的频率固定为12MHz/12=1MHz。如果定时周期设定为50ms,则需要计数0.05S/1MHz=50000个脉冲。因为单片机定时器为加1计数器,所以,计数器初始值应设定为65536-50000=15536(即16进制的3CB0)。另外,还需要设置定时器工作模式寄存器TMOD。如果使用定时器0,16位定时器方式,则TMOD=0x01。(2)数码管显示原理1.3.4 实验步骤(1)学习实验例程:数码管显示 用Proteus软件打开其原理图;用Keil软件打开配套的C语言工程项目。编译运行程序,观察数码管的显示情况,了解数码管的显示原

14、理。重点学习C语言中数码管编码表的作用及用法。(2)修改原理图打开Proteus软件,修改数码管例程,添加一个7段数码管,接至P1端口。注意数码管要选择共阳极类型,公共端要连接VCC。(3)修改程序打开Keil软件,打开数码管的配套工程项目。定义变量sec,用于存放秒数。Char sec=99;显示两位数的方法:While(1)P2=tabsec/10; /显示十位数P1=tabsec%10; /显示个位数If(-sec<0)sec=99;/重新计数Delay(0xff);(4)利用定时器实现准确延时 修改delay()函数如下:Void delay(int nsec)int i; TM

15、OD=0x01;/16 bits,internal pulse counting for(i=0;i<20*nsec;i+) TH0=0x3c; TL0=0xb0; /Initial value=65535-50000=15535,0.05s in 12MHz TF0=0; TR0=1; /start Timer 0 while(TF0=0); /Wait for end flag TF0,delay for 0.5s TR0=0; /stop timer 0 1.3.5 常见问题(1)添加的数码管不亮:原因1:数码管的公共端没有接电源;或者电源与公共段之间应该单独加Line;原因2:程

16、序的问题:注意keil项目的输出文件就是proteus中单片机所使用的文件;另外,程序修改后,要重新编译。1.3.6 练习 再增加一个两位倒计时秒表,并编写配套程序,实现两个秒表各自倒计时(时间初值不同)。1.4 单片机中断系统实验1.4.1 实验目的(1)本实验要学会单片机中断系统的工作原理,掌握定时中断程序的编写方法。(2)掌握数码管动态显示的方法及编程。1.4.2 设计要求(1)将1.3实验中的倒计时秒表程序,用定时中断方式实现。(2)实现4个2位数倒计时秒表。1.4.3 实验原理一、单片机中断系统1.3实验中的延时方法采用了查询方式,在delay函数中利用程序循环查询定时结束标记。该方

17、式会影响CPU处理其它事情。改为定时中断方式,则可以在处理事物的过程中,只有当定时时间到的时候,才自动转入定时中断处理程序。单片机提供了个中断源,每个中断源的优先级别可以设定为或,同级中断的优先顺序按EX0àET0àEX1àET1àES从高到低顺序排列。这5个中断源有固定的编号,分别为:0-外部中断01-定时器0中断2-外部中断13-定时器1中断4-串行通讯中断在单片机内使用中断的编程步骤为:(1) 设置中断优先级:IP = 0; /都为0级。(2) 设置中断允许:IE = 0x82;/允许定时0中断(3) 提供配套的中断服务程序Void timer0_

18、int() interrupt 1 /关键词interrupt用于声明本函数为中断处理程序,对应的中断号为1,这是定时器0中断的固定编号。If(+tcount>20)/如果定时器设定为50ms中断一次,在此计数20次,则1S时间到。/进行1s的定时操作二、数码管的动态显示原理1.4.4 实验步骤一、修改原理图: 1) 首先,学习使用连线标号(Wire Label)实现信号连接。如上图,选择窗口左侧的“LBL”,然后,鼠标移至相应连线上,出现T型标志时,点击鼠标左键,弹出如下窗口:输入连线标号,如P21,表明该信号连至单片机的P21引脚。同样,需要将单片机的P21引脚连上线,并标注相同的标

19、号。这样,标号相同的连线在物理上是连接在一起的。2)实现单组LED的连接放置LED,型号选择7SEG-MPX2-CA-BLUE;然后实现如图连线。3)利用复制功能,放置4组LED。注意修改个器件的标号以及数码管公共端的连线标号,不要冲突。分别时用P1口的8个引脚控制8个数码管的公共端,如下图:二、修改程序1)首先使用循环延时的方法在数码管上显示不同的数字。利用上次实验的程序,主函数修改如下:Main()int i;while(1) P1=0x01; /P10=1,左侧数码管显示 P2=tab2; /显示数字2 Delay(2); /延时 P1=0x02; /P11=1,右侧数码管显示 P2=t

20、ab3;/显示数字3 Delay(2);该程序在上方的数码管上显示23,如图:2)4组数码管显示不同数字。将上述程序中的显示语句复制,增加其他数码管控制端的语句,即可在其他数码管上显示。如:While(1)for(i=0;i<8;i+) P1=1<<i; P2=tabi; delay(2); 该程序在8各数码管上分别显示数字0-7,运行效果如下:3)利用定时中断实现动态显示int LED_SEG=1;char li=0;void timer0_2ms() interrupt 1TH0=0xf8; TL0=0x30; /Initial value=65535-10000=555

21、35,10ms in 12MHz TF0=0;P1 = 1<<li;P2=tabli; if(+li>7)li=0;main() TMOD=0x01;/16 bits,internal pulse countingTH0=0xf8; TL0=0x30; /Initial value=65535-2000=63536,2ms in 12MHz TF0=0; TR0=1; /start Timer 0 IE = 0x82; while(1); 该程序利用2ms中断处理程序,每隔2ms显示1位数字,利用中断可以不停刷新8个数码管。主程序可以安排其他任务。1.4.5 练习 修改程序,

22、增加一个函数disp(char seg,char data),用于在指定的某组数码管上显示2位十进制数字data。1.5 简单交通灯控制系统的设计1.5.1 实验目的 练习单片机控制程序的设计,掌握以中断处理程序为主的软件设计方法1.5.2 实验要求 在实验1.4的基础上,增加四个方向的红黄绿指示灯。按十字路口交通灯的控制要求,实现固定时间间隔的交通灯控制。1.5.3 程序设计一、程序实现的主要功能:(1)数码管的动态显示数码管的动态显示需要定期刷新才能保证显示的正确性。该功能可以放在定时中断处理程序中实现。实现的思路如下:定义显示缓冲区,存放4组数码管上显示的2位数:unsigned cha

23、r dispbuf8;volatile unsigned char li=0;利用定时中断处理程序刷新显示:void timer0_2ms() interrupt 1TH0=0xf8; TL0=0x30; /Initial value=65535-2000=63535,2ms in 12MHz TF0=0;P1 = 1<<li;P2=tabdispbufli; if(+li>7)li=0;再定义函数disp(char seg,char data),用于修改显示缓冲区,在指定的某组数码管上显示2位十进制数字data。Void disp(char seg,char data)Di

24、spbufseg * 2 = data % 10; /个位数 Dispbufseg * 2 + 1 = data /10;/十位数(2)倒计时及红绿灯的转换该部分功能可以放在定时中断中完成,也可以放在主程序中完成。下面例子是用主程序实现:定义计时变量:int tcount=500;/用于计时1S bit SecFlag=0;在定时中断程序中进行计时判断:if(-tcount = 0) SecFlag = 1; tcount = 500;在主程序中进行秒计时处理main() While(1) If(SecFlag) /1S时间到 SecFlag=0; 进行4个方向的通行时间到计时;判断并切换红黄

25、绿灯;调用disp函数修改时间显示等 IDL=1;/让单片机处于空闲状态,本语句可选 1.5.4 练习将每个方向的通行时间设为变量,编写函数SetTrafficTime(char dir,char t)。1.6 单片机串行通讯接口实验1.6.1 实验目的 学习单片机串行通讯的使用,掌握以中断方式来处理串行通讯1.6.2 实验要求 在实验1.5的基础上,利用串行通讯,实现交通灯控制系统的远程设置。允许通过串口设定各方向的通行时间及红黄绿指示灯的控制方式。1.6.3 实验原理8051单片机内部集成了1路UART接口,用于实现串行通讯。如果需要实现自定义波特率的串行通讯,需要使用定时器1来产生波特率

26、。(1) 首先,设置定时器1的工作模式及初始值TMOD = 0x21; /*-T1:Mode 2;T0:Mode 1*/*Baud Rate=(T1 overflow rate)* 2SMOD/32T1 overflow rate=(fosc/12)/(256-TH1)So if Baud rate is 1200bps, TH1 will be(fosc=11.0592MHz)256-TH1=(11059200/12)/(1200*32)TH1=232=E8(Hex)*/ TH1=0xe8;/0xfd; TL1=0xe8;/1200bps/0xfd;/*9600bps*/ TR1=1; /S

27、tart timer1 to generate BAUD rate pulse(2) 设置串行通讯格式: SCON = 0x50; /Mode 1, T1=baud(3) 允许串行通讯中断IE = 0x90;/EA=1;ES=1;(4) 编写串行通讯中断处理程序void uart_int() interrupt 4unsigned char c; if(RI) /接收中断 /数据接收及处理 Else /发送中断,无任何处理 TI =0; 1.6.4 通讯协议实现串行通讯的双方要遵从同样的协议,以便进行数据的定义及处理。在仪器仪表中,经常使用Modbus协议,也可以使用自定义协议。有关Modbu

28、s协议请参考相关资料。为简化程序,在此使用自定义协议:协议数据包由5个ASCII字符组成:B0:首字符,表示方向,用字母N、S、E、W分别表示North、South、East和West四个方向。B1:大写字母R表示红灯时间,G表示绿灯时间。黄灯时间固定为3秒。B2-B4:十进制ASCII码表示的3位数时间,B2存放百位数,B3十位数,B4个位数如设置方向北的红灯时间为123秒,协议包为:NR123unsigned char RcvBuf8; /接收缓冲区unsigned char RcvNum=0; /接收到的字符个数 /协议包的接收与处理void uart_int() interrupt 4

29、unsigned char c; if(RI) /接收中断 RI = 0; c = SBUF;If( (c=N) | (c=S) | (c=E) | (c=W) /首字符 RcvBuf0=c; RcvNum=1;Else if(RcvNum)/接收后续字符 RcvBufRcvNum+=c; If(RcvNum>=5)/接收到完整的数据包 /数据包的处理,修改对应方向的时间变量 Else /发送中断,无任何处理 TI =0; 1.6.4 实验步骤(1)打开Proteus软件,打开上个实验项目。(2)添加虚拟终端器件:终端的TxDRxD分别与单片机的RxDTxD引脚对接(3)利用Keil,修

30、改源程序,增加串行通讯功能。1.7 单片机课程设计1.7.1 课程设计要求(1)设计一个完整的单片机应用系统。具体应用可以是交通灯控制系统,也可以是自选题目(需与老师商量)。(2)要求首先确定系统的功能,即进行需求分析,形成系统需求分析说明书。(3)完成系统的硬件设计:用Proteus实现硬件电路原理图的设计。(4)完成配套软件的设计:用Keil C51开发程序,并能在Proteus中仿真运行。1.7.2 提交 (1)文档:系统的需求分析说明书及相关设计文档。 (2)软硬件设计资料:电路图和源程序。上述内容打包,文件名为“学号姓名.rar”进行提交。第2章 ARM程序设计实验本章实验内容是针对

31、ARM裸机芯片进行编程。在ARM上编写程序,可以使用ARM汇编语言、C语言或C+语言进行编程,也可以三者混合编程。所用开发工具可以使用ADS、Keil或其它与ARM芯片配套提供的专用开发工具。本章实验均以Keil公司的uVision 4.0以上版本实现。2.1 ARM混合编程实验2.1.1 实验目的(1)学会ARM编程所使用的汇编语言和C语言,掌握这两种语言混合编程的方法。(2)熟悉在uVision开发环境中ARM程序的设计步骤。(3)学习ARM处理器的7种工作模式及切换。2.1.2 实验要求创建一个新的ARM项目,使用uVision中的默认启动代码Startup.S。在启动代码的基础上,增加

32、C语言程序及其他汇编语言程序,实现汇编与C之间的混合编程。2.1.3 实验原理(1)C语言内嵌汇编的方法n 内嵌汇编n 在C和C语言中嵌入汇编语言可以实现一些高级语言中没有的功能。在Keil中,可以采用如下语法实现汇编的嵌入void my_strcpy (char *dst, const char *src) int ch; _asm loop: LDRB ch, src, #1 STRB ch, dst, #1 CMP ch, #0 BNE loop (2) C语言中调用汇编程序首先需要在C语言中声明将要调用的汇编子程序的名称及参数,如下所示的extern void strcopy(char

33、 *d, const char *s);#include <stdio.h>extern void strcopy(char *d, const char *s);int main() const char *srcstr = "First string - source" char dststr = "Second string - destination" printf("Before copying:n"); printf(" '%s'n '%s'n",srcstr

34、,dststr); strcopy(dststr,srcstr); printf("After copying:n"); printf(" '%s'n '%s'n",srcstr,dststr); return 0; C语言与汇编语言参数的传递符合ATPCS标准,即函数前4个参数通过R0R3来传递,其它参数通过堆栈(FD)传递。 汇编语言程序需要将子过程名export出去,以便C语言程序可以引用。 AREA SCopy, CODE, READONLY EXPORT strcopystrcopy ; r0 points to

35、 destination string ; r1 points to source string LDRB r2, r1,#1 ; load byte and update address STRB r2, r0,#1 ; store byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; keep going if not MOV pc,lr ; Return END(3) 汇编语言调用C语言汇编程序的设计要遵循ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用IMPORT伪操作声明将

36、要调用c程序。下面是一个汇编程序调用c程序的例子。其中在汇编程序中设置好各参数的值。本例中有5个参数,分别使用寄存器R0存放第一个参数,R1存放第2个参数,R2存放第3个参数,R3存放第4个参数,第5个参数利用数据栈传送。由于利用数据栈传递参数,在程序调用结束后要调用数据栈指针。/c程序g()返回5个整数的和int g(int a, int b, int c, int d, int e)return a + b + c + d + e;汇编程序调用c程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i的和EXPORT fAREA f, CODE, READONLYIMPORT g

37、;使用伪操作数IMPORT声明c程序g()STR lr, sp,#-4! ;保存返回地址ADD r1, r0, r0 ;假设进入程序f时,r0中的值为i,r1值设为2*iADD r2, r1, r0 ;r2的值设为3*iADD r3, r1, r2 ;r3的值设为5*iSTR r3, sp, #-4! ;第五个参数5*i通过数据栈传递ADD r3, r1, r1 ;r4值设为4*iBL g ;调用c程序g()ADD sp, sp, #4 ;调整数据栈指针,准备返回LDR pc, sp, #4 ;返回END注意:在Keil中,汇编调用C语言时,必须加关键词PRESERVE8,编译才能通过。通常在

38、汇编代码之前加该关键词。(请自行参考Startup.S中的用法)2.1.4 实验内容(1)创建ARM工程,选用默认的Startup.S。(2)编写C语言的main函数,并加入项目中。(3)练习C语言内嵌汇编的方法,并单步执行程序,观察内嵌汇编的执行。(4)编写汇编语言子程序,供C语言调用。(5)用C语言编写一段ARM目标板的初始化函数,命名为:void TargetResetInit(void)函数体可以为空。在Startup.S中调用该函数。要在调用main()函数之前进行调用。2.2 ARM的GPIO接口实验2.2.1 实验目的(1)掌握ARM芯片的接口控制原理。(2)掌握ARM芯片的GP

39、IO接口编程方法。(3)学习其他接口的使用方法。2.2.2 实验要求(1)利用ARM的GPIO口,实现流水灯的功能。2.2.3 实验原理(1)LPC2138是NXP公司生产的ARM7芯片。该芯片可以提供多达47个GPIO引脚。在这些引脚使用前,首先要确定各引脚的功能:PINSEL0端口寄存器可以设定P0.0-15引脚的功能;PINSEL1确定P0.16-31引脚的功能。具体如下表:如要设定P0.0-31均作为GPIO引脚使用,则:PINSEL0 = 0;PINSEL1 = 0;(2)各GPIO引脚传输方向的确定:通过IODIR寄存器来设置各引脚的方向。对应位为1,做输出;否则为输入。如设置P0

40、.0-7引脚为GPIO输出引脚,则:IODIR = 0x000000ff;(3)控制各输出引脚的高低电平: IOSET寄存器用于设置对应引脚为高电平,IOCLR设置引脚为低电平。只有置1的位受影响,置0的位不受影响。如:IOSET = 0x00000005; /P0.2和P0.0引脚置为高电平,其他引脚保持不变IOCLR = 0x00000005; /P0.2和P0.0引脚置为低电平,其他引脚保持不变2.2.4 实验步骤(1)在Protues中,画电路图,利用LPC2138的P0.0-7引脚,连接8个LED灯,如图:(2)在Keil uVision4中,创建工程,加载LPC2138的Start

41、up.S(3)编写C语言程序,实现流水灯的功能。延时可采用循环延时的方法。2.2.5 练习 利用P0.8-P0.15连接8个按键,用于控制8个灯的亮灭。按键按下一次,则灯的状态取反。2.3 ARM的AD接口实验2.3.1 实验目的(1)掌握ARM芯片的AD接口编程方法。(2)掌握ARM芯片的UART接口的使用。2.3.2 实验要求实验A/D数据采集,并通过UART接口将结果传送出来,在虚拟终端中显示。2.3.3 实验原理LPC2138芯片内部提供2个10位A/D转换器,每个A/D转换器可有8个通道进行切换。对应的管脚名称为AD0.0-7和AD1.0-7。A/D 转换器的基本时钟由VPB 时钟提

42、供。每个转换器包含一个可编程分频器,可将时钟调整至逐步逼近转换所需的4.5MHz(最大)。完全满足精度要求的转换需要11 个这样的时钟。注:当使用A/D 转换器时,模拟输入管脚的信号电平在任何时候都不能大于V3.3,否则,读出的A/D 值无效。与A/D转换器相关的寄存器有3个:操作程序如下:PINSEL1 = 0x01400000;/ 设置P0.27、P0.28连接到AIN0、AIN1/* 进行ADC模块设置,其中x<<n表示第n位设置为x(若x超过一位,则向高位顺延) */AD0CR = (1 << 0) |/ SEL = 1 ,选择AD0.0 (Fpclk / 10

43、00000 - 1) << 8) | / CLKDIV = Fpclk / 1000000 - 1 ,即转换时钟为1MHz (0 << 16) |/ BURST = 0 ,软件控制转换操作 (0 << 17) | / CLKS = 0 ,使用11clock转换 (1 << 21) | / PDN = 1 , 正常工作模式(非掉电转换模式) (0 << 22) | / TEST1:0 = 00 ,正常工作模式(非测试模式) (1 << 24) | / START = 1 ,直接启动ADC转换 (0 << 27);

44、/ EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换) DelayNS(10); ADC_Data = AD0DR;/ 读取ADC结果,并清除DONE标志位 while(1) AD0CR = (AD0CR&0x00FFFF00)|0x01|(1 << 24);/ 设置AD0.0,并进行第一次转换 while( (AD0DR&0x80000000)=0 ); / 等待转换结束 AD0CR = AD0CR | (1 << 24);/ 再次启运转换 while( (AD0DR&0x80000000)=0 ); / 等待转换结束 ADC_Dat

45、a = AD0DR;/ 读取ADC结果 ADC_Data = (ADC_Data>>6) & 0x3FF; / 提取AD转换值 ADC_Data = ADC_Data * 3300/1024; / 数值转换 printf("AD0.0=%d mV rn", ADC_Data); / 数据串行口输出 DelayNS(100); AD0CR = (AD0CR&0x00FFFF00)|0x02|(1 << 24);/ 设置AD0.1,并进行第一次转换 while( (AD0DR&0x80000000)=0 ); / 等待转换结束 A

46、D0CR = AD0CR | (1 << 24);/ 再次启运转换 while( (AD0DR&0x80000000)=0 ); / 等待转换结束 ADC_Data = AD0DR;/ 读取ADC结果 ADC_Data = (ADC_Data>>6) & 0x3FF; / 提取AD转换值 ADC_Data = ADC_Data * 3300/1024; / 数值转换 printf("AD0.1=%d mV rrn", ADC_Data); / 数据通过串行口输出 DelayNS(100);2.3.4 实验步骤(1)打开Protues,

47、设计电路图,如下:(2)进入Keil uVision4,创建LPC2138的工程项目.第3章 嵌入式操作系统uC/OS-II实验3.1 基于uC/OS-II的多任务编程实验3.1.1 实验目的(1)了解uC/OS-II的多任务调度方法。(2)学习基于uC/OS-II的多任务编程方法。(3)掌握基于uC/OS-II的应用开发。3.1.2 实验要求基于uC/OS-II编写两个任务,任务1实现流水灯的功能,任务2实现计数器的功能。3.1.3 实验原理(1)uC/OS-II的任务调度方式uC/OS-II是一款精巧的嵌入式操作系统,它仅提供了存储管理与任务管理功能,实现了多任务的操作系统内核。uC/OS

48、-II采用占先式任务调度策略:即总是选择优先级最高的任务运行。在uC/OS-II中允许最多64任务存在,包括8个系统任务。每个任务的优先级编号是唯一的。(2)uC/OS-II的使用方法uC/OS-II不是一个可独立运行的操作系统,它仅提供了一个操作系统的底层函数包。应用程序与该函数包共同编译,生成一个可执行程序。因此,整个项目的主函数是由用户程序提供的。在主函数中,首先调用OSInit()函数初始化uC/OS-II操作系统,然后调用OSTaskCreate()函数创建用户任务;最后使用OSStart()函数启动操作系统,进入任务调度过程。下面是常见的主函数结构:int main (void)

49、OSInit(); OSTaskCreate(Main_Task, (void *)0, &Main_TaskStkTASK_STK_SIZE - 1, 0); OSStart(); return 0;(3)uC/OS-II下的任务编写必须为uC/OS-II下的每个任务分配独立的栈空间,分配唯一的任务号。#define TASK_STK_SIZE 64OS_STK Main_TaskStkTASK_STK_SIZE; /任务栈,栈的大小可根据具体任务的情况调整任务对应的代码通常为一个函数,其结构如下:void Task0(void *pdata) uint16 temp; pdata=

50、pdata; temp=0; for(;)。 OSTimeDly(OS_TICKS_PER_SEC/50);OSTaskResume(0);3.1.4 实验步骤(1)本实验使用ADS V1.2开发环境和Protues 7.5.注意:部分实验室电脑的ADS出现License的问题,原因在于机器的日期不对。(2)参考学习两个独立的实例:Ledsip和Counter,学习uC/OS-II工程项目的架构。(3)将两个实例的电路图合并为一个,如下图所示:在合并时,注意有些器件的名称是重叠的,需要修改。(4) 在ADS中,修改main.c文件,将另一个实例中的任务相关代码复制过来,并创建该任务。(5) 编

51、译程序。注意要生成HEX文件。配置界面如下:3.1.5 思考题(1)调整两个任务的优先级,看有什么区别?(2)调整任务内的OSTimeDly(t);的参数,实验一下最小为多少?去掉该函数会有什么效果?再调整一下任务优先级,效果是否一样?3.1.6 练习利用计数器的计数值,作为流水灯的流动速度。这样实现手工调节流水灯速度。提示:本要求需要在两个任务间实现数据共享。本题目仅要求一个任务修改数据,另一个任务读取使用数据,因此不存在共享冲突。如果两个任务都修改同一个变量,则存在共享冲突,需要使用加锁或信号量方式避免冲突。第4章 嵌入式Linux实验4.1 嵌入式Linux交叉开发环境的搭建4.1.1 实验目的(1)学会嵌入式Linux交叉开发环境的搭建.(2)掌握交叉编译工具的使用.4.1.2 实验要求(1)在VMWare虚拟机中,安装宿主机上的Ubuntu操作系统.(2)在Ubuntu系统下安装交叉编译工具链 arm-linux-gcc-x.x.x(3)安装Bootloader、Linux内核的源码,并完成对这些源码的编译,生成可安装的Bootloader和Linux内核。(4)安装QT开发环境,安装QT Creator,及QT的函数库,并完成编译安装。(5)编写简单的Hello worl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论