嵌入式系统与应用实验指导08.docx

上传人:b****4 文档编号:26886221 上传时间:2023-06-23 格式:DOCX 页数:24 大小:384.15KB
下载 相关 举报
嵌入式系统与应用实验指导08.docx_第1页
第1页 / 共24页
嵌入式系统与应用实验指导08.docx_第2页
第2页 / 共24页
嵌入式系统与应用实验指导08.docx_第3页
第3页 / 共24页
嵌入式系统与应用实验指导08.docx_第4页
第4页 / 共24页
嵌入式系统与应用实验指导08.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

嵌入式系统与应用实验指导08.docx

《嵌入式系统与应用实验指导08.docx》由会员分享,可在线阅读,更多相关《嵌入式系统与应用实验指导08.docx(24页珍藏版)》请在冰豆网上搜索。

嵌入式系统与应用实验指导08.docx

嵌入式系统与应用实验指导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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1