嵌入式ADS实验指导书_第1页
嵌入式ADS实验指导书_第2页
嵌入式ADS实验指导书_第3页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、实验一 嵌入式微处理器系统的开发环境一、 实验环境PC机一台软件:ADS 1.2集成开发环境一套二、实验目的了解嵌入式系统及其特点;熟悉嵌入式系统的开发环境和基本配置并能编写简单的汇编程序三、实验内容嵌入式系统的开发环境、基本配置使用汇编指令完成简单的加法实验四、实验步骤在D:新建一个目录,目录名为experiment。点击 WINDOWS程序|ARMDeveloperSuitev1.2|CodeWarriorfor ARM Developer Metrowerks Code ADS ADS 1.21-1图 1-1 启动ADS1.2(3) 在CodeWarrior“New”菜单。这样就会打开一

2、个如图1-2 所示的对话框。FileNewARM Executable Image目录为D:experiment。图 1-2 新建文件在这个对话框中为用户提供了7 种可选择的工程类型:1)ARM Executabl ImageARM 指令的代码生成一个ELF 格式的可执行映像文件; 2)ARM Object LibraryARMarmar 格式的目标文件库; 3)Empty Project:用于创建一个不包含任何库或源文件的工程;4)Make Wizard:用于将Visual C 的nmake 或GNU make 文件转入到CodeWarrior IDE 工程文件;Thumb ARM Exec

3、utable Image:用于由ARM 指令和Thumb行的ELF 格式的映像文件;Thumb Executable imageThumbELF 格式的映像文件; 7)Thumb Object LibraryThumb 指令的代码生成一个armar 格式的目标文件库。FileNew】建立一个新的文件TEST1.S如程序代码,并保存,此时在工程窗口中可以看到TEST1.S图 1-3 新建test1.s选择【Edit】-【PerferencesFont 选项设置字体是 Fixedsys,Script 是CHINESE_GB2312。图 1-4 设置字体EditDebugRel SettingsDe

4、bugRel Settings 对话框的左边选择ARM Linker点击“DebugRelSettings”图标按钮,即可进行工程的地址设置、输出文件设置、编1-5 Linker中设置各编译器的编译选项。1-6所示。同样,您可以 在【Project】菜单中找到相应的命令。图 1-5 连接器选项设置图 1-6 output 选项卡OUTPUTLinktype 选项组中的单选按钮确定使用的连接方式。这里选择ELFSimple1-5ROBase 文本框中填入0 x40000000 是开发板上SDRAMBase 0 x40003000 指的是系统可读写内存的地址0 x40 x40003000 之间是只

5、读区域,存放程序的代码段,从0 x40003000 开始是程序的数据段。LayoutSimple 时有效,它用来安排一些输入段在映像文件Place at beginning of imageinit.Section 文本框中指定输入段的名称initinit.s 源文件中的init所示。图 1-7 Layout 选项卡中连接器选项ProjectMakeF7,将编译链接整个工程。如图 1-8图 1-8 工程窗口中的图标按钮A)DebugRel SettingsB)Synchronize Modification Dates同步修改日期;C)MakeD)Debug E)Run编译连接;启动ADX 进

6、行调试;启动ADX 调试,并直接运行;F)Project Inspector”Make”1-9所示。图 1-9 编译连接输出窗口ProjectDebugF5。IDE 环境就会启动AXD接着可以执行单步、全速运行调试。图 1-10 AXD 调试窗口注意:本实验使用软件仿真,所以要在AXDOptions】-【Configure Target菜单,然后在 Choose TargetARMUL五 思考题图 1-11 目标环境选择工程模板有何作用?如何强行重新编译工程的所有文件?(提示:选择【Project】-【Remove Object Code】删除工程中的*.obj 文件)六 参考程序AREAEx

7、ample1,CODE,READONLY ; 声明代码段Example1ENTRYCODE32STARTMOV MOVR0,#15 R1,#8;标识程序入口32ARM设置参数ADDSR0,R0,R1;R0 = R0 + R1BSTARTEND实验预作关键过程及结果图:实验二 汇编指令实验一、实验环境PC机一台ADS 1.2集成开发环境一套二、实验目的了解ADS 1.2ARMulator掌握ARM7TDMI3.掌握指令的条件执行和使用LDR/STR 指令完成存储器的访问。三、实验内容使用LDR/STR使用数据处理指令实现数据传送和算术和逻辑运算。使用ADS 1.2(Processor Regis

