ZF嵌入式实验Word文档格式.docx
《ZF嵌入式实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《ZF嵌入式实验Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
![ZF嵌入式实验Word文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/3/4b3181bc-f1bf-4122-b223-eada9828c2cb/4b3181bc-f1bf-4122-b223-eada9828c2cb1.gif)
段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。
可执行映像文件通常由以下几部分构成:
◆一个或多个代码段,代码段为只读属性。
◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。
◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。
源程序中段之间相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。
实验三:
1.ARM使用C语言编程是大势所趋
在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不易移植。
由于ARM的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。
因此,C语言的在ARM编程中具有重要地位。
2.ARMC语言程序的基本规则
在ARM程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。
C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件紧密相关。
在使用C语言时,要用到和汇编语言的混合编程。
当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通过ATPCS的规定与C程序相互调用与访问。
ATPCS,就是ARM、Thumb的过程调用标准(ARM/ThumbProcedureCallStandard),它规定了一些子程序间调用的基本规则。
如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
在C程序和ARM的汇编程序之间相互调用必须遵守ATPCS。
而使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS的规则。
但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循ATPCS的规则。
具体来说,汇编语言的子程序应满足下面3个条件:
●在子程序编写时,必须遵守相应的ATPCS规则;
●堆栈的使用要遵守相应的ATPCS规则;
●在汇编编译器中使用-atpcs选项。
基本的ATPCS规定,请详见提供的相关PDF文档。
汇编程序调用C程序
汇编程序的设置要遵循ATPCS规则,保证程序调用时参数正确传递。
在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。
在调用C程序时,要正确设置入口参数,然后使用BL调用。
C程序调用汇编程序
在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可调用此子程序。
在C语言中使用extern关键字声明外部函数(声明要调用的汇编子程序)。
在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的Startup2410/INC目录下都有一个2410addr.h的头文件,那里面定义了所有关于2410的硬件寄存器的宏,对宏的读写,就能操作2410的硬件。
具体的编程规则同标准C语言。
在ARM中,有两类中断,一类是IRQ,一类是FIQ,IRQ是普通中断FIQ是快速中断,在进行大批量的复制、数据转移等工作时,常使用此类中断。
FIQ的优先级高于IRQ。
同时,它们都属于ARM的异常模式,当一旦有中断发生,不管是外部中断,还是内部中断,正在执行的程序都会停下,PC指针进而跳入异常向量的地址处,若是IRQ中断,则PC指针跳到0x18处,若是FIQ中断,则跳到0x1C处。
异常向量地址处,一般存有中断服务子程序的地址,所以,接下来PC指针跳入中断服务子程序中。
当完成中断服务子程序后,PC指针会返回到被打断的程序的下一条地址处,继续执行程序。
这就是ARM中断操作的基本原理。
但是,通常由于生产ARM处理器的各厂家都集成了很多中断请求源,比如,串口中断、AD中断、外部中断、定时器中断、DMA中断等等,所以,很多中断可能同时请求中断,因此,为区分它们,更准确的完成任务,这些中断都有相应的优先级别,以及当发生中断时,它们都有相应的中断标志位,通过在发生中断是判断中断优先级,和访问中断标志位的状态来识别到底哪一个中断发生了。
三仪器设备:
实验二1.EL-ARM-830+教学实验箱,PentiumII以上的PC机,仿真调试电缆,串口直连电缆;
2.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真调试驱
动程序。
1.EL-ARM-830+教学实验箱,PentiumII以上的PC机,仿真调试电缆,串口直连电缆;
2.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真调试驱动程序。
1.EL-ARM-830+教学实验箱,PentiumII以上的PC机,仿真调试电缆;
2.PC操作系统WIN98或WIN2000或WINXP,ADS1.2集成开发环境,仿真调试驱
动程序。
实验步骤:
.本实验仅使用实验教学系统的核心CPU板。
在进行本实验时,LCD电源开关,音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
2.在PC机并口和实验箱的CPU板上的JTAG接口之间,连接仿真调试电缆以及串口间连接公/母接头串口线。
3.打开超级终端,配置串口的属性(如COM1),配置波特率为115200,校验位无,数据位为8,停止位为1,数据控制流为无;
检查连接是否可靠,可靠后,接入电源线,系统上电,同时按住“空格”键,进入VIVI状态。
4.打开ADS1.2开发环境,从里面打开\实验程序\HARDWARE\ADS\实验六\Interrupt.mcp项目文件,进行编译。
5.编译通过后,进入ADS1.2调试界面,加载\实验程序\HARDWARE\ADS\实验六\Interrupt_Data\Debug中的映象文件程序映像Interrupt.axf。
6.在ADS调试环境下全速运行映象文件。
观察LED1和LED2的变化!
LED1和LED2灯会由于定时中断的1秒钟发生一次,而一秒钟闪烁一次!
也可以改变闪烁的频率,即改变Startup2410\target.c文件内的voidTimer1_init(void)函数里的rTCNTB1=48828;
的赋值,数字量越小,闪烁频率越快。
编译全速运行,观看结果,看闪烁频率是否发生了改变!
这是对GPIO口操作的结果。
具体实现见程序。
1.本实验仅使用实验教学系统的CPU板,串口。
在进行本实验时,LCD电源开关、音频的左右声道开关、AD通道选择开关、触摸屏中断选择开关等均应处在关闭状态。
2.在PC机并口和实验箱的CPU板上的JTAG接口之间,连接仿真调试电缆,以及串口间连接公/母接头串口线。
4.打开ADS1.2开发环境,从里面打开\实验程序\HARDWARE\ADS\实验三\C.mcp项目文件,进行编译。
5.编译通过后,进入ADS1.2调试界面,加载\实验程序\HARDWARE\ADS\实验三\C_Data\Debug中的映象文件程序映像C.axf。
6.在ADS调试环境下全速运行映象文件,之后,关闭超级终端,打开/实验软件/tools/目录下的串口调试助手工具,配置为波特率为115200,校验位无,数据位为8,停止位为1。
不要选十六进制显示,应出现图2-3-1界面。
本程序连续发送55。
图2-3-1
下边分析主程序的源码:
在C程序前的部分为系统的初始化,这在后边BOOTLOADER的章节里,要详细介绍。
#include"
..\inc\config.h"
//嵌入包括硬件的头文件
unsignedchardata;
//定义全局变量
voidMain(void)
{
Target_Init();
//目标板初始化,定义串口的硬件初始化在
//target.c中定义
Delay(10);
//延时
data=0x55;
//给全局变量赋值
while
(1)
{
Uart_Printf("
%x"
data);
//串口0输出
}
}
1.本实验仅使用实验教学系统的核心CPU板。
五实验源代码
1.实验二:
基于ARM的汇编语言程序设计
在UART前的部分为系统的初始化,这在后边BOOTLOADER的章节里,要详细介绍。
UART后的程序为主程序,在程序中找到下面这部分的代码,
//呼叫主应用程序
bUART
UART
ldrr0,=GPHCON;
//设置GPIO(RxD0,TxD0引脚)
ldrr1,=0x2afaaa
strr1,[r0]
ldrr0,=GPHUP
ldrr1,=0x7ff
strr1,[r0];
//GPH[10:
0]禁止上拉
ldrr0,=UFCON0;
//禁用FIFO
ldrr1,=0x0
ldrr0,=UMCON0;
//禁用AFC
ldrr0,=ULCON0;
//设置线寄存器
ldrr1,=0x3;
//正常模式,无奇偶校验,一个停止位,8个数据位
ldrr0,=UCON0;
//设置Uart0控制器
ldrr1,=0x245;
//RX边沿触发,TX电平触发,禁用延时中断,使用RX错误中断,正常
操作模式,中断请求或表决模式
ldrr0,=UBRDIV0;
//设置波特率为115200
ldrr1,=0x1a;
//int(50700000/16/115200)-1=26
movr1,#100
Delay
subr1,r1,#0x1
bneDelay
;
//开中断
ldrr0,=INTMSK
ldrr1,[r0]
andr1,r1,#0xefffffff
MOVR5,#127;
//设置要打印的字符的个数
MOVR1,#0x0;
//设置要打印的字符
LOOP
LDRR3,=UTRSTAT0
LDRR2,[R3]
TSTR2,#0x04;
//判断发送缓冲区是否为空
BEQLOOP;
//为空则执行下边的语句,不为空则跳转到LOOP
LDRR0,=UTXH0
STRR1,[R0];
//向数据缓冲区放置要发送的数据
ADDR1,R1,#1
SUBR5,R5,#0x01;
//计数器减一
CMPR5,#0x0
BNELOOP
LOOP2BLOOP2
2.基于ARM的C语言程序设计
puts(“hello,world”);
3.ARM的中断实验
#include<
stdlib.h>
string.h>
..\..\Application\inc\config.h"
voidHaltUndef(void)
{
Undefinedinstructionexception.\n"
);
while
(1);
voidHaltSwi(void)
SWIexception.\n"
voidHaltPabort(void)
Pabortexception.\n"
voidHaltDabort(void)
Dabortexception.\n"
voidIsr_Init(void)
pISR_UNDEF=(unsigned)HaltUndef;
pISR_SWI=(unsigned)HaltSwi;
pISR_PABORT=(unsigned)HaltPabort;
pISR_DABORT=(unsigned)HaltDabort;
rINTMOD=0x0;
//Interruptmoderegiseter.
0=IRQmode1=FIQmode
rINTMSK=BIT_ALLMSK;
//Determinewhichinterruptsource
ismasked.
Themaskedinterruptsourcewillnotbe
serviced.
0=Interruptserviceisavailable.
1=Interruptserviceismasked..
rINTSUBMSK=BIT_SUB_ALLMSK;
//Determinewhichinterrupt
sourceismasked.Themasked
interruptsourcewillnotbeserviced.
1=Interruptserviceismasked.
voidTarget_Init(void)
MMU_Init();
ChangeClockDivider(1,1);
//1:
2:
4
ChangeMPllValue(0xa1,0x3,0x1);
//FCLK=202.8MHz
Port_Init();
Isr_Init();
Uart_Init(0,115200);
Uart_Select(0);
六实验现象
1基于ARM的汇编语言程序设计
2基于ARM的C语言程序设计
3.ARM的中断实验
在该实验中,按下程序启动后,初始化定时器1,设定定时器的中断时间,然后,等待定时器中断,当定时器中断到来时,就会进入定时器中断服务子程序,而中断服务子程序会把LED1和LED2灯熄灭或点亮,从现象中看到LED1和LED2灯忽闪一次,则说明定时器发生了一次中断。
最后,关闭中断请求,等待下一次的中断的到来。
为使CPU响应中断,在中断服务子程序执行之前,必须打开ARM920T的CPSR中的I位,以及相应的中断屏蔽寄存器中的位。
七、实验体会
1.基于ARM的汇编语言程序设计
1.1S3C2410的串口UART概述
(1)S3C2410异步串行通信(UART)单元
S3C2410UART单元提供3个独立的异步串行通信接口,皆可工作于查询、中断和DMA模式。
使用系统时钟最高波特率达230.4kb/s,如果使用外部设备提供的时钟,可以达到更高的速率。
每一个UART单元包含一个16字节的FIFO(FirstInputFirstOutput,先进先出移位寄存器),用于数据的接收和发送。
S3C2410UART支持可编程波特率、红外发送/接收(UART2)、1个或2个停止位、5位/6位/7位/8位数据宽度和奇偶校验。
(2)波特率的产生
波特率由一个专用的UART波特率分频寄存器(UBRDIVn)控制,UBRDIVn值计算公
如下:
UBRDIVn=(int)[ULK/(波特率×
16)]-1
或者UBRDIVn=(int)[PLK/(波特率×
式中:
时钟选用ULK还是PLK由UART控制寄存器UCONn[10]的状态决定。
如果UCONn[10]=0,则用PLK作为波特率发生器的时钟源频率;
否则选用ULK作为波特率发生器的时钟源频率。
UBRDIVn的值必须在1~(216-1)之间。
例如:
若ULK或者PLK等于40MHz,当波特率为115200b/s时,则
UBRDIVn=(int)[40000000/(115200×
16)]一1=int(21.7)-1=21-1=20
(3)UART通信操作
下面简略介绍UART操作,关于数据发送、数据接收、中断产生、波特率产生、查询检测模式。
发送数据帧是可编程的。
一个数据帧包含1个起始位、5~8个数据位、1个可选的奇偶校验位和1~2位停止位,停止位通过行控制寄存器ULCONn配置。
与发送数据帧类似,接收数据帧也是可编程的。
接收帧由1个起始位、5~8个数据位、l个可选的奇偶校验位以及1~2位行控制寄存器ULCONn中设定的停止位组成。
接收器还可以检测溢出错、奇偶校验错、帧错误和传输中断,每一个错误均可以设置一个错误标志。
1.2UART的控制寄存器
(1)UART行控制寄存器ULCONn
该寄存器的位6决定是否使用红外模式,位5、位4和位3决定校验方式,位2决定停止位长度,位1和位0决定每帧的数据位数。
具体如下:
ULCONn[7]保留;
ULCONn[6]红外线模式,0:
正常模式;
1:
红外线模式;
ULCONn[5:
3]校验模式,0xx:
无校验;
100:
奇校验;
101:
偶校验;
ULCONn[2]停止位,0:
一个停止位;
二个停止位;
ULCONn[1:
0]数据位,00:
5位;
01:
6位;
10:
7位;
11:
8位。
(2)UART控制寄存器UCONn
该寄存器决定UART的各种模式。
UCONn[10]1:
ULK做波特率发生器;
0:
PLK做波特率发生器。
UCONn[9]1:
Tx中断电平触发;
Tx中断脉冲触发。
UCONn[8]1:
Rx中断电平触发;
Rx中断脉冲触发。
UCONn[7]1:
接收超时中断允许;
接收超时中断禁止。
UCONn[6}1:
产生接收错误中断;
不产生接收错误中断。
UCONn[5]l:
发送直接传给接收方式(loopback);
正常模式。
UCONn[4]1:
发送间断信号;
正常模式发送。
UCONn[3:
2]发送模式选择:
00:
禁止发送;
01:
中断或查询模式;
10:
DMA0请求(UART0),DMA3请求(UART2);
11:
DMAl请求(UART1)。
UCONn[1:
0]接收模式选择。
禁止接收;
10:
DMA0请求UART0,DMA2请求UART2;
DMAl请求UART1。
(3)UARTFIFO控制寄存器UFCONn
UFCONn[7:
6]
TxFIFO寄存器中有0字节就触发中断;
TxFIFO寄存器中有4字节就触发中断;
TxFIFO寄存器中有8字节就触发中断;
TxFIFO寄存器中有12字节就触发中断。
UFCONn[5:
4]
RxFIFO寄存器中有4字节就触发中断;
RxFIFO寄存器中有8字节就触发中断;
RxFIFO寄存器中有12字节就触发中断;
RxFIFO寄存器中有16字节就触发中断。
UFCONn[3]保留。
UFCONn[2]1:
FIFO复位清零Tx