嵌入式微处理器编程基础实验项目.docx
- 文档编号:30068499
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:32
- 大小:136.93KB
嵌入式微处理器编程基础实验项目.docx
《嵌入式微处理器编程基础实验项目.docx》由会员分享,可在线阅读,更多相关《嵌入式微处理器编程基础实验项目.docx(32页珍藏版)》请在冰豆网上搜索。
嵌入式微处理器编程基础实验项目
嵌入式微处理器编程基础
实验指导书
电子科技大学嵌入式软件工程中心
1.ARM指令实验2
1.1ARM汇编指令实验2
1.1.1实验目的2
1.1.2实验设备3
1.1.3实验内容3
1.1.4实验原理3
1.1.5实验程序4
1.2Thumb汇编指令实验5
1.2.1实验目的5
1.2.2实验设备5
1.2.3实验内容5
1.2.4实验原理6
1.2.5实验程序6
1.3ARM处理器工作模式实验7
1.3.1实验目的7
1.3.2实验设备7
1.3.3实验内容7
1.3.4实验原理8
1.3.5实验程序9
2.接口基本实验9
2.1存储器实验9
2.1.1实验目的9
2.1.2实验设备9
2.1.3实验内容9
2.2I/O接口实验10
2.2.1实验目的10
2.2.2实验设备10
2.2.3实验内容10
2.3中断实验10
2.3.1实验目的10
2.3.2实验设备10
2.3.3实验内容10
1.ARM指令实验
1.1ARM汇编指令实验
1.1.1实验目的
●熟悉使用LambdaIDE开发环境,初步学会搭建嵌入式开发环境。
●通过实验掌握简单的ARM汇编指令的使用方法。
1.1.2实验设备
●硬件:
PC机,华邦W90P710开发板套件。
●软件:
LambdaIDE集成开发环境,Windows2000/NT/XP。
1.1.3实验内容
●熟悉开发环境,并使用LDR/STR和MOV指令等访问寄存器或存储单元。
●使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。
1.1.4实验原理
ARM指令集是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。
RICS指令集的一个显著特点为:
访问存储器只能通过Load/Store两种指令完成。
其它指令只能对寄存器和立即数操作。
ARM提供了LDR/STR两条指令实现了访存操作,同时,为了提高访存速度,还提供了LDM/STM用于批量访存。
ARM处理器共有37个寄存器。
其中包括31个通用寄存器和6个状态寄存器。
对应于ARM的7种不同处理器模式,每一种模式下都有一组相应的寄存器组。
在任何时刻,可见的寄存器包括15个通用寄存器(R0-R14),一个或两个状态寄存器及程序计数器(PC)。
寄存器与处理器模式的对应关系如图1-1所示:
图1-1ARM处理器模式与寄存器的关系
以上的寄存器按功能可以分了两类:
通用寄存器和状态寄存器。
其中通用寄存器中的R13、R14和R15按管理分别被用作堆栈指针寄存器(SP)、返回地址寄存器(SP)和程序寄存器(PC)。
状态寄存器只有两种:
CPSR和SPSR。
●通用寄存器
通用寄存器包括R0~R15,可以分为三类:
1.未分组寄存器R0~R7,它们在每个模式下都对应同一个物理寄存器。
2.分组寄存器R8~R14,又称影子寄存器,不同模式下的寄存器对应的物理寄存器不同。
3.程序计数器PC(R15)。
●程序状态寄存器
关于程序状态寄存器的介绍,详见1.3.4节
1.1.5实验参考程序
.equa,12/*定义变量a,并赋值12*/
.equb,3/*定义变量b,并赋值3*/
.equc,7/*定义变量c,并赋值87*/
.equstack_top,0x1000/*定义堆栈栈顶为0x1000*/
.global_start
.text
_start/*程序入口*/
MOVr0,#a/*将r0置为12*/
MOVr0,r0,lsl#8/*r0=r0<<8,相当于将r0乘以2的8次*/
MOVr1,#b/*将r1置为3*/
ADDr2,r0,r1,lsr#1/*r2=r0+r1>>1,将r1的值除以2加上r0放入r2*/
MOVsp,#0x1000/*将堆栈指针置为0x1000*/
STRr2,[sp]/*将运算结果放入堆栈*/
MOVr0,#c/*将r0置为7
ANDr0,r0,#0xFF/*r0=r0&0xFF*/
MOVr1,#b/*将r1置为3*/
ADDr2,r0,r1,lsr#1/*r2=r0+r1>>1,将r1的值除以2加上r0放入r2*/
LDRr0,[sp]/*从堆栈中取出第一次的运算结果*/
MOVr1,#0x01/*将r1置为1*/
ORRr0,r0,r1/*r0=r0|r1*/
MOVr1,r2/*将第二次运算结果放入r1*/
ADDr2,r0,r1,lsr#1/*r2=r0+r1>>1,将r1的值除以2加上r0放入r2*/END:
BEND/*无条件跳转至END标号,形成死循环*/
1.2Thumb汇编指令实验
1.2.1实验目的
通过实验掌握ARM处理器16位汇编指令的使用方法。
1.2.2实验设备
●硬件:
PC机,华邦W90P710开发板套件。
●软件:
LambdaIDE集成开发环境,Windows2000/NT/XP。
1.2.3实验内容
●使用Thumb汇编语言,完成基本的寄存器/存储器访问,以及基本的算术的逻辑/运算
●使用Thumb汇编语言,完成较为复杂的程序分支、PUSH/POP的使用,领会立即数大小的限制,并体会ARM与Thumb的区别。
1.2.4实验原理
ARM处理器有两种工作状态:
⏹ARM状态:
32-bit,按字排列的ARM指令集。
⏹Thumb状态:
16-bit,按半字排列的Thumb指令集。
引入Thumb状态的原因有以下两点:
⏹优化了的代码密度,Thumb指令集是ARM指令集的一个子集。
⏹在窄内存(16位)的情况下,Thumb状态指令集有更好的表现。
注意:
因为Thumb状态下是半字寻址,所以PC寄存器的最低位bit[0]为0,而ARM状态下为字寻址,所以PC寄存器的bit[1:
0]为0。
ARM/Thumb状态的切换:
进入Thumb状态:
⏹当操作数寄存器的状态位为1时,执行BX指令进入Thumb状态。
⏹如果处理器在Thumb状态进入异常(ARM状态),则当从异常返回时,自动切换到Thumb状态。
进入ARM状态:
⏹执行BX指令,并设置操作数寄存器的状态(bit[0])为0;
⏹进入异常时,将PC放入异常模式链接寄存器中,从异常向量地址开始执行也可以进入ARM状态。
Thumb状态的寄存器结构:
Thumb指令集是ARM指令集的一个子集,程序员可以直接访问的寄存器有R0~R7,PC,SP,LR,CPSR寄存器。
Thumb状态和ARM状态的寄存器对应关系如图1-2所示:
图1-2Thumb状态和ARM状态的寄存器对应关系
1.2.5实验参考程序
.globaltest
.text
.arm/*标志当前指令为ARM指令代码*/
test:
ADRr0,Into_Thumb+1/*在R0中写入要跳转的条件代码,并对bit[0]置位*/
BXr0/*通过判断R0的值进行跳转*/
/*进入Thumb指令状态*/
NOP
.thumb/*标志当前指令为ARM指令代码*/
Into_Thumb:
ADRr5,Back_to_ARM/*产生字对齐的跳转地址*/
BXr5/*返回ARM状态*/
stop:
bstop
.arm
Back_to_ARM
.end
1.3ARM处理器工作模式实验
1.3.1实验目的
●通过实验掌握学会使用MSR/MRS指令实现ARM处理器工作模式的切换,观察不同模式下的寄存器,加深对CPU结构的理解。
●通过实验掌握ld中如何使用命令行指定代码段起始地址。
1.3.2实验设备
●硬件:
PC机,华邦W90P710开发板套件。
●软件:
LambdaIDE集成开发环境,Windows2000/NT/XP。
1.3.3实验内容
通过ARM汇编指令,在各种处理器模式下切换并观察各种模式下寄存器的区别;掌握ARM不同模式的进入与退出。
1.3.4实验原理
ARM处理器共有7种运行模式,如表1-1所示:
表1-1ARM处理器模式
处理器模式
描述
用户模式(User)
正常程序执行模式,用于应用程序
快中断模式(FIQ)
用于高速数据传输和通道处理
外部中断模式(IRQ,irq)
用于通常的中断处理
特权模式(Supervisor,sve)
供操作系统使用的一种保护模式
数据访问终止模式(Abort,abt)
用于虚拟存储及存储保护
未定义指令终止模式(Undefined,und)
用于支持通过软件仿真硬件的协处理器
系统模式(System,sys)
用于运行特权级的操作系统任务
除了用户模式之外的其它6种处理器称为特权模式(PrivilegedModes),在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。
其中,除系统模式外,其他5种特权模式又称为异常模式。
模式控制主要通过ARM寄存器程序状态寄存器控制,主要包括CPSR和SPSR寄存器。
1.CPSR(当前程序状态寄存器)
CPSR可在任何运行模式下被访问,包括条件标志位、中断禁止位、模式标志位,以及其他一些相关的控制和状态位。
各个位情况如表1-2所示:
表1-2CPSR寄存器标志位情况
N
Z
C
V
Q
I
F
T
M4
M3
M2
M1
M0
其中N、Z、C、V、Q对应[31:
27]位,统称为条件标志位,ARM指令可以根据这些条件标志位选择性的执行。
I、F、T及M[4:
0]对应[7:
0]位,统称为控制位。
当异常发生时,这些位发生变化。
控制位对ARM的控制如下:
●中断禁止位I、F:
当I、F=1时表示禁止IRQ、FIQ中断,为0时则打开IRQ、FIQ中断。
处理器可以根据需要在不同的工作状态下工作,T控制位就是为了支持Thumb指令集而设置的。
T=0表示执行ARM指令集,T=1表示执行Thumb指令集
●M控制位:
控制位M[4:
0]控制处理器的模式,具体的含义如表1-3所示:
表1-3处理器模式选择
M[4:
0]
处理器模式
0b10000
User
0b10001
FIQ
0b10010
IRQ
0b10011
Supervisor
0b10111
Abort
0b11011
Undefined
0b11111
System
2.SPSR(备份程序状态寄存器)
当异常发生时,SPSR用于保存CPSR的当前值,从异常退出时则可由SPSR来恢复CPSR。
1.3.5实验参考程序
.text
.global_start
_start:
/*安装中断向量表*/
/*只定义了Reset_Handler入口,其它中断跳转到自身*/
BReset_Handler
Undefined_Handler:
BUndefined_Handler
SWI_HandlerBSWI_Handler
Prefetch_Handler:
BPrefetch_Handler
NOP
IRQ_Handler:
BIRQ_Handler
FIQ_HandlerBFIQ_Handler
Reset_Handler:
/*intoSystemmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x1F
MSRCPSR,r0
/*intoFIQmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x11
MSRCPSR,r0
/*注意在调试器中观察该模式下的寄存器r8-r14有无发生变化*/
/*intoSVCmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x13
MSRCPSR,r0
/*注意在调试器中观察该模式下的寄存器r13-r14有无发生变化*/
/*intoAbortmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x17
MSRCPSR,r0
/*注意在调试器中观察该模式下的寄存器r13-r14有无发生变化*/
/*intoIRQmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x12
MSRCPSR,r0
/*注意在调试器中观察该模式下的寄存器r13-r14有无发生变化*/
/*intoUNDEFmode*/
MRSr0,CPSR
BICr0,r0,#0x1F
ORRr0,r0,#0x1b
MSRCPSR,r0
/*注意在调试器中观察该模式下的寄存器r13-r14有无发生变化*/
2.接口基本实验
2.1串口通信实验
2.1.1实验目的
●通过实验熟悉华邦W90P710开发板串口的结构、串行通信的原理。
●掌握ARM处理器串行通信的编程方法。
2.1.2实验设备
●硬件:
PC机,华邦W90P710开发板套件。
●软件:
LambdaIDE集成开发环境,Windows2000/NT/XP。
2.1.3实验内容
学习华邦W90P710开发板中Uart相关寄存器的功能,熟悉W90P710系统硬件的Uart相关接口,编写W90P710处理器的串口通信程序。
2.1.4实验原理
串口通信的概念非常简单,串口按照位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信。
W90P710开发板提供了两个独立的异步串行通信口,本实验所用的为Uart0.
串口的主要参数有波特率、数据位、停止位和奇偶校验位等,串口的正常工作需要对这些参数做正确的配置。
下面简单介绍这些参数的作用。
2.1.4.1串口参数说明
●波特率
这是衡量通信速度的参数,表示每秒钟传送的bit的个数,例如300波特表示每秒钟发送300个bit。
通常电话线的波特率为14400、28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比,高波特率常常用于放置的很近的仪器间的通信,在本文中所使用的波特率是115200。
●数据位
通信中实际数据位的参数,当串口发送一个信息包,实际的数据可以选择几种标准的值是5、7和8位。
如何设置取决于想传送的信息,比如,标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。
如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。
每个包是指一个字节(8位),包括开始/停止位,数据位和奇偶校验位。
●开始/停止位
用于表示单个包的最先一位或者最后一位。
典型的值为1、1.5和2位。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。
因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。
适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也就越慢。
●奇偶校验位
有四种检错方式:
奇、偶校验,高、低电平校验。
当然没有校验位也是可以的。
对于奇、偶校验的情况,串口会设置校验位(数据位后面的一位),确保传输的数据有偶数或者奇数个逻辑高位。
例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数。
如果是奇校验,校验位为1,这样就有3个逻辑高位。
高、低电平校验不是真正的检查数据,简单置位逻辑高或者逻辑低校验。
这样使得接收设备能够知道一个位的状态,使其有机会判断是否有噪声干扰了通信、传输和接收数据是否不同步等。
串口通信的协议有RS-232、RS-422、RS-485等。
W90P710开发板和PC机采用的是RS232通信协议,串口时钟频率为15M。
2.1.4.2Uart0控制寄存器
控制Uart0的寄存器映射在地址0xfff8_0000-0xfff8_001C,通过读写这些寄存器实现对串口的收发控制、参数设置等。
控制串口的寄存器主要有LCR、LSR、RBR/THR、DLM/DLL、IER等。
●UART_LCR(线控制寄存器)
[31:
9]保留,[7:
0]的各个控制位可以控制串口的奇偶校验位,数据位,停止位等。
DLAB[7]:
地址0xFFF8_0000和0xFFF8_0004被寄存器RBR/THR、DLL/DLM等寄存器复用,控制地址复用的标志位称作DLAB(除数锁存访问位),是LCR寄存器的第七位。
当DLAB为1时,0xFFF8_0000和0xFFF8_0004代表的是寄存器UART0_DLL和UART0_DLM;当DLAB为0时,0xFFF8_0000和0xFFF8_0004代表的就是UART_RBR\UART_THR和UART0_IER。
PBE[3]:
奇偶校验使能位。
该位为1,使能奇偶校验。
NSB[2]:
停止位选择。
该位为0,停止位为1bit,该位为1,停止位为1.5bit(数据位为5bit)/2bit(数据位为6、7、8)
WLS[1:
0]:
数据位选择。
它的取值和数据位对应关系表2-1所示:
表2-1数据位选择
WLS[1:
0]
数据位数
00
5
01
6
10
7
11
8
●UART_RBR\UART_THR(接收缓存\发送保持寄存器)
UART_RBR和UART_THR映射至是同一个地址(0xFFF8_0000).但是它们的读写属性是不同的。
当地址0xFFF8_0000只读时它代表UART_RBR,只写时代表UART_THR,物理上它们其实是一个寄存器。
串口的功能在于接收或者发送数据,UART_RBR\UART_THR就是串口的接收/发送口。
两者都是低8位有效,高24位保留。
若要发送数据,则向该地址写数据即可。
反之若要接收的话,读取该寄存器的值即可。
Data[7:
0]:
发送/接收的数据。
●UART_DLM和UART_DLL(波特率除数寄存器)
这两个寄存器的作用是设置波特率。
它们都只是低8位有效,因此可以组成一个16位的除数(DIVISOR),DLM寄存器表示这个除数的高八位,DLL表示低8位。
组成的除数{DLM,DLL}与波特率的关系如下:
BaudRate=CrystalClock/{16*[Divisor+2]}
假如选择波特率为115200,那么容易确定这个除数Divisor就等于(CrystalClock/(BaudRate*16))-2。
●UART_LSR(线形状态寄存器)
该寄存器用以表示串口传输数据时的状态。
高24位保留,低8位有效。
由该寄存器的低8位可以知道串口的工作状态,下面是主要的状态位:
TE[6]:
该位为1,表示发送寄存器和发送缓存寄存器为空;为0,表示发送寄存器和缓存寄存器至少一个不为空。
THRE[5]:
发送缓存寄存器指示位。
1表示缓存寄存器为空,反之未空。
RFDR[0]:
接受缓存寄存器指示位。
1表示接受缓存为空,反之未空。
上述几位的作用是,可以通过它们判断串口是否做好了接受/发送数据的准备。
例如,若RFDR为1,则表示串口已做好了准备,可以接受数据。
2.1.5实验参考程序
intmain()
{
char*temp=”welcometoembeddedsystem!
”
Uart_Init();
while(*temp)
Uart_SendChar(*temp++);
return1;
}
voidUart_Init(void)
{
unsignedintdivisor;
unsignedcharvalue;
unsignedinttemp=0;
GPIO_CFG5=temp&(~0xF);//将GPIO端口设置为发送/接受引脚
GPIO_CFG5=temp|GPIO_UART0_EN;
UART0_LCR=ULCR_WL8|ULCR_SP1|ULCR_PMS_NO;
//设置串口参数,停止位1位
//数据长度8位
//无奇偶校验
UART0_FCR=RESET;//关闭FIFO功能
UART0_FCR=UFCR_RFR|UFCR_TFR;//清除FIFO缓冲区数据
//设置波特率
value=UART0_LCR;//保存原来的状态,以便以后恢复用.(即对DLAB位的操作)
UART0_LCR=ULCR_DLAB;//设置DLAB为1,以便访问DLM,DLL
divisor=((unsignedint)(UART_CLK/(16*DEFAULT_BAUD))-2);//计算除数
UART0_DLL=divisor&0xff;//设置低位的除数寄存器
UART0_DLM=(divisor&0xff00)>>8;//设置高位的除数寄存器
UART0_LCR=value;//将DLAB位再置零,以使DLL和DLM恢复为RBR/THR,IER
}
charUart_SendChar(charbUartSendChar)
{
unsignedcharvalue=UART0_LSR;
//检查设备是否满足发送条件
//输出缓存为空,或者其他条件
while(!
(value&(ULSR_TE|ULSR_THRE)))
{
value=UART0_LSR;
}
UART0_THR=bUartSendChar;//将待发送数据填入发送寄存器
returnbUartSendChar;
}
2.2I/O接口实验
2.2.1实验目的
●熟悉ARM芯片I/O口编程配置方法。
●通过实验掌握ARM芯片I/O口控制LED显示的方法。
2.2.2实验设备
●硬件:
PC机,华邦W90P710开发板套件。
●软件:
L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 微处理器 编程 基础 实验 项目