8、ters(Memory) 监视存储器的值。LDR0 x4000310010 则使用STR100ADS 1.2(Processor Registers)监视R0、R1(Memory) 0 x40003100四、实验步骤启动ADS1.2,使用ARMExecutableImageInstruction1。建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。RO Base0 x40000000,RW Base0 x40003000口地址Image entry point0 x40000000。Project】-【DebugAXD打开寄存器窗口Registers),Current 项监视 的值

9、。打开存储器观察窗(Memor0 x4000310Size为监视0 x40003100图2-1Memory 窗口显示格式设置寄存器显示格式与之类似Hex,Decimal2-2 所示。图 2-2 设置寄存器显示格式(6)单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,调试时观察寄存器和 0 x40003100 地址上的值。六、思考题图 2-3 调试程序窗口LDR 伪指令与LDR 加载指令的功能和应用有何区别,举例说明?LDR/STR 指令的前索引偏移指令如何编写?指令是怎样操作的?AXD(提示:选择【File】-【Reload Current Image】重新加载映象文件)七、

10、参考程序COUNTEQU AREA ENTRY CODE320 x40003100 ; 定义一个变量,地址为 0 x40003100 Example2,CODE,READONLY ; 声明代码段Example2; 标识程序入口32ARMSTARTLDRR1,=COUNT; R1 = COUNTMOV STR LOOP LDR ADD CMPR0,#0 R0,R1LDR R0,R1 R0,R0,#1 R0,#10; R0 = 0; R1 = ,即设置COUNTR1,=COUNT; R0 = R1; R0 = R0 + 1; R010MOVHSR0,#0R010 = 0STR B ENDR0,R1

11、 LOOP; R1 0)。四、实验预习要求ARM 嵌入式系统基础教程中第4 章ARM 指令系统的内容。ADS 料,了解ADS 工程编辑和AXD()五、实验步骤启动ADS 1.2,使用ARM Executable ImageProgramC。建立源文件Startup.STest.c,编写实验程序,然后添加到工程中。设置工程链接地址RO Base0 x40000000,RW Base0 x40003000口地址Image entry pointOx40000000。设置位于开始位置的起始代码段,如图3-1,3-2图 3-1 设置位于开始位置的起始代码段(1)图 3-2 设置位于开始位置的起始代码段

12、(2)编译链接工程,选择ProjectDebug,启动AXD 进行软件仿真调试。在Startups 的“B Main”处设置断点,然后全速动行程序。程序在断点处停止。单步运行程序,判断程序是否跳转到C 程序中运行。诜择 Processor vlewsvariables 步全速运行程序,判断程序的运算结果是否正确。如图3-3六、思考题图 3-3 ARM 实验 3 的运行观察结果 ?如果没有Startup.s ?实验程序中的 Main()提示:Main 号。)七、参考程序;startup fileIMPORT IMPORT IMPORT IMPORT|Image$RO$Limit|Image$RW

13、$Base|Image$ZI$Base|Image$ZI$Limit|IMPORTMAIN;declare the main() in the C ProgAREA ENTRY CODE32start,CODE,READONLYResetLDRSP,=0 x40003f00;initial the C caseLDR LDR LDRCMP BEQR0,=|Image$RO$Limit| R1,=|Image$RW$Base| R3,=|Image$ZI$Base|R0,R1 LOOP1LOOP0CMPR1,R3 LDRCCSTRCCBCCLOOP0LOOP1LDR MOVR1,=|Image$

14、ZI$Limit| R2,#0LOOP2CMPR3,R1STRCCR2,R3,#4BCCB ENDLOOP2 MAIN/ main file#define uint8unsigned #define uint32 unsigned int#define N100uint32 sum; void MAIN(void)uint32 i; sum = 0;for(i = 0;i 】)打开变System View【 InternalsLPC2000 系列ARM7 微控制器的片内外设寄存器窗口。11、可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器控制是否正

