嵌入式实验教案.docx
- 文档编号:13552582
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:20
- 大小:276.86KB
嵌入式实验教案.docx
《嵌入式实验教案.docx》由会员分享,可在线阅读,更多相关《嵌入式实验教案.docx(20页珍藏版)》请在冰点文库上搜索。
嵌入式实验教案
嵌入式实验教案
实验一:
ADS1.2集成开发环境练习
姓名:
学号:
预习(20%)
操作(40%)
实验报告(40%)
总分
【实验目的】
了解ADS1.2集成开发环境和ARMulator软件仿真的使用方法;掌握ARM7TDMI汇编指令的用法,并能编写简单的汇编程序;掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。
【实验设备】
PC机一台,ADS1.2集成开发环境
【实验内容】
建立一个工程;建立一个C源文件,并添加到工程中;设置文本编辑器支持中文;设置编译连接控制选项;编译连接工程;调试工程;编程实现:
使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,否则把0写回原地址,不断重复整个过程;使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0、R1的值,打开存储器观察窗口(Memory)监视0x40003100的值。
【实验步骤】
(1)启动ADS1.2IDE集成开发环境,选择File->New,使用ARMExecutableImage工程模板建立一个工程,工程名称为ADS(见图1.1)。
图1.1建立ARM指令代码的工程
(2)选择File->New建立一个新文件TEST1.S,设置直接添加到项目中(见图1.2)。
编程实现:
使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,否则把0写回原地址,不断重复整个过程,参考程序清单1,输入程序清单1.1所示的代码并保存(见图1.3)。
图1.2新建文件TEST1.S
图1.3添加了TEST1.S的工程管理窗口
程序清单1TEST1.S文件代码
COUNTEQU0x40003100;定义一个变量,地址为0x40003100
AREAExample1,CODE,READONLY;声明代码段Example1
ENTRY;标识程序入口
CODE32;声明32位ARM指令
STARTLDRR1,=COUNT;R1指向地址0x40003100
MOVR0,#0
STRR0,[R1];[R1]<=R0,即设置地址0x40003100的值为0
LOOPLDRR1,=COUNT
LDRR0,[R1];R0<=[R1]
ADDR0,R0,#1
CMPR0,#10;R0与10比较,影响条件码标志
MOVHSR0,#0;若R0大于等于10,则此指令执行,R0<=0
STRR0,[R1];[R1]<=R0
BLOOP
END
(3)由于ADS安装以后默认的字体是CourierNew,对于中文支持不完善,因此建议修改字体。
选择Edit->Preferences...,打开IDEPreferences对话框(见图1.4),在Font(字体)选择设置字体为Fixedsys,Script为CHINESE。
由于Tab在不同文本编辑器解释不同,建议在TabInsertsSpaces前打勾,使Tab键插入的是对个空格。
图1.4字体和Tab设置
(4)选择Edit->DebugRelSettings...,在DebugRelSettings对话框的左边选择ARMLinker项,然后在Output页设置工程连接地址ROBase为0x40000000,RWBase为0x40003000(见图1.5),在Options页设置调试入口地址Imageentrypoint为0x40000000(见图1.6)。
图1.5工程连接地址设置
图1.6工程调试入口地址设置
(5)选择Project->Make,将编译连接整个工程。
如果编译成功,弹出的Errors&Warnings对话框(见图1.7)会报告编译错误为0,那么就可以对工程进行仿真。
图1.7编译错误和警告提示框
(6)选择Project->Debug,或者按下快捷键F5,IDE环境就会启动AXD调试软件。
选择Option->ConfigureTarget…,弹出ChooseTarget对话框(见图1.8),选择ARMUL软件仿真,然后确定。
选择File->LoadImage,选择打开axf文件(见图1.9),可以开始调试了。
AXD调试界面如图1.10所示。
图1.8选择软件仿真
图1.9加载镜像文件
图1.10AXD调试界面
(7)选择ProcessorViews->Registers打开寄存器窗口监视R0、R1的值。
ProcessorViews->Memory打开存储器观察窗口设置观察地址为0x40003100,显示方式Size为32Bit,监视0x40003100地址上的值。
说明:
在Memory窗口中点击鼠标右键,在Size项中可以选择显示格式。
(8)选择Execute下拉菜单可以单步运行程序,设置/取消断点,全速运行程序,或者停止程序运行等,调试时观察寄存器和0x40003100地址上的值,运行结果见图1.11。
图1.11程序运行结果
【思考】
(1)如何强行重新编译工程的所有文件?
(2)使用LDRB/STRB代替程序清单1中的所有加载/存储指令LDR/STR,程序会得到正确的执行吗?
(3)LDR伪指令与LDR加载指令的功能和应用有何区别,举例说明。
(4)LDR/STR指令的前索引偏移指令如何编写?
指令是怎样操作的?
(5)在AXD调试时如何复位程序?
实验二:
C程序实验
姓名:
学号:
预习(20%)
操作(40%)
实验报告(40%)
总分
【实验目的】
了解使用ADS1.2编写和调试C程序的方法。
【实验设备】
PC机一台,ADS1.2集成开发环境
【实验内容】
编写一个汇编程序文件和一个C程序文件。
汇编程序的功能是初始化堆栈指针和C程序的运行环境,然后跳转到C程序执行,这就是一个简单的启动程序。
C程序使用加法运算来计算1+2+3+...+N的值(N>0)。
【实验步骤】
(1)启动ADS1.2IDE集成开发环境,选择File->New,使用ARMExecutableImage工程模板建立一个工程PorgramC。
(2)选择File->New建立一个汇编程序文件Startup.S和一个C程序文件Test.c,然后添加到项目中,参考程序见程序清单2.1和2.2,输入程序代码并保存。
程序清单2.1C运用参考程序
#defineuint8unsignedchar
#defineuint32unsignedint
#defineN100
uint32sum;//使用加法运算来计算1+2+3+...+N的值。
(N>0)
voidMain(void)
{uint32i;
sum=0;
for(i=0;i<=N;i++)
{sum+=i;}
while
(1);
}
程序清单2.2TEST1.S文件代码
IMPORT|Image$$RO$$Limit|
IMPORT|Image$$RW$$Base|
IMPORT|Image$$ZI$$Base|
IMPORT|Image$$ZI$$Limit|
IMPORTMain;声明C程序中的Main()函数
AREAStart,CODE,READONLY;声明代码段Start
ENTRY;标识程序入口
CODE32;声明32位ARM指令
ResetLDRSP,=0x40003F00;初始化C程序的运行环境
LDRR0,=|Image$$RO$$Limit|
LDRR1,=|Image$$RW$$Base|
LDRR3,=|Image$$ZI$$Base|
CMPR0,R1
BEQLOOP1
LOOP0CMPR1,R3
LDRCCR2,[R0],#4
STRCCR2,[R1],#4
BCCLOOP0
LOOP1LDR,R1,=|Image$$ZI$$Limit|
MOVR2,#0
LOOP2CMPR3,R1
STRCCR2,[R3],#4
BCCLOOP2
BMain;跳转到C程序代码Main()函数
END
(3)选择Edit->DebugRelSettings...,在DebugRelSettings对话框的左边选择ARMLinker项,然后在Output页设置工程连接地址ROBase为0x40000000,RWBase为0x40003000,在Options页设置调试入口地址Imageentrypoint为0x40000000。
(4)设置位于开始位置的起始代码段,如图2.1所示。
图2.1起始代码段的设置
(5)选择Project->Make,编译连接整个工程。
(6)选择Project->Debug,或者按下快捷键F5,启动AXD调试软件仿真调试。
(7)在Startup.s的“BMain”处设置断点,然后全速运行程序。
(8)程序在断点处停止。
单步运行程序,判断程序是否跳转到C程序中运行。
(9)选择ProcessorViews->Variables打开变量观察窗口,观察全局变量的值,单步/全速运行程序,判断程序的运行结果是否正确。
【思考】
(1)在实验参考程序中,Startup.S文件的作用是什么?
如果没有Startup.S文件,C程序会运行出错吗?
(2)实验程序中的Main()函数名是否可以更改为其它名字?
实验三:
外部中断实验
姓名:
学号:
预习(20%)
操作(40%)
实验报告(40%)
总分
【实验目的】
掌握向量中断控制器(VIC)的设置;掌握外部中断引脚功能设置及外部中断的工作模式设置;了解中断服务函数的编写。
【实验设备】
PC机一台,MagicARM2200教学实验开发平台一套,ADS1.2集成开发环境
【实验内容】
设置P0.20脚为EINT3功能,初始化为非向量中断,并设置为电平触发方式,然后等待外部中断。
中断服务程序将蜂鸣器控制输出信号取反,然后等待中断信号的撤销,最后清除中断标志并退出中断。
【实验步骤】
(1)安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略),为ADS1.2增加LPC2200专用工程模板(若已经增加过,此步省略)。
参考《ADS集成开发环境及仿真器应用》。
(2)启动ADS1.2IDE集成开发环境,使用ARMExecutableImageforMagicARM2200工程模板建立一个工程VICDef_C。
(3)在user组中的main.c中编写主程序代码,参考程序见程序清单3.1。
程序清单3.1外部中断实验参考程序
/****************************************************************************
*文件名:
main.c
*功能:
使用外部中断3进行B1的控制,每当有一次中断时,即取反B1控制口,
*使用非向量中断方式。
*说明:
将跳线器JP9、JP22短接,JP20断开。
按下KEY1观察BUZZER效果。
****************************************************************************/
#include"config.h"
#defineBEEPCON1<<7//P0.7引脚控制B1,低电平蜂鸣,1<<7等价于0x80
/****************************************************************************
*名称:
IRQ_Eint3()
*功能:
外部中断EINT3服务函数,取反B1控制口。
*入口参数:
无
*出口参数:
无
****************************************************************************/
void__irqIRQ_Eint3(void)
{uint32i;
i=IO0SET;//读取当前B1控制值
if((i&BEEPCON)==0)//控制B1输出取反
{IO0SET=BEEPCON;}
else
{IO0CLR=BEEPCON;}
/*等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)*/
while((EXTINT&1<<3)!
=0)
{EXTINT=1<<3;//清除EINT3中断标志,1<<3等价于0x08
}
VICVectAddr=0;//向量中断结束
}
/****************************************************************************
*名称:
main()
*功能:
初始化外部中断3(EINT3)为非向量中断,并设置为电平触发模式,然后等待外部中断。
*说明:
在STARTUP.S文件中使能IRQ中断(清零CPSR中的I位)。
****************************************************************************/
intmain(void)
{
IRQEnable();//开IRQ中断
PINSEL1=3<<8;//设置管脚连接,P0.20设置为EINT3
IO0DIR=BEEPCON;//设置B1控制口为输出,其它I/O为输入
/*打开EINT3中断(使用非向量IRQ)*/
VICIntSelect=0x00000000;//设置所有中断分配为IRQ中断
VICDefVectAddr=(int)IRQ_Eint3;//设置中断服务程序地址
EXTMODE=0x00;//设置EINT3中断为电平触发模式
EXTINT=1<<3;//清除EINT3中断标志
VICIntEnable=1<<17;//使能EINT3中断,EINT3在Bit17上
while
(1);//等待中断
return(0);
}
(4)选用DebugInExram生成目标,选择Project->Make,编译连接整个工程。
(5)连接和MagicARM2200教学实验开发平台。
将EasyJTAG仿真器的25针接口通过并口延长线与PC机的并口连接,将EasyJTAG仿真器20针接口通过20PIN连接电缆接到MagicARM2200教学实验开发平台的J3上,打开实验箱电源。
(6)将MagicARM2200实验教学平台上的跳线器JP9、JP22短接,JP20断开。
(7)选择Project->Debug,或者按下快捷键F5,启动AXD调试软件仿真调试。
(8)在中断服务程序中设置断点,全速运行程序,是EINT3为低/高电平,即反复按下与释放KEY1。
(9)单步/全速运行程序,观察程序是否正确运行,蜂鸣器是否蜂鸣。
【思考】
(1)能否设置P0.9、P0.20、P0.30管脚同时使用EINT3功能?
如果能,那这3个管脚状态与中断是什么逻辑关系?
(假设中断设置为低电平触发模式)
(2)中断服务函数为什么要使用__irq修饰?
(3)在VIC中,如何禁止某一个中断?
假设系统使用了几个IRQ中断,如何一次全部禁止所有中断?
实验四:
定时器实验
姓名:
学号:
预习(20%)
操作(40%)
实验报告(40%)
总分
【实验目的】
熟悉LPC2200系列ARM7微控制器的定时器0/1的基本设置及应用。
【实验设备】
PC机一台,MagicARM2200教学实验开发平台一套,ADS1.2集成开发环境
【实验内容】
使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。
采用软件查询方式等待定时时间到达。
【实验步骤】
(1)安装EasyJTAG仿真器的驱动程序(若已经安装过,此步省略),为ADS1.2增加LPC2200专用工程模板(若已经增加过,此步省略)。
参考《ADS集成开发环境及仿真器应用》。
(2)启动ADS1.2IDE集成开发环境,使用ARMExecutableImageforMagicARM2200工程模板建立一个工程TimerBeep_C。
(3)在user组中的main.c中编写主程序代码,参考程序见程序清单4.1。
程序清单4.1定时器实验参考程序
/****************************************************************************
*文件名:
main.c
*功能:
使用定时器0实现1秒定时,控制蜂鸣器蜂鸣。
(查询方式)
*说明:
JP22跳线短接,JP20跳线断开。
****************************************************************************/
#include"config.h"
#defineBEEPCON1<<7//P0.7引脚控制B1,低电平蜂鸣
/****************************************************************************
*名称:
Time0Init()
*功能:
初始化定时器0,定时时间为1S。
*入口参数:
无
*出口参数:
无
****************************************************************************/
voidTime0Init(void)
{/*Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz
Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz*/
T0PR=99;//设置定时器0分频为100分频,得110592Hz
T0MCR=0x03;//匹配通道0匹配中断并复位T0TC
T0MR0=110592;//比较值(1S定时值)
T0TCR=0x03;//启动并复位T0TC
T0TCR=0x01;
}
/****************************************************************************
*名称:
main()
*功能:
初始化I/O及定时器,然后不断的查询定时器中断标志。
当定时时间到达时,
*取反BEEPCON控制口。
*************************************************************************/
intmain(void)
{
PINSEL0=0x00000000;//设置管脚连接GPIO
IO0DIR=BEEPCON;//设置I/O为输出
Time0Init();//初始化定时器0
while
(1)
{
while((T0IR&0x01)==0);//等待定时时间到
T0IR=0x01;//清除中断标志
if((IO0SET&BEEPCON)==0)
{
IO0SET=BEEPCON;
}
else
{
IO0CLR=BEEPCON;
}
}
return(0);
}
(4)选用DebugInExram生成目标,选择Project->Make,编译连接整个工程。
(5)连接和MagicARM2200教学实验开发平台。
将EasyJTAG仿真器的25针接口通过并口延长线与PC机的并口连接,将EasyJTAG仿真器20针接口通过20PIN连接电缆接到MagicARM2200教学实验开发平台的J3上,打开实验箱电源。
(6)将MagicARM2200实验教学平台上的跳线器JP22短接,JP20断开。
(7)选择Project->Debug,或者按下快捷键F5,启动AXD调试软件仿真调试。
可以全速运行程序,蜂鸣器会响1秒,停1秒,然后再响1秒......依次循环。
【思考】
(1)若要蜂鸣器响0.5秒,停0.5秒,在实验参考程序中应修改什么地方?
(2)若实验参考程序中设置T0PR=0,请使用Fpclk宏来设置T0MR0寄存器,实现1秒或0.5秒定时。
(提示:
Fpclk宏在项目的config.h文件中定义)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 教案