《嵌入式电子系统设计》课程实验指导书实验1最小系统实验711Word文档格式.docx
《《嵌入式电子系统设计》课程实验指导书实验1最小系统实验711Word文档格式.docx》由会员分享,可在线阅读,更多相关《《嵌入式电子系统设计》课程实验指导书实验1最小系统实验711Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
声明init_MDCNFG0x02000ac9
IMPORTinit_MDREFR;
声明init_MDREFR0x0011e018
IMPORTinit_MDMRS;
声明init_MDMRS0x320032
IMPORTStackSvc;
声明StackSvc0xa0600000
IMPORTStackIrq;
声明StackIrq0xa0605000
IMPORTStackFiq;
声明StackFiq0xa060a000
IMPORTStackAbt;
声明StackAbt0xa060e000
IMPORTStackUnd;
声明StackUnd0xa0714000
IMPORTStackUsr;
声明StackUsr0xa0720000
IMPORTmain
IMPORT宏通知编译器本源码文件需要引用在其他文件中定义的变量或函数。
2.程序入口
AREAboot,CODE,READONLY
ENTRY;
初始化入口点
BReset_Handler
该代码段定义了boot程序所在的段(CODE)、属性(READONLY)等属性;
图1.1程序链接配置
ENTRY宏表示程序的入口,一个程序可设置有多个入口,可通过工程配置设置程序执行入口函数(如图1-1),在引导程序中,boot代码段程序初始化入口点。
由于AREA和ENTRY都是伪操作,不分配成实质的指令,所以,BReset_Handler为程序执行第一条指令。
3.设置中断向量表
表1-1ARM中断向量表
地址
异常类型
进入时的模式
进入时I的状态
进入时F的状态
0x00000000
复位
管理
禁止
0x00000004
未定义指令
未定义
I
F
0x00000008
软件中断
0x0000000C
中止(预取)
中止
0x00000010
中止(数据)
0x00000014
保留
—
0x00000018
IRQ
中断
0x0000001C
FIQ
快中断
每当一个中断发生后,ARM处理器便强制把程序计数器(PC)指针置为向量表中对应中断类型所对应的地址值。
由于ARM微处理器每个中断向量中只有4个字节的大小,所以通常在中断向量位置存放1条跳转指令或存放1条直接对程序计数器(PC)寄存器赋值的指令,使程序能跳转到相应的异常中断处理程序中执行。
如果中断处理程序所在的物理地址小于32MB,可使用B跳转指令;
当跳转范围大于32MB时,需使用LDR指令。
对于程序中未使用的中断,可使中断异常跳转到一个只含返回指令的哑函数或跳转到自身标号地址处,以防止中断异常引起系统的混乱。
如:
Undefined_Handler
BUndefined_Handler
下面代码为ARM微处理器中断向量表的初始化过程。
BReset_Handler;
跳转复位0x0000,0000复位管理模式
BUndefined_Handler;
跳转未定义指令0x0000,0004未定义指令未定义模式
BSWI_Handler;
跳转软件中断0x0000,0008软件中断管理模式
BPrefetch_Handler;
跳转预取指令0x0000,000C预取指令中止模式
BDataAbort_Handler;
跳转数据异常数据异常中止模式
NOP;
延时保留
BIRQ_Handler;
跳转IRQ(中断请求)0x0000,0018IRQIRQ
BFIQ_Handler;
跳转FIQ(快速中断请求)0x0000,001CFIQFIQ
从表1-1分析可知NOP一定不能去掉,必须要保证中断向量表正确建立。
4.程序初始化部分
;
*************************
CheckifrunintheSDRAM
MOVR0,PC
CMPR0,#0x00000040
BNESetStack
BLInitMem;
如果相等的话,则跳转到初始化内存代码段InitMem
SetStack;
定义设置堆栈标签
BLInitStack;
设置初始化堆栈
BLInitGPIO;
初始化GPIO
Bmain;
跳转到C语言main.c主应用程序
CMPR0,#0x00000040语句判断程序是否从0x0开始运行。
ARM处理器上电首先从地址0开始执行,然后跳转到复位中断,0x00000038为Reset_Handle标号地址所在的位置(图1.2,程序地址映射表),0x00000040为0x00000038+8后的地址。
图1.2程序地址映射表
5.汇编程序详解
GPIO初始化过程:
PXA270微处理器的GPIO引脚具有为多功能复用,需要在使用之前,需要对具体的GPIO引脚进行编程配置,从图1.3可知,要控制一个GPIO口,需要对GPIO方向寄存器(GPDR)、功能寄存器GAFR、电平设置寄存器GPSR/GPCR)等GPIO控制寄存器进行编程配置。
图1.3PXA270GPIO功能示意图
GPIO初始化代码段:
**************************************
InitGPIO
ALIGN
InitGPIO
LDRR1,=0x40e00000
MOVR0,#0x10000
STRR0,[R1,#0x20]
LDRR0,=0xa0000000
STRR0,[R1,#0x64]
LDRR0,=0x01c000
STRR0,[R1,#0x14]
LDRR0,=0x402
STRR0,[R1,#0x68]
MOVPC,LR
GPIO初始化代码段完成对GPIO的输入/输出、复用、电平等功能进行配置,一般情况,需要根据具体平台的GPIO的实际功能进行编程设置。
MOVR0,#0x10000;
GPIO64-95statusOutput-High
该代码实现将GPIO80口设置为高电平输出(图1.4GPSR2控制寄存器位定义)。
图1.4GPSR2控制寄存器位定义
上面两条语句通过对GPIO功能转换控制寄存器进行设置,将GPIO78、GPIO79口的功
能配置成转换输出功能2,即GPIO78、GPIO79分别设置为nCS<
2>
,nCS<
3>
片选功能。
图1.5、GAFR2_L控制寄存器位定义;
图1.6为GPIO78、GPIO79为转换功能表;
图1.7为GPDR2控制寄存器位定义。
图1.5GAFR2_L控制寄存器位定义
图1.6GPIO78、GPIO79为转换功能表
图1.7GPDR2控制寄存器位定义
该代码实现将将GPIO78、GPIO79、GPIO80口的配置成输出端口。
该代码完成将GPIO80口的功能设置成nCS<
4>
,将GPIO85口的功能设置成FFRXD。
图1.8为GAFR2_U控制寄存器位定义,图1.9为GPIO80、GPIO85为转换功能表。
图18GAFR2_U控制寄存器位定义
图1.9GPIO80、GPIO85转换功能表
存储控制器初始化过程:
对于EELiodPxa270教学实验平台,SDRAM初始化的工作是通过配置存储控制器寄存器来完成,这些寄存器包括主要包括SDRAM配置寄存器(MDCNFG),SDRAM刷新控制寄存器(MDREFR),SDRAM模式设置配置寄存器(MDMRS)。
SDRAM配置寄存器MDCNFG主要完成对SDRAM的使能(DEn)、位宽(DWINn)、行列地址线(DRACn、DCACn)、内部块的数量(DNBn)以及时序参数(DTCn)等参数的配置,图1.10为MDCNFG配置SDRAM的控制位。
图1.10MDCNFG寄存器
EELiod平台的SDRAM配置代码如下:
LDRR11,=MDCNFG
LDRR1,=init_MDCNFG;
0x02000ac9
STRR1,[R11]
EELiod平台由两块4banksx4Mbitx16位的HYB25L256160ACSDRAM芯片组成64M32位的存储空间,该芯片使用9位列地址,13位行地址,且内部采用4个bank设计方式,tRP=3,CL=3,RCD=3,tRAS=7,tRC=10,采用普通寻址模式;
平台利用分区0(Partition0)进行寻址该存储芯片组。
所以对SDRAM配置寄存器MDCNFG赋值为0x02000AC9。
动态RAM在使用过程中为防止数据丢失,需要不停地对其进行充电刷新。
SDRAM刷新控制寄存器除了完成对SDRAM刷新参数进行配置之外,还对存储器的时钟选择等参数进行配置,如图1.11、1.12为寄存器的控制位。
图1.11MDREFR寄存器的控制位
图1.12MDMRS寄存器的控制位
配置代码如下:
LDRR11,=MDREFR
LDRR1,=init_MDREFR;
0x0011e018
STRR1,[R11]
写入SDRAM中的MRS值,,设置到模式寄存器后,存储控制器初始化完毕。
在SDRAM芯片内部有一个逻辑控制单元,并且有一个模式寄存器为其提供控制参数。
因此,每次开机时SDRAM都要先对这个控制逻辑核心进行初始化,也就是配置MDMRS寄存器。
寄存器的信息由地址线来提供。
在设置到模式寄存器之后,SDRAM就开始了进入正常的工作状态:
LDRR11,=MDMRS
LDRR1,=init_MDMRS;
0x320032
堆栈初始化过程:
ARM处理器有7种异常工作模式,每一种异常工作模式的必须使用其影子寄存器进行必要的数据处理,但ARM处理器进入异常工作模式时,需要对现场进行保护,以便实现正确返回。
所以必须对各异常工作模式的堆栈进行设置。
具体方法是改变状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后给SP赋值,初始化代码如下:
***************************************
InitStack
InitStack
SetIRQmode(IRQ)
MSRCPSR_c,#0xd2;
设置IRQ模式,且只更新CPSR[7:
0]
LDRSP,=StackIrq;
设置IRQ堆栈的起始地址
SetFIQmode(FIQ)
MSRCPSR_c,#0xd1;
设置FRQ模式,且只更新CPSR[7:
LDRSP,=StackFiq;
设置FRQ堆栈的起始地址
SetAbortmode(ABT)
MSRCPSR_c,#0xd7;
设置ABT模式,且只更新CPSR[7:
LDRSP,=StackAbt;
设置ABT堆栈的起始地址
SetUndefinemode(UND)
MSRCPSR_c,#0xdb;
设置UND模式,且只更新CPSR[7:
LDRSP,=StackUnd;
设置UND堆栈的起始地址
SetUser/Systemmode(USR)
MSRCPSR_c,#0xdf;
设置USR模式,且只更新CPSR[7:
LDRSP,=StackUsr;
设置USR堆栈的起始地址
SetSupervisormode(SVC)
MSRCPSR_c,#0xd3;
设置SVC模式,且只更新CPSR[7:
LDRSP,=StackSvc;
设置SVC堆栈的起始地址MOVPC,LR
END
堆栈的大小要根据具体需要而定,但是要尽可能给堆栈分配快速的存储空间,以提高系统性能。
6.C语言代码部分
该引导程序实验通过完成对系统的引导配置,并对平台中的八个LED灯实现向右循环流水点亮。
硬件连接如图1.13、1.14所示:
图1.13LED_CS4片选地址
图1.14LED电路图
由图1.13、图1.14可知,LED-CS4为八个LED的控制芯片74HC574的片选,而LED-CS4接在3-8译码器74LCx138的Y5输出74LCx138译码器的片选信号B_CS4对应CPU的nCS4,由图1.5可知,nCS4对应的基址为0x10000000。
所以八个LED控制芯片的物理地址为:
0x10500000=0x10000000+0x500000。
图1.15内存映射
5.程序流程图与主程序
图1.16程序流程图
#defineLED_CS4(*((volatileunsignedint*)(0x10500000)))
intmain(void)
{
intledvalue;
while
(1)
ledvalue=1;
for(i=0;
i<
8;
i++)
LED_CS4=~ledvalue;
ledvalue=ledvalue<
<
1;
Delay(200);
}
return0;
利用ADS打开Ex1-boot\boot.mcp工程文件,执行ProjectMake,也可以直接用快捷键F7进行编译、连接生成映像文件。
如图1.17所示:
图1.17生成映像文件
编译、连接后就生成映像文件,我们可以把它下载到FLASH或者SDRAM运行和调试。
具体办法请查看文档---ADS实验调试方法。
五、实验总结
1.根据实验结果,总结编程中的要点。
六、预习及思考
1.预习《IntelPXA27xProcessorFamilyDeveloper’sManual》。
2.分析程序代码结合以上说明,对本实验所提供的汇编源代码进行分析,深入理解针对具体的硬件实现,软件是如何配合工作的。