ARM工作原理实验指导书_第1页
ARM工作原理实验指导书_第2页
ARM工作原理实验指导书_第3页
ARM工作原理实验指导书_第4页
ARM工作原理实验指导书_第5页
已阅读5页,还剩62页未读, 继续免费阅读

下载本文档

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

文档简介

嵌入式系统原理实验指导书(Ver1.0)刘永平编写西安邮电大学2009-5-10目录实验一ARM集成开发工具——ADS练习 51.1实验目的 51.2实验设备 51.3实验内容 51.4实验预习要求 51.5实验步骤 51.6思考 19实验二汇编指令实验1 202.1实验目的 202.2实验设备 202.3实验内容 202.4实验预习要求 202.5实验步骤 212.6实验参考程序 232.7思考 24实验三汇编指令实验2 253.1实验目的 253.2实验设备 253.3实验内容 253.4实验预习要求 253.5实验步骤 263.6实验参考程序 273.7思考 30实验四GPIO控制实验 324.1实验目的 414.2实验设备 414.3实验内容 414.4实验原理 414.5实验硬件原理图 434.6实验预习 444.7实验过程 444.8实验参考程序 444.9思考 45实验五UART通信实验 485.1实验目的 485.2实验设备 485.3实验内容 485.4实验原理 495.5实验硬件原理图 495.6实验预习 505.7实验过程 505.8实验参考程序 515.9思考 61实验六中断实验 626.1实验目的 626.2实验设备 626.3实验内容 626.4实验原理 636.5实验硬件原理图 636.6实验预习 636.7实验过程 636.8实验参考程序 636.9思考 66总论本实验包含两部分,前面三个实验是ARM7指令系统指令实验,使用ADS的编译器和调试器进行仿真调试,主要目的是掌握ARM7的指令系统和开发工具的使用,理解ARMCPU的工作过程。后面三个实验是真实的ARM系统,硬件微控制器芯片为LPC2131(ARMCPU核+GPIO部件、UART0部件、UART1部件、Timer1、Timer2、VIC部件等),硬件电路板为广州周立功公司开发的EasyARM2131,学习配置ARM芯片内各模块部件,初步掌握简单嵌入式系统的构成原理和简单应用。开发软件为ADS,调试接口为硬件JTAG模块(仿真器)+JTAG驱动程序构成开发系统。这部分时需要查看LPC2131芯片的外部特性、内部模块原理和配置方法。实验一ARM集成开发工具——ADS练习1.1实验目的了解ADS1.2集成开发环境的使用方法1.2实验设备硬件:PC机一台软件:WindowsXP/2000系统,ADS1.2集成开发环境1.3实验内容在ADS环境下创建工程、编辑源文件、编译、链接、调试。(1)建立一个新的工程。(2)建立一个汇编文件,并添加到工程中。(3)设置文本编辑器支持中文。(4)设置编译链接控制选项。(5)编译链接工程。(6)调试工程。1.4实验预习要求仔细阅读文档《ADS集成开发环境及EasyJTAG-H仿真器应用》或《深入浅出ARM7——LPC213x/214x(上册)》书第二章的内容,了解ADS工具的组成(重要的软件功能模块——ARM汇编器、ARM的C/C++编译器、Thumb的C/C++编译器、ARM链接器、AXD调试器、ARMulator指令模拟器等)、ADS的各模块选项配置、工程编辑的内容。1.5实验步骤=1\*GB3①创建工程启动ADS1.2IDE集成开发环境,选择File-〉New,使用ARMExecutableImage工程模板建立一个工程,工程名为Project1,如图1.1所示。图1.1新建Project操作界面图1.2新建Project操作界面(2)=2\*GB3②添加源文件,编辑源代码选择File-〉New,建立一个新的汇编文件TEST1.S,设置直接添加到项目中,如图1.3所示。在该文件中输入汇编指令代码,并保存,如图1.5所示。图1.3新建File操作界面图1.4编辑源文件选择操作界面图1.5编辑源代码界面程序TEST1.S源代码(功能:计算两数的加法,被加数和加数分别放在R0、R1中,结果保存到R0中。)AREAEXAMPLE1,CODE,READONLY;声明代码段Example1 ENTRY;标识程序入口 CODE32;声明32位ARM指令STARTMOVR0,#15;设置参数MOVR1,#8ADDSR0,R0,R1;R0=R0+R1BSTARTEND在输入源代码的过程中,标号(此处如START)必须顶格输入,否则编译器不认,编译通不过。=3\*GB3③编辑选项配置由于ADS安装后默认字体是CourierNew,对于中文支持不完善,因此建议修改字体。选择Edit-〉Perferences,弹出如图1.7所示对话框。在Font选项设置字体为Fixedsys,Script为CHINESE_GB2312,由于Tab在不同文本编辑器解释不同,建议在TabInsertsSpaces前打勾,使Tab键插入的是多个空格。图1.6编辑选项配置界面图1.7编辑器字体和Tab选项配置界面图1.8编辑器字体和Tab选项配置界面(2)=4\*GB3④链接选项配置选择Edit-〉DebugRelSettings,在DebugRelSetting对话框的左边选择ARMLinker项,然后在Output页设置连接地址,如图1.10所示;在Options页设置调试入口地址,如图1.11所示。图1.9DebugRelSetttings选项配置界面图1.10ARMLinker链接地址配置界面图1.11Imageentrypoint地址配置界面=5\*GB3⑤编译链接工程选择Project-〉Make,将编译链接整个工程。若编译成功,如图1.12所示,Errors&Warnings对话框会报告编译错误为0,此时即可对工程进行仿真。图1.12MakeProject界面图1.13MakeProject报告界面=6\*GB3⑥调试工程选择Project-〉Debug,或者单击快捷键F5,IDE环境就会启动AXD调试软件,如图1.15所示。图1.14DebugProject界面断点调试方法:图1.15AXD调试界面图1.16AXD调试中设置断点选择界面图1.17AXD调试中断点设置成功界面图1.18AXD调试运行代码界面图1.19AXD调试运行到断点处界面以图1.16为例,首先设置断点,只需双击第6行(ADDSR0,R0,R1)的灰色区域即可,若出现红色实心圆点,则表示断点设置成功,然后选择Execute-〉Go全速运行,(从MOVR0,#15开始运行)可以发现程序运行停止在第6行(ADDSR0,R0,R1)。还有一种比较简单的调试方法就是用RuntoCursor命令,单击鼠标第8行灰色区域,若AXD将第8行点亮,则表示设置成功,然后选择ExecuteRuntoCursor运行到光标,可以发现程序停止在第8行。通过断点调试可以观察ARM寄存器的数值变化,如图1.20首先添加寄存器观察窗口,注意查看R0、R1、运行以后R0、R1的值,以十六进制和十进制两种方式观察。图1.20添加寄存器观察界面图1.21添加寄存器观察界面图1.22添加寄存器观察界面图1.23寄存器值界面(代码没有运行前)图1.24寄存器值界面(代码运行到第6行)图1.25寄存器值界面(代码运行到第7行)注意观察此时R0=R0+R1=15+8=23=0x17图1.26寄存器值界面(以十六进制显示)图1.27寄存器值界面(以十进制显示)1.6思考(1)工程模板有哪些作用?(提示:编译控制设置)(2)如何强行重新编译工程的所有文件?(提示:选择Project-〉RemoveObjectCode删除工程中的*.obj文件。)实验二汇编指令实验12.1实验目的了解ADS1.2集成开发环境及ARMulator软件仿真。掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序。掌握指令的条件执行以及使用LDR/STR指令完成存储器的访问。2.2实验设备硬件:PC机一台软件:WindowsXP/2000系统,ADS1.2集成开发环境2.3实验内容(1)在存储器地址为0x40003100上开辟一个计数器变量(COUNT),对其进行计数(每次加1),记到10后重新开始计数。C语言描述的伪算法为for(intcount=0;count<=10;count++)需要将存储器的值放到CPU寄存器中参与计算。具体算法为:使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果写回原地址;若结果大于或等于10,则把0写回原地址。ARM处理器是加载、存储体系结构的典型的RISC处理器,对存储器的访问只能使用加载和存储指令实现。LDR/STR指令用于对内存变量的访问,内存缓冲区数据的访问、查表、外围部件的控制操作等。(2)使用ADS软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegister)监视R0和R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。2.4实验预习要求(1)仔细阅读课本第3章的内容(2)仔细阅读文档《ADS集成开发环境及EasyJTAG-H仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的内容。(本实验使用软件仿真)2.5实验步骤=1\*GB3①创建工程启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Project2。=2\*GB3②添加源文件,编辑源代码建立汇编文件TEST2.S,输入源代码,参考源代码附后,然后添加到工程中。=3\*GB3③链接选项配置设置工程链接地址ROBase为0x40000000,RWBase为0x40003000。设置调试入口地址Imageentrypoint为0x40000000。=4\*GB3④编译链接工程选择Project--〉Debug,启动AXD进行软件仿真调试。=5\*GB3⑤调试工程打开寄存器窗口(ProcessorRegister),选择Current项监视R0和R1的值。打开存储器观察窗口(Memory)设置观察地址为0x40003100,显示方式Size为32Bit,监视0x40003100地址上的值。说明:在Memory窗口中右击空白处,在快捷菜单的Size项中可以选择显示格式为8Bit、16Bit或32Bit,如图2.2所示。图2.1查看Memory选择界面图2.2Memory数据显示方式选择界面可以单步运行程序(F10),如图2.3所示。可以设置/取消断点,或者全速运行程序,停止程序运行,调试时观察寄存器和0x40003100地址上的值。图2.3单步调试运行界面调试过程如图2.4所示。图2.4单步调试运行界面2.6实验参考程序汇编指令实验1的参考程序见程序清单2.2。程序清单2.2汇编指令实验1参考程序COUNTEQU0x40003100;定义一个变量,地址为0x40003100AREAExample2,CODE,READONLY;声明代码段Example2ENTRY;标识程序入口CODE32;声明32位ARM指令STARTLDRR1,=COUNT;加载COUNT变量的地址MOVR0,#0;R0=0;STRR0,[R1];将R0的值(0)存储到R1址址指向的存储单元,R0值不变,即设置COUNT为0LOOPLDRR1,=COUNTLDRR0,[R1];将R1指向的地址单元(COUNT)值装入R0ADDR0,R0,#1;R0加1保存到R0CMPR0,#10;R0和10比较,影响条件标志MOVHSR0,#0;若R0>=10,则此指令执行,R0=0,进行下一次循环STRR0,[R1];将R0的值保存到COUNT变量中BLOOP;循环END2.7思考(1)若使用LDRB/STRB代替程序清单中的所有加载存储指令(LDRSTR),程序还能正确执行吗?(2)LDR伪指令与LDR加载指令的功能和应用有哪些区别,举例说明?(提示:LDR伪指令的形式为“LDRRn,=expr”。)(3)LDR、STR指令的前索引偏移指令应如何编写?指令是怎样操作的?(4)在AXD调试时如何复位程序?(提示:选择File-〉ReloadCurrentImage重新加载映像文件。)实验三汇编指令实验23.1实验目的掌握ARM数据处理指令的使用方法了解掌握ARM指令灵活的第2操作数了解掌握ARM乘法指令的使用方法了解子程序编写及调用3.2实验设备硬件:PC机软件:Windows98、XP2000系统,ADS1.2集成开发环境3.3实验内容(1)使用MOV和MVN指令访问ARM通用寄存器。(2)使用ADD、SUB、AND、ORR、CMP和TST等指令完成数据加减运算及逻辑运算。(3)使用MOV和ADD指令实现:R8=R3=X+Y。(4)使用MOV、MVN和SUB指令实现:R5=0x5FFFFFF8–R88(5)使用CMP指令判断(5Y/2)>(2X),若大于,则R5=R5&0xFFFF0000,否则R5=R5|0x000000FF(6)使用TST指令测试R5的BIT23是否为1,若是则将BIT6位清0(使用BIC指令)(7)使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算的值。3.4实验预习要求(1)仔细阅读课本第3章的内容(2)仔细阅读文档《ADS集成开发环境及EasyJTAG-H仿真器应用》或其他相关资料,了解ADS工程编辑和AXD调试的内容。(本实验使用软件仿真)3.5实验步骤=1\*GB3①创建工程,添加源文件,编辑源代码启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Project3。建立汇编源文件TEST3.S,编写实验程序,然后添加到工程中。=2\*GB3②链接选项配置设置工程链接地址ROBase为0x40000000,RWBase0x40003000,设置调试入口地址Imageentrypoint为0x40000000。=3\*GB3③编译链接工程选择Project-〉Debug,启动AXD进行软件仿真调试。打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。=4\*GB3④调试工程单步运行程序,观察寄存器值的变化。R8=R3=X+Y,单步运行调试寄存器窗口如图3.1所示。图3.1单步调试运行界面R5=0x5FFFFFF8–R88,单步运行调试寄存器窗口如图3.2所示。图3.2单步调试运行界面3.6实验参考程序汇编指令实验2的参考程序见程序清单2.3。程序清单2.3汇编指令实验2参考程序XEQU11;定义X的值为11YEQU8;定义Y的值为8BIT23EQU(1<<23);定义BIT23的值为0x00800000AREAExample3,CODE,READONLY;声明代码段Example3ENTRY;标识程序入口CODE32;声明32位ARM指令START;使用MOV和ADD指令实现:R8=R3=X+YMOVR0,#X;X的值传入R0,X的值必须是8位图数据MOVR1,#Y;Y的值传入R0,Y的值必须是8位图数据ADDR3,R0,R1;R3=R0+R1=X+YMOVR8,R3;将R3的值传入R8;使用MOV、MVN和SUB指令实现:R5=0x5FFFFFF8–R88MVNR0,#0xA0000007;0xA0000007的反码为0x5FFFFFF8SUBR5,R0,R8,LSL#3;R8左移3位,结果即是R88;使用CMP指令判断(5Y/2)>(2X)吗?若大于,则R5=R5&0xFFFF0000,否则R5=R5|0x000000FFMOVR0,#YADDR0,R0,R0,LSL#2;计算R0=Y+4Y=5YMOVR0,R0,LSR#1;计算R0=5Y/2MOVR1,#XMOVR1,R1,LSL#1;计算R1=2XCMPR0,R1;比较R0和R1,即(5Y/2)>(2X)进行比较LDRHIR2,=0xFFFF0000;若(5Y/2)>(2X),则R2=0xFFFF0000ANDHIR5,R5,R2;若(5Y/2)>(2X),则R5=R5&R2ORRLSR5,R5,#0x000000ff;若(5Y/2)<=(2X),则R5=R5|0x000000ff;使用TST指令测试R5的BIT23是否为1,若是则将BIT6位清0(使用BIC指令)TSTR5,#BIT23BICNER5,R5,#0x00000040BSTARTEND汇编指令实验3的参考程序见程序清单2.4。功能:计算=XXXX,其中相乘的X的个数为n。先将X的值装入R0和R1,使用寄存器R2进行计数,循环n-1次R0=R0R1,运算结果保存在R0中。(不考虑结果溢出问题)注意:若n为0,则运算结果直接赋1;若n为1,则运算结果直接赋X。实验过程=1\*GB3①建立工程,编辑源文件启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Project4建立汇编源文件TEST4.S,编写实验程序,然后添加到工程中。=2\*GB3②编译链接工程配置工程链接地址ROBase为0x40000000,RWBase为0x40003000。设置调试入口地址Imageentrypoint为0x40000000=3\*GB3③调试程序选择Project-〉Debug,启动AXD进行软件仿真调试。打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0、R1、R13(SP)和R14(LR)的值。打开存储器观察窗口(Memory)设置观察地址为0x40003EA0,显示方式Size为32Bit,监视从0x40003F00起始的满递减堆栈区。单步运行程序,跟踪程序执行的流程,观察寄存器值的变化和堆栈区的数据变化,判断执行结果是否正确。调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。例如,先复位程序(选择File-〉ReloadCurrentImage),接着单步执行到“BLPOW”指令,在寄存器窗口中将R0和R1的值进行修改,然后继续运行程序。说明:双击寄存器窗口的寄存器,即可修改寄存器的值。输入的数据可以是十进制数,例如136和198),也可以是十进制数(例如0x123和0xF0),输入数据后回车确定。程序清单2.4汇编指令实验3参考程序文件名:TEST4.S所在工程名:Project4;文件名:TEST4.S;功能:计算X的n次方的值;说明:X和n均为无符号整数XEQU9;定义X的值为9nEQU8;定义Y的值为8AREAExample4,CODE,READONLY;声明代码段Example4ENTRY;标识程序入口CODE32;声明32位ARM指令STARTLDRSP,=0x40003F00;设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)LDRR0,=XLDRR1,=nBLPOW;调用子程序POW,返回值为R0HALTBHALT;子程序:POW;功能:整数乘方运算;入口参数:R0底数R1指数;出口参数R0运算结果;占用资源:R0、R1;说明:本子程序不考虑溢出问题POWSTMFDSP!,{R1-R12,LR};寄存器入栈保护MOVSR2,R1;将指数值复制到R2,并影响条件标志MOVEQR0,#1;若指数为0,则设置R0=1BEQPOW_END;若指数为0,则返回CMPR2,#1BEQPOW_END;若指数为1,则返回(此时R0没有被更改)MOVR1,R0;设置DO_MUL子程序的入口参数R0和R1SUBR2,R2,#1;计数器R2=指数值减1POW_L1BLDO_MUL;调用DO_MUL子程序,R0=R1R0SUBSR2,R2,#1;每循环一次,计数器R2减1BNEPOW_L1;若计数器R2不为0,跳转到POW_L1POW_ENDLDMFDSP!,{R1-R12,PC};寄存器出栈,返回;子程序:DO_MUL;功能:32位乘法运算;入口参数:R0乘数R1被乘数;出口参数:R0计算结果;占用资源:R0、R1;说明:本子程序不会破坏R1DO_MULMULR0,R1,R0;R0=R1R0MOVPC,LR;返回END3.7思考(1)指令“MOVR0,#0x12345678”(2)将参考程序中应用CMP指令的代码功能改为:若(5Y/2)>(2X),则R5=R5|0x000000FF,否则R5=R5&0xFFFF0000,程序应如何修改?(3)更改参考程序的X值为200,Y值为163,单步运行程序,每执行一步程序的结果是多少?(4)如何实现64位加法运算(R6、R5)=(R6、R5)+(R3、R2)?(提示:使用ADC指令。)(5)若需要考虑溢出问题(使用32位运算结果,判断运算是否溢出),如何修改实验参考程序?(提示:使用UMULL指令)(6)实验参考程序中的DO_MUL子程序,是否可以使用B、ADD和SUB指令返回?(提示:修改程序进行测试)开发板的连接和JTAG驱动程序的安装和配置硬件连接将开发板(本实验采用周立功EasyARM2131电路板,主控芯片为LPC2131)通过JTAG硬件模块和并口延长线连接至PC机的并口,开发板的电源由USB线连接到PC机的USB接口上,完成硬件连接。在做串口UART通信实验时需要使用RS232串口延长线连接到PC机的COM口,如图1所示。图1开发板硬件连接JTAG硬件模块驱动程序安装和配置找到安装程序包,解压,安装,如图2所示。图2H-JTAG安装程序包图3H-JTAG安装程序安装后在程序栏里看到程序快捷图标如图4所示,选择运行H-JATG程序。图4运行H-JTAG程序假设对一个工程调试,如图5所示。图5调试窗口选择H-JTAG驱动程序正确版本和安装位置,如图6所示。图6选择正确的H-JTAG版本如果没有运行H-JTAG(没有开启),或者没有正确配置,会出现如图所示的窗口界面。图7H-JATG服务器没有运行的错误提示以下是对H-JTAG的正确配置方法。查找主控芯片,如图8所示。图8查找主控芯片配置芯片的FLASH,如图9所示。图9配置芯片内FLASH指定主控芯片的型号,如图10所示。在实验过程中,注意通过芯片上标注的型号查看一下芯片的型号,部分开发板有的采用的不是LPC2131芯片。如果这里选择的和电路板中的物理芯片不对应,将失败。选择PHILIPS的LPC2131芯片型号,即可知该芯片内FLASH(On-ChipFlash)的容量为23KB,8个扇区。真实检测FLASH,如图13所示。图10FLASH选择图11FLASH选择操作界面图12检测FLASH图13检测FLASH成功界面调试过程程序调试入口如图14所示。图14程序调试入口选择调试方式,如全速运行(Go),如图15,图16所示。图15调试方式(选择全速运行)图16全速运行图17全速运行图18选择停止运行实验四GPIO控制实验4.1实验目的理解ARM芯片GPIO模块(部件)工作原理掌握GPIO控制方法应用GPIO驱动LED、Beeper(蜂鸣器)、检测按键学会使用具体的开发板,查看其电路图,并编写程序对其进行控制掌握具体的真实的ARM芯片(LPC2131)其GPIO模块4.2实验设备硬件PC机一台EasyARM2131开发板一套软件Windows98/XP/2000系统,ADS1.2集成开发环境4.3实验内容(1)利用GPIO控制蜂鸣器蜂鸣、LED灯亮灭、流水灯(2)利用GPIO检测按键说明:1利用汇编语言来编写程序2使用工程模板,利用C语言来编写程序把各功能模块编写成函数,在主函数中调用4.4实验原理LPC2131芯片内部有GPIO模块部件,可以控制GPIO引脚的电平变化、也可以检测GPIO引脚的电平变化,通过芯片引脚供应用人员连接使用。电路板中GPIO引脚与Beeper、LED、按键的连接已经连接好,请注意查看其引脚的分配。(1)Beeper控制原理:先查看图4.1的电路图,由图知道当P0.7引脚输出低电平时,三极管导通,集电极放大电流驱动BUZZER蜂鸣;当P0.7引脚输出高电平时,三极管不导通,BUZZER不蜂鸣;电平持续的时间决定了集电极中电流持续的时间,故通过控制P0.7高低电平的持续时间,即可控制BUZZER。(2)8路LED灯控制原理:先查看图4.3的电路图,由图知8路LED(LED1~LED8)由P1.18~P1.25连接,每个LED接一个470的限流电阻,采用灌电流方式驱动LED,当引脚输出低电平时,两端形成压降,LED点亮;当引脚输出高电平时,无压降形成,LED熄灭。通过控制引脚高低电平的持续时间可以控制LED的亮灭。流水灯是按不同规律控制引脚的电平持续时间完成的。(3)按键输入检测原理:P0.16~P0.21连接KEY1~KEY6,当无按键按下时引脚为高电平,当键按下时,引脚为低电平。通过检测引脚的输入电平来判断是否有键按下。通过CPU读写GPIO部件的寄存器完成GPIO模块的工作配置。LPC2131有2个32位的通用I/O口。PORT0使用了30个引脚,PORT1有多达16个引脚可用作GPIO功能。PORT0和PORT1由2组(4个)寄存器控制,如表4.1所示。具体寄存器每位含义和使用请查看书籍或者LPC2131芯片资料。表4.1GPIO寄存器映射寄存器名称功能描述访问方式复位值PORT0地址和名称PORT1地址和名称IOPINGPIO引脚值寄存器只读NA0xE0028000IO0PIN0xE0028010IO1PINIOSETGPIO输出置位寄存器读/写0x000000000xE0028004IO0SET0xE0028014IO1SETIODIRGPIO方向控制寄存器读/写0x000000000xE0028008IO0DIR0xE0028018IO1DIRIOCLRGPIO输出清零寄存器读/写0x000000000xE002800CIO0CLR0xE002801CIO1CLR4.5实验硬件原理图图4.1Beeper控制电路图4.2按键输入检测电路图图4.38路LED控制电路图4.6实验预习4.7实验过程(1)查看ARM2131开发板要用到的蜂鸣器、LED灯电路及与ARM2131芯片内GPIO模块引脚连接情况(2)查看ARM芯片内GPIO模块的控制寄存器的功能、各位的含义(3)定义实验功能、草画软件模块流程图(4)使用ADS,并利用对应开发板的工程模板进行编辑源文件,然后编译链接工程(5)使用开发板和JTAG调试(6)根据设计,粗略地画出信号波形图。利用逻辑分析仪或者示波器测试引脚信号,画出波形图,单位和数值要准确。4.8实验参考程序功能:当按下KEY1键时,BEEP蜂鸣,LED1-LED8点亮,松开时,BEEP停止蜂鸣,LED1-LED8熄灭在模板中LPC2294.h文件中包含有寄存器地址定义如下:/*GeneralPurposeInput/Output(GPIO)*//*通用并行IO口的特殊寄存器*/#defineIOPIN(*((volatileunsignedlong*)0xE0028000))/*lpc210xonly*/#defineIOSET(*((volatileunsignedlong*)0xE0028004))/*lpc210xonly*/#defineIODIR(*((volatileunsignedlong*)0xE0028008))/*lpc210xonly*/#defineIOCLR(*((volatileunsignedlong*)0xE002800C))/*lpc210xonly*/#defineIO0PIN(*((volatileunsignedlong*)0xE0028000))/*noinlpc210x*/#defineIO0SET(*((volatileunsignedlong*)0xE0028004))/*noinlpc210x*/#defineIO0DIR(*((volatileunsignedlong*)0xE0028008))/*noinlpc210x*/#defineIO0CLR(*((volatileunsignedlong*)0xE002800C))/*noinlpc210x*/#defineIO1PIN(*((volatileunsignedlong*)0xE0028010))/*noinlpc210x*/#defineIO1SET(*((volatileunsignedlong*)0xE0028014))/*noinlpc210x*/#defineIO1DIR(*((volatileunsignedlong*)0xE0028018))/*noinlpc210x*/#defineIO1CLR(*((volatileunsignedlong*)0xE002801C))/*noinlpc210x*/实验参考程序#include"config.h"#defineBEEP 1<<7 //P0.7控制蜂鸣器,低电平蜂鸣#defineLED0xFF<<18//P1.18-P1.25控制LED1-LED8,低电平点亮#defineKEY11<<16//P0.16连接KEY1/************************************************************************************************************函数名称:beeper_LEDshow()**函数功能:用P0.7控制BEEP,让BEEP鸣叫。**用P1.18-P1.25控制LED1-LED8,让LED1-LED8闪烁**当KEY1按下时,BEEP蜂鸣,LED1-LED8点亮**调试说明:需将跳线JP5和LED短接。**********************************************************************************************************/voidbeeper_LEDshow(){ PINSEL0=0x00000000; //设置管脚连接GPIO IO0DIR=BEEP; //设置BEEP控制口为输出 PINSEL2=PINSEL2&(~0x08);IO1DIR=LED; while(1) { if((IO0PIN&KEY1)==0)//KEY1按下,BEEP 蜂鸣,LED1-LED8点亮 { IO0CLR=BEEP; //BEEP 蜂鸣 IO1CLR=LED;//LED1-LED8点亮 } else { IO0SET=BEEP; //BEEP停止蜂鸣 IO1SET=LED;//LED1-LED8熄灭 } }}/************************************************************************************************************函数名称:main()**函数功能:调用模块函数。**调试说明:需将跳线JP5和LED短接。**********************************************************************************************************/intmain(void){ beeper_LEDshow();return0;}4.9思考设计流水灯实验实验五UART通信实验5.1实验目的掌握串行通信原理掌握串行通信控制器UART0工作原理及各个控制寄存器的配置掌握具体的电路板(开发板)UART0电平转换电路(SP3232E芯片的功能作用,工作原理)掌握ARM芯片中串行通信部件UART和ARMCPU的数据交换方式。(查询方式、中断方式)5.2实验设备硬件PC机一台EasyARM2131开发板一套串口延长线软件:Windows98/XP/2000系统,ADS1.2集成开发环境EasyARM(PC机串口通信)软件5.3实验内容将PC串口(COM0)的发送信号(TxD)线连接到开发板UART0口中的RxD信号线,接收信号线RxD连接到开发板UART0口中的TxD信号线,通过PC机串口简单通信软件(EasyARM)向开发板发送字符串,由于交叉连接,开发板将接收到的字符串发送回来,如果EasyARM软件上能够正确的显示到接收到的字符串,表示ARM中的UART0工作正确,即UART0驱动程序功能正确。理解芯片中UART0部件与ARMCPU核通过VPB接口连接后,数据交换方式,常用查询方式和中断方式,进一步理解外设和CPU交互数据的方式。图5.1串行通信连接图5.2UART源与VIC的连接5.4实验原理串行通信是一种常用的通信方式,在短距离双机(设备)通信中应用广泛。LPC2131芯片内部设计含有两个串行通信控制器模块部件UART,一个为UART0、另一个为UART1。5.5实验硬件原理图图5.3UART电平转换电路主要信号TxD0(发送数据信号)、RxD0(接收数据信号),在UART控制器控制下数据从TxD0串行出去,RxD0是接收。5.6实验预习5.7实验过程查询方式PC机串口通信软件发送和接收数据界面如图5.4所示。对于PC端,感知不到ARMCPU是查询方式与UART0通信,还是UART0连接VIC,VIC连接ARMCPU通过中断方式通信。对于ARMCPU,显然是中断方式较好,CPU效率较高。图5.4PC端串口通信程序界面图5.5PC端串口通信程序界面5.8实验参考程序UART寄存器地址定义(在LPC2294.h文件中定义)/*UniversalAsynchronousReceiverTransmitter0(UART0)*//*通用异步串行口0(UART0)的特殊寄存器*/#defineU0RBR(*((volatileunsignedchar*)0xE000C000))#defineU0THR(*((volatileunsignedchar*)0xE000C000))#defineU0IER(*((volatileunsignedchar*)0xE000C004))#defineU0IIR(*((volatileunsignedchar*)0xE000C008))#defineU0FCR(*((volatileunsignedchar*)0xE000C008))#defineU0LCR(*((volatileunsignedchar*)0xE000C00C#defineU0LSR(*((volatileunsignedchar*)0xE000C014))#defineU0SCR(*((volatileunsignedchar*)0xE000C01C#defineU0DLL(*((volatileunsignedchar*)0xE000C000))#defineU0DLM(*((volatileunsignedchar*)0xE000C004))CPU查询方式#include"config.h"/************************************************************************************************************函数名称:DelayNS()**函数功能:长软件延时。**入口参数:dly 延时参数,值越大,延时越久**出口参数:无**********************************************************************************************************/voidDelayNS(uint32dly){ uint32i; for(;dly>0;dly--) for(i=0;i<50000;i++);}#define UART_BPS 115200 //串口通讯波特率/************************************************************************************************************函数名称:UART0_Init()**函数功能:串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率115200。**入口参数:无**出口参数:无**********************************************************************************************************/voidUART0_Init(void){ uint16Fdiv; U0LCR=0x83; //DLAB=1,允许设置波特率 Fdiv=(Fpclk/16)/UART_BPS; //设置波特率 U0DLM=Fdiv/256; U0DLL=Fdiv%256; U0LCR=0x03;}/************************************************************************************************************函数名称:UART0_GetByte()**函数功能:从串口接收1字节数据,使用查询方式接收。**入口参数:无**出口参数:接收到的数据**********************************************************************************************************/uint8UART0_GetByte(void){ uint8rcv_dat; while((U0LSR&0x01)==0); rcv_dat=U0RBR; return(rcv_dat); }/************************************************************************************************************函数名称:UART0_GetStr()**函数功能:从串口接收**入口参数: s 指向接收数据数组的指针** n 接收的个数**出口参数: 无**********************************************************************************************************/voidUART0_GetStr(uint8*s,uint32n){ for(;n>0;n--) { *s++=UART0_GetByte(); }}/************************************************************************************************************函数名称:UART0_SendByte()**函数功能:向串口发送字节数据,并等待发送完毕,查询方式。**入口参数:dat 要发送的数据**出口参数:无**********************************************************************************************************/voidUART0_SendByte(uint8dat){ U0THR=dat; while((U0LSR&0x40)==0); //等待数据发送完毕}/************************************************************************************************************函数名称:UART0_SendStr()**函数功能:向串口发送一字符串**入口参数:str 要发送的字符串的指针**出口参数:无**********************************************************************************************************/voidUART0_SendStr(uint8const*str){ while(1) { if(*str=='\0') break; //遇到结束符,退出 UART0_SendByte(*str++); //发送数据 }}/************************************************************************************************************函数名称:main()**函数功能:从串口UART0接收字符串"HelloEasyARM2131!",并发送回上位机显示。**调试说明:需要PC串口显示终端软件如EasyARM.exe。**********************************************************************************************************/intmain(void){ uint8snd[32]; PINSEL0=0x00000005; //设置I/O连接到UART0 UART0_Init(); //串口初始化 UART0_GetStr(snd,18); //从串口接收字符串 DelayNS(10); UART0_SendStr(snd); //向串口发送字符串 DelayNS(10); while(1); return0;}中断方式程序清单主要配置VIC,查表《ARM嵌入式系统基础教程(第2版)》第190页LPC2000系列ARM的中断源表(因芯片内的设备部件模块产生的中断通道号已经分配好,即已经连接好)知UART0部件模块走6号通道,VIC部件需要分配中断类型(FIQ、IRQ)、如果是IRQ需要分配中断优先级,该实验中分配为向量IRQ,优先级为0,设置向量地址、使能中断、编写中断服务程序。UART0发生了中断,中断服务程序的编写需要判断UART0的寄存器U0IIR,来具体处理,具体查询《深入浅出ARM7——LPC213x/214x(上册)》书籍180页。功能:UART0通讯实验,中断方式,使用FIFO。#include"config.h"/*定义串口模式设置数据结构*/typedefstructUartMode{ uint8datab; //字长度,5/6/7/8可选 uint8stopb; //停止位,1/2可选 uint8parity; //奇偶校验位,0-无校验,1-奇校验,2-偶校验}UARTMODE;uint8rcv_buf[8]; //UART0数据接收缓冲区volatileuint8rcv_new; //接收新数据标志/************************************************************************************************************函数名称:IRQ_UART0()**函数功能:串口0接收中断服务程序**入口参数:无**出口参数:无**********************************************************************************************************/void__irqIRQ_UART0(void){ uint8i; if((U0IIR&0x0F)==0x04) rcv_new=1; //设置接收到新的数据标志 for(i=0;i<8;i++) { rcv_buf[i]=U0RBR; //读取FIFO的数据,并清除中断 } VICVectAddr=0x00; //中断处理结束}/************************************************************************************************************函数名称:UART0_SendByte()**函数功能:向串口0发送1字节数据**入口参数:dat 要发送的数据**出口参数:无**********************************************************************************************************/voidUART0_SendByte(uint8dat){ U0THR=dat; //要发送的数据}/************************************************************************************************************函数名称:UART0_SendBuf()**函数功能:向串口发送8字节数据**入口参数:无**出口参数:无**********************************************************************************************************/voidUART0_SendBuf(void){ uint8i; for(i=0;i<8;i++) UART0_SendByte(rcv_buf[i]); while((U0LSR&0x20)==0); //等待数据发送完毕}/************************************************************************************************************函数名称:UART0_Init()**函数功能:串口初始化,设置工作模式和波特率。**入口参数:baud 波特率** set 模式设置(UARTMODE数据结构)**出口参数:1-初始化成功,0-初始化失败**********************************************************************************************************/int8UART0_Init(uint32baud,UARTMODEset){ uint32bak; /*参数过滤*/ if((baud==0)||(baud>115200)) return(0); if((set.datab<5)||(set.datab>8)) return(0); if((set.stopb==0)||(set.stopb>2)) return(0); if(set.parity>4) return(0); /*设置串口波特率*/ U0LCR=0x80; //DLAB=1 bak=(Fpclk>>4)/baud; U0DLM=bak>>8; U0DLL=bak&0xFF; /*设置串口模式*/ bak=set.datab-5; //设置字长 if(set.stopb==2) bak|=0x04; //判断是否为2位停止位 if(set.parity!=0) { set.parity=set.parity-1; bak|=0x08; } bak|=set.parity<<4; //设置奇偶校验 U0LCR=bak; return(1);}/************************************************************************************************************函数名称:main()**函数功能:从串口UART0接收字符串"ABCDEFGH",并发送回上位机显示。**调试说明:需要PC串口显示终端软件如EasyARM.exe。**********************************************************************************************************/intmain(void){ UARTMODEset; set.datab=8; set.stopb=1; set.parity=0; rcv_new=0; PINSEL0=0x00000005; //设置I/O连接到UART0 UART0_Init(115200,set); //串口初始化 U0FCR=0x81; //使能FIFO,并设置触发点为8字节 U0IER=0x01; //允许RBR中断,即接收中断 IRQEnable(); //使能IRQ中断 /*使能UART0中断*/ VICIntSelect=0x00000000; //设置所有的通道为IRQ中断 VICVectCntl0=0x20|0x06; //UART0分配到IRQslot0,即最高优先级 VICVectAddr0=(uint32)IRQ_UART0; //设置UART0向量地址 VICIntEnable=1<<0x06; //使能UART0中断 while(1) { if(rcv_new==1) { rcv_new=0; UART0_SendBuf(); } }return0;}5.9思考扩展和改造程序,使程序使用更方便,功能更完善,封装为驱动程序的形式,做成中间件,供其他高层应用程序调用,也可以通过软件配置的方式选择是CPU查询方式还是中断方式。思考和查询UART部件的设计原理。实验六中断实验ARM系统的中断硬件系统(NXP公司的LPC系列)中断源通过VIC(中断控制器)部件接入ARMCPU核,NXP公司的LPC系列ARM芯片内部模块部件可作为中断源的部件(如Timer)中断信号通过VIC接到ARMCPU核,VIC通过芯片提供出来的几路中断信号可以供应用人员外接其他中断源设备中断信号。对中断功能的正确实现不仅包括对硬件中断系统的正确连接和配置、而且要开发中断服务程序,中断服务程序的开发方法在不使用嵌入式实时操作系统的情况下和使用嵌入式实时操作系统的情况下是不相同的。本实验不使用操作系统。6.1实验目的理解ARM芯片中断实现方式学会配置VIC部件,连接中断源、配置中断类型、中断优先级学会编写中断服务程序学会调试中断服务程序理解中断工作过程本次实验选用中断源Timer0的工作原理、应用配置方法6.2实验设备硬件PC机一台EasyARM2131开发板一套软件:Windows98/XP/2000系统,ADS1.2集成开发环境6.3实验内容用LPC2131芯片

温馨提示

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

评论

0/150

提交评论