嵌入式系统与应用实验指导08.docx
《嵌入式系统与应用实验指导08.docx》由会员分享,可在线阅读,更多相关《嵌入式系统与应用实验指导08.docx(24页珍藏版)》请在冰豆网上搜索。
嵌入式系统与应用实验指导08
《嵌入式系统原理及应用》
实验指导书
适用专业:
电气、测控等
课程代码:
8413841
总学时:
48总学分:
3
编写单位:
电气信息学院
编写人:
王平
审核人:
审批人:
批准时间:
年月日
目录
实验一ADS1.2集成开发环境练习4
实验二汇编调用实验与Bootloader下载11
实验三、μC/OS-II移植实验14
实验四、步进电机控制实验17
实验一ADS1.2集成开发环境练习
一、实验目的和任务
了解ADS1.2集成开发环境的使用方法。
建立一个新的工程;建立一个汇编源文件,并添加到工程中;设置文本编辑器支持中文;设置编译链接控制选项;编译链接工程;调试工程。
二、实验设备
装有ADS1.2集成开发环境的PC机
三、实验步骤
1.ADS环境练习。
(1)在D:
\新建一个目录,目录名为experiment。
(2)启动ADS1.2IDE集成开发环境,选择【File】->【New…】,使用ARMExecutableImage工程模板建立一个工程,名称为ADS,目录为D:
\experiment。
(3)选择【File】->【New…】建立一个新的文件TEST1.S,设置直接添加到项目中。
输入如程序代码,并保存,此时在工程窗口中可以看到TEST1.S文件。
(4)选择【Edit】->【Perferences…】,在Font选项设置字体是Fixedsys,Script是CHINESE。
(5)选择【Edit】->【DebugRelSettings…】,在DebugRelSettings对话框的左边选择ARMLinker项,设置链接地址。
(6)选择【Project】->【Make】,或者按下快捷键F7,将编译链接整个工程。
(7)选择【Project】->【Debug】,或者按下快捷键F5。
IDE环境就会启动AXD调试软件,接着可以执行单步、全速运行调试。
注意:
本实验使用软件仿真,所以要在AXD中选择【Options】->【ConfigureTarget…】菜单,然后在ChooseTarget窗口中选用ARMUL软件仿真。
2.ADS1.2操作实例一:
汇编指令实验
使用LDR指令读取0x40003100上的数据,将数据加1,若结果小于10则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址……周而复此循环;
使用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0、R1的值,打开存储器观察窗口(Memory)监视0x40003100上的值。
(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Instruction1。
(2)建立汇编源文件TEST2.S,编写实验程序,然后添加到工程中。
(3)设置工程链接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入口地址Imageentrypoint为0x40000000。
(4)编译链接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。
(6)打开存储器观察窗口(Memory)设置观察地址为0x40003100。
(7)单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,调试时观察寄存器和0x40003100地址上的值。
参考程序:
3.ADS1.2操作实例二:
C语言程序实验
编写一个汇编程序文件Startup.S和一个C程序文件Test.c。
汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后调跳转到C程序运行,这就是一个简单的启动程序。
C程序使用加法运算来计算1+2+3+...+(N-1)+N的值(N>0)。
(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramC。
(2)建立源文件Startup.S和Test.c,编写实验程序,然后添加到工程中。
(3)设置工程链接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入口地址Imageentrypoint为0x40000000。
(4)设置位于开始位置的起始代码段为Startup.o的代码段。
(5)编译链接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
(6)在Startup.S的跳转到C程序入口的代码处设置断点,然后全速动行程序。
(7)程序在断点处停止。
单步运行程序,判断程序是否跳转到C程序中运行。
参考程序:
汇编启动代码:
Startup.s
C语言实验参考程序:
Test.c
四、实验结果与分析
1.ADS中如何实现程序由汇编到C语言的跳转?
2.如何在AXD中观察存储器的内容,如何实现对寄存器的监视?
3.本实验的汇编程序中使用了哪几种寻址方式?
实验二汇编调用实验与Bootloader下载
一、实验目的和任务
学习掌握在C程序调用汇编子程序的方法,本实验实现由C程序调用利用汇编语言实现两个整数的加法运算。
实现将Bootloader下载到SST39VF1601。
二、实验原理
在C程序调用汇编子程序,
三、实验仪器设备
装有ADS的PC机,ARM2410教学实验系统,EasyJTAG-H仿真器。
四、实验步骤
1.在C程序调用汇编子程序,实现两个整数的加法运算。
汇编子程序的原型为:
uint32Add(uint32x,uint32y),其中uint32已定义为unsignedint。
(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程ProgramC1。
(2)建立源文件Startup.S、Add.S和Test.c,编写实验程序,然后添加到工程中。
(3)设置工程链接地址ROBase为0x40000000,RWBase为0x40003000。
设置调试入口地址Imageentrypoint为0x40000000。
(4)设置工程链接选项,位于开始位置的起始代码段设置为Startup.o的代码段。
(5)编译链接工程,选择【Project】->【Debug】,启动AXD进行软件仿真调试。
(6)在Test.c文件中的调用Add()的代码处设置断点,然后全速动行程序。
(7)程序在断点处停止。
使用SetpIn单步运行程序,观察程序是否转到汇编程序Add.S。
(8)单步/全速运行程序,判断程序的运算结果是否正确。
程序清单:
C语言调用汇编程序实验参考程序:
Test.c
#defineuint8unsignedchar
#defineuint32unsignedint
externuint32Add(uint32x,uint32y);
uint32sum;
//调用汇编程序Add实现加法运算
voidMain(void)
{sum=Add(555,168);
while
(1);
}
汇编加法函数代码:
Add.S
;加法函数,原型为uint32Add(uint32x,uint32y)。
EXPORTAdd
AREAAddC,CODE,READONLY;声明代码段AddC
ENTRY;标识程序入口
CODE32;声明32位ARM指令
AddADDR0,R0,R1;输入参数x为R0,y为R1
MOVPC,LR;返回值为R0
END
2.下载Bootloader
使用EasyJTAG-H将ZLG/BOOT下载到SST39VF1601中。
需要ADS1.2软件、基于ADS的WR_NORFLASH.mcp工程、H-JTAG软件和EasyJTAG-H仿真器。
跳线设置:
断开BOOT-SEL跳线JP8,短接蜂鸣器跳线JP9。
将EasyJTAG-H和实验箱相连,运行H-JTAG,打开WR_NORFLASH.mcp工程,打开StartUP.s,文件,将下面的代码添加进文件中“ResetInit”函数相应位置。
ResetInit
BLInitStack;初始化堆栈
BLTargetBusInit;总线系统初始化(函数中不允许堆栈操作)
BLTargetResetInit;针对目标板的系统初始化
MRCp15,0,R1,c1,c0,0;(MMU设置,异步总线模式)读控制寄存器
ORRR1,R1,#0xC0000000;当HDIVN=1时操作有效
MRCp15,0,R1,c1,c0,0
B__main;跳转到c语言入口
B.;如果main返回,则死循环
;/*包含要烧写的bin文件*/
EXPORTFLASH_FUNCTION
EXPORTFLASH_FUNCTION_END
FLASH_FUNCTION
INCBINflash.bin
FLASH_FUNCTION_END
选择DebugRel生成目标,进入AXD调试环境。
在语句while
(1)处设置断点,然后全速运行程序,或者将光标放置在while
(1)处后运行到此处。
程序停止后,如果蜂鸣器鸣叫一声则表示已经正确将ZLG/BOOT下载到SST39VF1601中,然后后将实验箱断电即可;如果蜂鸣器连续鸣叫则表示下载出错,需要重新下载。
下载完毕,将EasyJTAG-H拔掉,以便启动系统。
2启动ZLG/BOOT
设置串口终端(115200-8-N-1,无流控制)。
将PC串口和实验箱右侧的UART0相连,然后启动实验箱,将会得到如图所示的ZLG/BOOT启动界面。
五、实验结果与分析
1.如何实现在C程序中调用汇编?
2.下载Bootloader有哪些步骤?
实验三、μC/OS-II移植实验
一、实验目的和任务
掌握将μC/OS-II操作系统移植到ARM9处理器的方法。
了解μC/OS-II操作系统的基本原理和移植条件。
学习移植μC/OS-II操作系统到ARM9处理器,然后编写一个简单的多任务应用程序,实现LED流水灯控制。
二、实验设备
装有ADS1.2集成开发环境的PC机、MagicARM2410教学实验开发平台
三、实验原理
●μC/OS-II概述
μC/OS-II是一个完整的、可移植、可固化、可剪裁的占先式实时多任务内核。
µC/OS-II是用ANSIC语言编写,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。
µC/OS-II可以管理64个任务,具有信号量、互斥信号量、事件标志组、消息邮箱、消息队列、任务管理、时间管理和内存块管理等系统功能。
●μC/OS-II软件体系结构
如图3.1所示,由图可以看出,μC/OS-II包括以下3个部分:
(1)μC/OS-II核心代码:
包括10个C程序文件和1个头文件,主要实现了系统调度、任务管理、内存管理、信号量、消息邮箱和消息队列等系统功能。
此部分的代码与处理器无关。
(2)μC/OS-II配置代码:
包括2个头文件,用于裁剪和配置μC/OS-II。
此部分的代码与用户实际应用相关。
(3)μC/OS-II移植代码:
包括1个汇编文件、1个C程序文件和1个头文件,这是移植
μC/OS-II所需要的代码。
此部分的代码与处理器相关。
●μC/OS-II移植条件
移植μC/OS-II之前需要注意,目标处理器必须满足以下几点要求:
(1)处理器的C编译器能产生可重入型代码;
(2)处理器支持中断,并且能产生定时中断;
(3)用C语言就可以开/关中断;
(4)处理器有将堆栈指针以及其它CPU寄存器的内容读出,并保存到堆栈或内存中去的指令。
S3C2410A微控制器可以满足第2、4和5点要求,使用ADS1.2的C编译器可以满足第1、3点要求。
●μC/OS-II移植步骤:
(1)OS_CPU.H的移植
在OS_CPU.H文件中定义与处理器相关(实际上是与编译器相关)的数据类型,如BOOLEAN、INT8U、INT8S等等。
在OS_CPU.H文件中定义与处理器相关的宏,主要是进入临界区的OS_ENTER_CRITICAL和退出临界区的OS_EXIT_CRITICAL,所以还要编写相应的软件中断处理代码(可以在OS_CPU_C.C文件中编写)实现开/关中断。
同样定义OS_TASK_SW()为软件中断函数,并编写有相应的软件中断处理代码(调用OSIntCtxSw函数)实现任务切换。
(2)OS_CPU_C.C的移植
在OS_CPU_C.C文件中,需要编写以下10个简单的C函数:
OSTaskStkInit();OSTaskCreateHook();OSTaskDelHook();OSTaskSwHook();OSTaskIdleHook();OSTaskStatHook();OSTaskTickHook();
OSInitHookBegin();OSInitHookEnd();OSTCBInitHook()。
其中,9个系统Hook函数可以为空函数,也可以根据用户自己的需要编写相应的操作代码。
任务栈结构初始化函数OSTaskStkInit,必须根据移植时统一定义的任务堆栈结构进行初始化。
(3)OS_CPU_A.S的移植
由于ADS1.2编译器默认汇编文件后缀名为“S”,所以移植代码OS_CPU_A.ASM改名为OS_CPU_A.S。
在OS_CPU_A.S文件中,需要编写以下4个简单的汇编语言函数:
OSStartHighRdy();OSCtxSw();OSIntCtxSw();OSTickISR()。
其中,函数OSCtxSw不是必须的,但必须要定义好函数OS_TASK_SW(在OS_CPU.H中声明),以实现任务级任务切换。
(3)OS_CPU_A.S的移植
在ISR中切换任务时会调用OSIntCtxSw函数。
启动µC/OS-II是通过调用OSStart()实现,OSStart()最终调用函数OSStartHighRdy()运行多任务启动前优先级最高的任务。
函数OSTickISR为系统时钟节拍中断函数,这需要使用到处理器的定时器和定时中断。
为了达到集中地初始化硬件(定时器、中断和I/O等)的目的,此函数可以在用户工程的起动代码文件中实现。
四、实验步骤
(1)为ADS1.2增加DeviceARM2410专用工程模板(若已增加过,此步省略)。
(2)连接EasyJTAG-H仿真器和MagicARM2410实验箱,然后安装EasyJTAG-H仿真器(若已经安装过,此步省略),短接蜂鸣器跳线JP9。
(3)启动ADS1.2,使用ARMExecutableImageforDeviceARM2410(uCOSII)工程模板建立一个工程Demo_uCOSII。
(本范例在ADS文件夹中操作)
(4)在ADS文件夹中新建arm、Arm_Pc、SOURCE文件夹。
将μC/OS2.52源代码添加到SOURCE文件夹,将移植代码添加到arm文件夹,将移植的PC服务代码添加到Arm_Pc文件夹。
(移植代码、μC/OS2.52源代码可以从实验附件获得)
(5)在src组中的main.c中编写主程序代码。
(6)根据程序设计来更改Os_cfg.h文件,配置μC/OS-II操作系统。
(对于本实验,μC/OS-II的配置使用模板默认设置即可)
(7)选用DebugRel生成目标,然后编译链接工程。
(8)将MagicARM2410实验箱上的蜂鸣器跳线JP9短接,将启动方式选择跳线JP8短接,然后按RST键复位系统。
(9)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
(10)全速运行程序,程序将会在main.c的主函数中停止(因为main函数起始处默认设置有断点)。
(11)单击ContextVariable图标按钮(或者选择【ProcessorViews】->【Variables】)打开变量观察窗口,通过此窗口可以观察局部变量和全局变量。
(12)可以单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行,观察变量的值,判断蜂鸣器及LED1~LED4的控制是否正确。
五、实验结果与分析
1.移植μC/OS-II需要编写哪些函数?
2.移植μC/OS-II需要哪些条件?
实验四、步进电机控制实验
一、实验目的和任务
了解步进电机的控制原理,掌握电机转动控制和调速方法。
通过4个GPIO输出有序的矩形脉冲,控制ULN2003驱动四相步进电机实现正转,调速的功能;控制的方法采用双四拍(AB―BC―CD―DA―AB);
二、实验设备
装有ADS1.2集成开发环境的PC机、MagicARM2410教学实验开发平台
三、实验原理
步进电机是一种将电脉转换为角位移的数据控制电机,即给它一个脉冲信号,它就按设定的方向转动一个固定的角度。
用户可以通过控制脉冲的个数来控制角位移量,从而实现准确的定位操作;另外,通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。
当然,对于步进电机各相绕组(即内部线圈)的控制脉冲要有一定的顺序,否则电机无法正常旋转;
MagicARM2410实验箱上的步进电机为四相步进电机,电机步距角为18度。
S3C2410A的GPIO驱动能力有限,必须通过ULN2003达林顿集成驱动芯片驱动步进电机,在步进电机和驱动电路之间连接了电阻,防止控制紊乱造成电机的损坏;
四、实验步骤
(1)启动ADS1.2,使用ARMExecutableImageforDeviceARM2410工程模板建立一个工程StepMoto。
(2)在工程src组中的main.c中编写实验代码。
(3)选用DebugRel生成目标,然后编译链接工程。
(4)将MagicARM2410实验箱上的步进电机控制电路的电源跳线JP5短接,将步进电机控制口跳线JP6短接。
(5)选择【Project】->【Debug】,启动AXD进行JTAG仿真调试。
(6)全速运行程序,观察步进电机转动方向及速度。
(7)改变控制步序延时参数,观察步进电机转动的速度。
程序清单:
main.c
/****************************************
--------------FileInfo-------------------------------------------------------------------------------
**FileName:
main.c
**Description:
MagicARM2410实验箱的基础实验---步进电机控制实验。
**使用GPIO控制步进电机转动,采用双四拍控制方式。
**----------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include"config.h"
//步进电机控制口线及操作宏函数定义
#defineMOTOA(1<<5)/*GPC5*/
#defineMOTOB(1<<6)/*GPC6*/
#defineMOTOC(1<<7)/*GPC7*/
#defineMOTOD(1<<0)/*GPC0*/
#defineGPIOSET(PIN)rGPCDAT=rGPCDAT|PIN/*设置PIN输出1,PIN为MOTOA--MOTOD*/
#defineGPIOCLR(PIN)rGPCDAT=rGPCDAT&(~PIN)/*设置PIN输出0,PIN为MOTOA--MOTOD*/
/*********************************************************************************************************
**Functionname:
DelayNS
**Descriptions:
长软件延时。
**延时时间与系统时钟有关。
**Input:
dly延时参数,值越大,延时越久
**Output:
无
********************************************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
/*********************************************************************************************************
**Functionname:
MOTO_Mode2()
**Descriptions:
步进电机双四拍程序。
**时序控制为AB--BC--CD--DA--AB,共控制运转4圈(电机步距角为18度)。
**Input:
dly每一步的延时控制。
值越大,延时越久
**Output:
无
********************************************************************************************************/
voidMOTO_Mode2(uint8dly)
{
uint32i;
for(i=0;i<20;i++)
{
//AB相有效
GPIOSET(MOTOA);
GPIOSET(MOTOB);
DelayNS(dly);
GPIOCLR(MOTOA);
GPIOCLR(MOTOB);
//BC相有效
GPIOSET(MOTOB);
GPIOSET(MOTOC);
DelayNS(dly);
GPIOCLR(MOTOB);
GPIOCLR(MOTOC);
//CD相有效
GPIOSET(MOTOC);
GPIOSET(MOTOD);
DelayNS(dly