嵌入式实验指导书.docx
《嵌入式实验指导书.docx》由会员分享,可在线阅读,更多相关《嵌入式实验指导书.docx(80页珍藏版)》请在冰豆网上搜索。
嵌入式实验指导书
嵌入式系统设计
实验指导书
目录
实验一、ARMSDT2.5开发环境3
实验二:
开发基本的嵌入式应用程序12
实验三、ARM的串行口实验17
实验四、键盘及LED驱动实验26
实验五、LCD与触摸屏程序设计34
实验六、C/OS-II在ARM微处理器上的移植42
实验七、系统的消息循环51
实验八、文件的使用54
实验九、多任务和系统时钟56
实验十 UDP通讯实验59
实验十一、综合实验68
实验十二、模拟电子画板实验--触摸屏应用71
实验十三、基于ARM的多通道仪表信号采集实验--多任务与A/D转换73
实验一、ARMSDT2.5开发环境
一、实验目的
熟悉ARMSDT2.5开发环境,学会ARM并行口仿真器的使用。
使用SDT编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
二、实验内容
本次实验使用ARMSDT2.5集成开发环境。
新建一个基于操作系统的工程文件,并编译这个工程文件。
学习ARM并行口仿真器的使用和开发环境的设置。
下载已经编译好的文件到嵌入式控制器中运行。
学会在程序中设置断点,观察系统内存和变量,为调试应用程序打下基础。
三、预备知识
C语言的基础知识、程序调试的基础知识和方法。
四、实验设备及工具(包括软件调试工具)
硬件:
ARM嵌入式开发板、ARM7TDMI的JTAG仿真器、PC机Pentium100以上。
软件:
ARMSDT2.51集成开发环境、仿真器驱动程序。
五、实验步骤
1)建立工程
(1)运行ARMSDT2.5集成开发环境(ARMProjectManager)。
选择File|New菜单,在对话框中选择Project,如图1-1所示,新建一个工程文件(work1.apj)。
图1-1新建一个工程文件
(2)在新建的工程中,如图1-2所示,选中工程树的“根部”。
使用菜单Project|ToolConfigurationforwork1.apj|=armasm|Set,对整个工程的汇编进行设置。
图1-2对整个工程的汇编进行设置
(3)因为开发板上的嵌入式处理器ARM7TDMI没有浮点处理器,所以,如图1-3所示,在弹出的对话框中设置FloatingPointProcessor为none,并保持其他的设置不变。
图1-3设置FloatingPointProcessor为none
(4)选中工程树的“根部”,通过菜单Project|ToolConfigurationforwork1.apj|asmlink|Set,对整个工程的连接方式进行设置。
(5)在弹出的对话框中,选中EntryandBase标签,如图1-4所示,设置连接的Read-Only(只读)和Read-Write(读写)地址。
地址0x0c080000是开发板上SDRAM的真实地址,是由系统的硬件决定的;0x0c200000指的是系统可读写的内存地址。
也就是说,在0x0c0800000xC1fffff之间是只读区域,存放程序的代码段,在0xC200000开始是程序的数据段。
图1-4设置连接的地址
提示:
用户可以修改这两个数值来决定程序存储区的大小,和数据存储区的大小。
其和应为8M,地址范围0xc000000~0xc7fffff。
(6)选择LinkerConfiguration的ImageLayout标签,如图1-5所示,设置程序的入口模块。
指定在生成的代码中,程序是从44binit.s开始运行的。
图1-5设置程序的入口模块
(7)选择Project|EditProjectTamplete菜单,使用New按钮,为编译器新建一个步骤,如图1-6所示,取名为RomImage。
图1-6为编译器新建一个步骤
(8)按照如图1-7的内容设置RomImage的内容。
使编译器编译的时候可以生成system.bin文件,这就是系统的启动文件。
图1-7设置RomImage的内容
(9)选择Project|EditVariablesforwork1.apj,将build_target变量设为system.bin,使编译器编译的时候可以生成system.bin文件,这就是系统的启动文件。
如图1-8所示。
图1-8设置build_target变量
(10)回到ProjectTemplateEditor对话框中,单击EditDetail按钮,在弹出的对话框中可以重新命名模板,如图1-9所示。
图1-9重新命名模板
(11)选中工程树中DebugRel子树,用Delete键删除。
提示:
在系统工程树中Debug子树是下面生成的。
应用程序的调试版本,在生成的目标代码中,包含了系统的调试信息.Release子树是应用程序的发行版本,生成的代码中不包括调试信息,而且编译器还针对速度和代码的大小进行优化。
DebugRel子树是一个折衷版本,通常用不到,所以,在这里删除。
(12)至此,工程文件设置完毕。
因为设置过程比较繁琐,可以保存此工程,下次新建项目的时候复制即可。
提示:
可以使用File|SaveasTemplate菜单把当前工程的设置保存为模板,如armRom.apj文件。
把此文件复制到ARMSDT编译器的\ARM251\Template目录下,以后创建工程的时候,就可以直接选择使用此模板了。
模板文件也是一个工程文件(*.apj),但是,模板文件中不包括工程文件的信息,只有编译器环境的设置。
(13)把光盘中exp\res\exp目录下的\Startup和\INC、\Lib、\SRC、\UCOS-II目录复制到work1的目录下。
如图1-10所示,选中工程树中Debug子树的Sources选项。
通过菜单Project|AddFilestoSources,把\STARTUP和\SRC、\UCOS-II目录下的*.s和*.c文件加入到工程中。
图1-10加入工程的原文件
(14)选中工程树中Debug子树的IncludedFiles选项。
通过菜单Project|AddFilestoIncludedFiles,把\STARTUP和\INC、\UCOS-II目录下的所有*.h文件都加入工程中。
(15)选中工程树中Debug子树的Libraries选项。
通过菜单Project|AddFilestoLibraries,把\Lib目录下的所有*.ALF文件都加入工程中。
(16)双击工程树中Debug子树的Sources选项中的main.c,打开main.c文件,如图1-11所示。
图1-11打开main.c文件
(17)在voidMain_Task(void*Id)函数中填入以下源码:
voidMain_Task(void*Id)//Main_Test_Task
{
POSMSGpMsg;//消息定义
LCD_ChangeMode(DspTxtMode);//转换LCD显示模式为文本显示模式
LCD_Cls();//文本模式下清屏命令
LCD_printf("Hellowworld!
\n");//向液晶屏输出
Uart_Printf("Hellowworld!
\n");//向串口输出
//消息循环
for(;;)
{//死循环
OSTimeDly(200);//主任务挂起200毫秒
}
}
注意:
如果用户开发的是基于ucos的程序,我们推荐使用我们exp例子进行开发,这样可以省去开发环境的设置,而且使用我们给出的程序框架可以很方便的进行程序开发。
2)进行程序的在线仿真、调试
(1)回到ARMProjectManager,选中工程树中Debug子树,通过Project|Buildwork1.apj“Debug”菜单(或者工具栏中的相应按钮)编译整个工程。
(2)把ARM的JTAG仿真器连接到PC机的并行口和开发板上,打开开发板的电源,运行仿真器的驱动程序UarmJTAG.exe。
(3)使用Project|Debugwork1.apj“Debug”菜单(或者工具栏中的相应按钮)启动ARMDebugger软件调试程序。
(4)在ARMDebugger中,通过Options|ConfigureDebugger菜单设置仿真器。
如图1-12所示,在弹出的对话框中,设置TargetEnvironment为Remote_A。
图1-12设置仿真器
(5)单击Configure按钮,按照如图1-13所示,设置仿真器。
图1-13设置仿真器
(6)出现下面提示信息以后,请先按开发板复位按钮,然后点YES,ARMDebbuger开始通过仿真器装载程序,如图1-14所示。
图1-14装载程序
注意:
a.装载程序前,需要按一下开发板的复位键。
b.第(4)、(5)步设置好后,以后再调试的时候直接进行到第(6)步,不需要再设置。
当不能进行第(6)步时,重复第(4)、(5)。
(7)装载完毕以后,通过Execute|Go菜单(或者工具栏中的相应按钮)运行程序。
(8)程序运行的时候,可以使用Execute|Stop菜单(或者工具栏中的相应按钮)暂停运行程序。
如图1-15所示,在Execute窗口中将显示出程序暂停的位置。
图1-15显示出程序暂停的位置
(9)通过Execute|Step菜单(或者工具栏中的相应按钮)可以单步运行程序。
也可以使用StepIn、StepOut菜单命令进入或者跳出函数的调用。
(10)在程序停止运行的时候,选择View|SourceFiles菜单命令,可以打开如图1-16所示的源程序例表窗口,双击列表中的文件名可以查看相应的源文件。
图1-16查看源文件
注意:
查看源文件时,有时可能会出现看不到自己的原文件的情况,这是将工程重新强制编译一下。
(11)在源文件列表中打开main.c文件。
选择源文件中的某一行,右击鼠标,如图1-17所示,用ToggleBreakpoint快捷菜单命令可以设置断点,使程序运行到这里停下来。
图1-17设置断点
(12)使用在View菜单下的Registers、Variables和Memory命令可以查看工作寄存器或者内存变量。
读者可以逐一地尝试,为以后调试程序打下基础。
实验二:
开发基本的嵌入式应用程序
一、实验目的
读懂main.c文件中调用的函数,了解uCOS-II系统的启动过程。
学会使用API函数,掌握Uart_Printf和LCD_printf函数的用法。
二、实验内容
熟悉基于uCOS-II扩展的嵌入式操作系统的启动和应用程序的结构。
阅读main.c文件中调用的函数,了解uCOS-II操作系统系统的启动过程。
在操作系统的基础上,编写一段程序,在屏幕上显示“Helloworld”等文本。
三、预备知识
用ARMSDT2.5集成开发环境,编写和调试程序的基本过程
四、实验设备及工具(包括软件调试工具)
硬件:
ARM嵌入式开发板、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以上
软件:
PC机操作系统win98、Win2000或WinXP、ARMSDT2.51集成开发环境、仿真器驱动程序、超级终端通讯程序
五、实验步骤
1、在ARMSDT2.51中,打开实验一中创建好的模板,新建一个项目work1。
把操作系统的所需要的头文件(*.h)和库文件(*.alf)加入工程中。
2、打开Main.c文件。
3、重点分析Main函数中的代码,了解系统的启动过程。
Main函数的代码如下:
intMain(intargc,char**argv)
{
ARMTargetInit();//开发板初始化
OSInit();//操作系统初始化
uHALr_ResetMMU();//复位MMU
LCD_Init();//初始化LCD模块
LCD_printf("LCDinitializationisOK\n");//向液晶屏输出数据
LCD_printf("320x240TextMode\n");
initOSGUI();//初始化图形界面
LoadFont();//调Unicode字库
LoadConfigSys();//使用config.sys文件配置系统设置
LCD_printf("CreatetaskonuCOS-II...\n");
OSTaskCreate(Main_Task,(void*)0,(OS_STK*)&Main_Stack[STACKSIZE*8-1],Main_Task_Prio);//创建系统任务
OSAddTask_Init();//创建系统附加任务
LCD_printf("StartinguCOS-II...\n");
LCD_printf("Enteringgraphmode...\n");
LCD_ChangeMode(DspGraMode);//变LCD显示模式为文本模式
InitRtc();//初始化系统时钟
Nand_Rw_Sem=OSSemCreate
(1);//创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//
OSStart();//操作系统任务调度开始
//不会执行到这里
return0;
}
通常多操作系统中的任务是一个无限循环,同样,Main_Task也要陷入一个无限循环。
因为uCOS-II是占先式多任务操作系统,如果没有比Main_Task任务更高优先级的任务进入就绪状态,Main_Task任务是不会放弃CPU的控制权的。
通过调用OSTimeDly(INT16Uticks)函数,可以使操作系统进行一次任务调度,并且执行下一个优先级最高的就绪状态的任务。
参数Ticks表示任务延时的节拍数,一旦规定的时间期满,该任务马上又会从新进入就绪状态。
分析上述上面代码中OSTimeDly(200)的作用。
5、为在液晶屏幕和终端(串行口)上输出字符串(比如:
Helloworld!
)编写程序。
可以分别使用LCD_printf()和Uart_Printf()函数。
提示:
因为操作系统默认的液晶显示摸式是图形状态,必须通过LCD_ChangeMode函数设置液晶显示为文本摸式。
建议在显示自己的文本的时候先调用LCD_Cls()函数清除屏幕。
6、编译并调试程序。
7、运行Windows系统下的超级终端(HyperTerminal)应用程序,如图2-1所示新建一个终端通信,取名为arm。
单击“确定”按钮。
图2-1创建超级终端
8、选择终端的连接的串口(如串行口1),如图2-2所示,设置通信的格式和协议。
图2-2设置串行口
9、设置完成超级终端以后,打开开发板,按住开发板上的任意一键,使开发板进入BIOS设置状态。
如图2-3所示。
图2-3系统的BIOS设置程序
10、按PC键盘的U键(要使超级终端处于活动状态),这时超级终端上会显示如图2-4所示的信息。
图2-4进入U盘状态
11、这时,在“我的电脑”中可以发现多了一个“可移动磁盘”,这就是开发板的海量存储器16M非线性Flash。
开发板就像一个U盘,可以通过“我的电脑进行操作”。
把生成的system.bin文件通过USB下载到嵌入式开发板中,复位系统,运行并检查输出结果。
提示:
system.bin文件是系统通过BIOS引导以后,装入内存中运行的默认文件名。
实验三、ARM的串行口实验
一、实验目的
1.掌握ARM的串行口工作原理。
2.学习编程实现ARM的UART通讯。
3.掌握CPU利用串口通讯的方法。
二、实验内容
学习串行通讯原理,了解串行通讯控制器,阅读ARM芯片文档,掌握ARM的UART相关寄存器的功能,熟悉ARM系统硬件的UART相关接口。
编程实现ARM和计算机实现串行通讯:
ARM监视串行口,将接收到的字符再发送给串口(计算机与开发板是通过超级终端通讯的),即按PC键盘通过超级终端发送数据,开发板将接收到的数据再返送给PC,在超级终端上显示。
三、预备知识
1、用ARMSDT2.5集成开发环境,编写和调试程序的基本过程。
2、ARM应用程序的框架结构。
3、了解串行总线
四、实验设备及工具
硬件:
ARM嵌入式开发板、用于ARM7TDMI的JTAG仿真器、PC机Pentium100以
上、串口线
软件:
PC机操作系统win98、Win2000或WinXP、ARMSDT2.51集成开发环境、仿真器驱动程序、超级终端通讯程序
五、实验原理及说明
1.异步串行I/O
异步串行方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图3-1串行通信字符格式
图3-1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
每一个数据位的宽度等于传送波特率的倒数。
微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:
1)奇偶错:
在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
2)帧格式错:
一个字符从起始位到停止位的总位数不对。
3)溢出错:
若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
2.串行接口的物理层标准
通用的串行I/O接口有许多种,现仅就最常见的两种标准作简单介绍。
1)EIARS—232C
这是美国电子工业协会推荐的一种标准(ElectronicindustriesAssociationRecoil-mendedStandard)。
它在一种25针接插件(DB—25)上定义了串行通信的有关信号。
这个标准后来被世界各国所接受并使用到计算机的I/O接口中。
⑴ 信号连线
在实际异步串行通信中,并不要求用全部的RS—232C信号,许多PC/XT兼容机仅用15针接插件(DB—15)来引出其异步串行I/O信号,而PC中更是大量采用9针接插件(DB—9)来担当此任,因此这里也不打算就RS—232C的全部信号作详细解释。
图3-2给出两台微机利用RS—232C接口通信的联线(无MODEM),我们按DB—25的引脚号标注各个信号。
下面对图3-2中几个主要信号作简要说明。
保护地通信线两端所接设备的金属外壳通过此线相联。
当通信电缆使用屏蔽线时,常利用其外皮金属屏蔽网来实现。
由于各设备往往已通过电源线接通保护地,因此,通信线中不必重复接此地线(图中用虚线表示)。
例如使用9针插头(DB—9)的异步串行I/O接口就没有引出保护地信号。
TXD/RXD是一对数据线,TXD称发送数据输出,RXD称接收数据输入。
当两台微机以全双工方式直接通信(无MODEM方式)时,双方的这两根线应交叉联接(扭接)。
信号地所有的信号都要通过信号地线构成耦合回路。
通信线有以上三条(TXD、RXD和信号地)就能工作了。
其余信号主要用于双方设备通信过程中的联络(握手信号),而且有些信号仅用于和MODEM的联络。
若采取微型机对微型机直接通信,且双方可直接对异步串行通信电路芯片编程,若设置成不要任何联络信号,则其它线都可不接。
有时在通信线的同一端将相关信号短接以“自握手”方式满足联络要求。
这就是如图3-2(a)所示的情况。
图3-2实用RS-232C连线
RTS/CTS请求发送值号RTS是发送器输出的准备好信号。
接收方准备好后送回清除发送信号CTS后,发送数据开始进行,在同一端将这两个信号短接就意味着只要发送器准备好即可发送。
DCD载波检测(又称接收线路信号检测)。
本意是MODEM检测到线路中的载波信号后,通知终端准备接收数据的信号,在没有接MODEM的情况下,也可以和RTS、CTS短接。
相对于MODEM而言,微型机和终端机一样被称为数据终端DTE(DataTerminalEquipment)而MODEM被称为数据通信装置DCE(DataCommunicationsEquipment),DTE和DCE之间的连接不能像图3-2中有“扭接”现象,而应该是按接插件芯号,同名端对应相接。
此处介绍的RS—232C的信号名称及信号流向都是对DTE而言的。
DTR/DSR数据终端准备好时发DTR信号,在收到数据通信装置装备好DSR信号后,方可通信。
图3-2(a)中将这一对信号以“自握手”方式短接。
R1原意是在MODEM接收到电话交换机有效的拨号时,使RI有效,通知数据终端准备传送。
在无MODEM时也可和DTR相接。
图3-2(b)给出了无MODEM情况下,DTE对DTE异步串行通信线路的完整连接,它不仅适用于微型机和微型机之间的通信,还适用于微型机和异步串行外部设备(如终端机、绘图仪、数字化仪等)的连接。
⑵ 信号电平规定
RS—232C规定了双极性的信号逻辑电平:
-3V到-25V之间的电平表示逻辑“1”。
+3V到+25V之间的电平表示逻辑“0”。
因此这是一套负逻辑定义。
以上标准称为EIA电平。
PC/XT系列使用的信号电平是-12V和+12V,符合EIA标准,但在计算机内部流动的信号都是TTL电平,因此这中间需要用电平转换电路。
常用芯片MCl488或SN75150将TTL电平转换为EIA电平,MCl489或SN75154将EIA电平转换为TTL电平。
PC/XT系列以这种方式进行串行通信时,在波特率不高于9600的情况下,理论上通信线的长度限制纽为15米。
2)20mA电流环
20mA电流环并没有形成一套完整的标准,主要是将数字信号的表示方法不使用电子的高低,而改用20mA电流的有无:
“1”信号在环路中产生20mA电流;“0”信号无电流产生。
当然也需要有电路来实现TTL电平和20mA电流之间的转换。
图5.6.3是PC/XT微机中使用的一种20mA电流环接口。
当发送方SOUT=1时,便有20mA电流灌入接收方的光耦合器,于是光耦合器导通,使SIN=1。
反之当发送方SOUT=0时环路电流为零,接收方光耦合器截止,SIN=0。
显然,当要求双工方式通信时,双方都应各有收发电路