15、确。12、当仿真调试通过后关闭AXD,在ADS 1.2 集成开发环境中选用RelOutChip 标,然后编译连接工程。13、将EasyARM2200 开发板上的JP9 跳线短接,JP1、JP4 跳线断开,JP6 跳线设置为Bank0-Flash、Bank1-RAM,JP7 跳线设置为OUTSIDE。14Project】-DebugAXD JTAG EasyJTAG 真器将会把程序下载到片外FLASH 上(2.5 节。注意:使用 RelOutChip 生成目标时,使用片外 FLASH 进行仿真调试(或固化程序),JP6跳线要设置为Bank0-Flash、Bank1-RAM,在AXD 中设置仿真器

16、参考如图 5-3 所示。图 5-3 片外FLASH 调试的仿真器设置15、按EasyARM2200 开发板上的RST 复位键,观察程序是否能脱机运行。16、实验结束后,在AXD 中设置仿真器为片外RAM 调试方式的设置,以便于后面实验的正确操作。七、思考题为什么这个实验的工程不需要设置连接地址?(提示:LPC2200 专用工程模板已集成了起动代码、编译选项和连接地址设置等等)在实验参考程序中,如何控制蜂鸣器报警的速度?在 LPC2000 系列 ARM7 微控制器中,有哪两个管脚作 GPIO 输出时需要外接上拉电阻?八、参考程序GPIO 输出控制实验 1 的参考程序见程序清单。GPIO 输出控制

17、实验 1 参考程序/*文件名:BEEPCON.C*功能:蜂鸣器控制。对蜂鸣器B1 进行控制,采用软件延时方法。*使用 I/O 口直接控制,采用灌电流方式。*说明:将跳线器JP9 短接,JP4 断开。*/ #includeconfig.h#define BEEPCON 0 x00000080/*P0.7 引脚控制B1,低电平蜂鸣*/*名称:DelayNS()*功能:长软件延时。*入口参数:dly 延时参数,值越大,延时越久*出口参数:无*/ void DelayNS(uint32 dly)uint32 i; for(;dly0;dly-) for(i=0;iDebugAXD 进行JTAG仿真调试

18、。IO0PIN IO0PIN寄存器的值。全速运行程序,短接/断开 JP1,控制蜂鸣器的蜂鸣。说明:可以通过 Watch Processor 】-【Watch 窗口,在Watch 窗口内点击鼠标右键,选择Add 6-2 所示。图6-2Watch窗口Add Watch窗口中的Expression *(unsigned 6-3 所示,然后选择Add To View按钮,即可在Watch窗口观察IO0PIN (IO0PIN 0 xE0028000)。图6-3Add Watch对话框Watch 窗口中选择一个观察变量,按Del 键即可删除此观察变量。七、思考题P0.30 设置为GPIOP0.3001?或

19、者是不确定?如果需要读取当前P0.7 的输出值(不是管脚上的电平),如何实现?八、参考程序GPIO 输入控制实验的参考程序见程序清单。GPIO 输入控制实验参考程序/*文件名:READPIN.C*功能:读取 I/O 引脚值,并输出控制蜂鸣器。*使用 I/O 口输入方式对P0.14 口进行扫描。说明:将跳线器JP9 短接,JP4 /断开JP1(使P0.14 /)。*/ #includeconfig.h#define BEEPCON 0 x00000080/*P0.7 引脚控制B1,低电平蜂鸣*/#define PIN_P014 0 x00004000/*定义 P0.14 屏蔽字*/*名称:mai

20、n()*功能:读取P0.14 口的值,并输出控制蜂鸣器B1。*/ int main(void)uint32 i;PINSEL0=0 x00000000;/设置管脚连接GPIOIO0DIR=BEEPCON;/设置B1 控制口为输出,其它I/O 为输入while(1)if(IO0PIN&PIN_P014)!=0)IO0SET=BEEPCON; else IO0CLR=BEEPCON;for(i=0;iDebugAXD 进行JTAG仿真调试。PC机上的EasyARMHello World7-1所示。七、思考题图 7-1 UART 实验运行结果U0RBR 寄存器和U0THR 寄存器的地址是完全一样的,

21、是不是说明接收寄存器和发送寄存器是同一物理寄存器呢?“while(U0LSR&0 x20)=0)序运行能得到正确结果吗?八、参考程序UART 实验的参考程序见程序清单。UART 实验参考程序/*文件名:SENDSTR.C*功能:向串口发送数据。*说明:使用外部 11.0592MHz 晶振,根据CONFIG.H 文件配置,Fpclk=11.0592MHz;*通讯波特率 115200,8 位数据位,1 位停止位,无奇偶校验。*/ #includeconfig.h/*名称:DelayNS()*功能:长软件延时*入口参数:dly 延时参数,值越大,延时越久*出口参数:无*/ void DelayNS(

22、uint32 dly)uint32 i; for(;dly0;dly-) for(i=0;iDebugAXD 进行JTAG/故障解决办法 机上的EasyARM软件会不断的显示RTC的时间值。六、思考题若程序中已初始化YEAR、MONTH、DOM 寄存器,则DOY 寄存器是否还需要初始化? 如果想定时每天的 12:00:00 报警,需要如何设置RTC 的相关寄存器?七、参考程序RTC 实验的参考程序见程序清单。RTC 实验参考程序/*文件名:SENDRTC.C*功能:运行 RTC 进行计时,将所时间值不断的通过串口向上位机发送,并把秒的值输出LED1-LED8*显示。*说明:将跳线器JP8 短接

23、。*通讯波特率 115200,8 位数据位,1 位停止位,无奇偶校验。*/ #includeconfig.h#define SPI_CS 0 x00000100/*P0.8*/ #define SPI_DATA 0 x00000040/*P0.6*/ #define SPI_CLK 0 x00000010/*P0.4*/#define SPI_IOCON 0 x00000150/*定义 SPI 接口的 I/O 设置字*/*定义串口模式设置数据结构*/ typedef struct UartModeuint8 datab;/uint8 stopb;/停止位,1/2uint8 parity;/奇偶

24、校验位,0 为无校验,1 奇数校验,2 为偶数校验UARTMODE;uint8 send_buf16;/UART0 数据接收缓冲区/*名称:UART0_Ini()*功能:初始化串口 0。设置其工作模式及波特率。*入口参数:baud 波特率*set 模式设置(UARTMODE 数据结构)*出口参数:返回值为 1 时表示初化成功,为 0 表除参数出错*/ uint8 UART0_Ini(uint32 baud,UARTMODE set)uint32 bak;/* 参 数 过 滤 */ if(0=baud)|(baud115200)return(0); if(set.datab8)return(0)

25、; if(0=set.stopb)|(set.stopb2)return(0); if(set.parity4)return(0);/* 设 置 串 口 波 特 率 */ U0LCR=0 x80;/DLAB 位置 1bak=(Fpclk4)/baud;U0DLM=bak8;U0DLL=bak&0 xff;/* 设 置 串 口 模 式 */ bak=set.datab-5;/设置字长度if(2=set.stopb)bak|=0 x04;/2 if(0!=set.parity)set.parity=set.parity-1;bak|=0 x08; bak|=set.parity4;/设置奇偶校验U

26、0LCR=bak; return(1);/*名称:SendByte()*功能:向串口UART0 发送字节数据,并等待发送完毕。*入口参数:data 要发送的数据*出口参数:无*/ void SendByte(uint8 data)U0THR=data;/发送数据while(U0LSR&0 x20)=0);/等待数据发送/*名称:ISendBuf()*功能:将缓冲区的数据发送回主机。*入口参数:buf 数据缓冲区*no 发送数据的个数*出口参数:无*/ void ISendBuf(uint8 const*buf,uint8 no)uint8 i; for(i=0;ino;i+)SendByte(bufi);/*名称:HC595_SendDat()*功能:向 74HC595 发送一字节数据*入口参数:dat 要发送的数据*出口参数:无*说明:发送数据时,高位先发送。*/ void HC595_SendDat(uint8 dat)uint8 i; IO0CLR=SPI_CS;/SPI_CS=0for(i=0;i8;i+)/发送 8 位数据IO0CLR=SPI_CLK;/SPI_CLK=0/* 设 置 SPI_DATA 输 出 值 */ if(dat&0 x80)!=0)IO0SET=SPI_DATA; else IO0CLR=SPI_DATA;dat16)&0 x1F;/取

温馨提示

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

评论

0/150

提交评论