基于SEP3203处理器的BSP的实现探讨
1、引言
BSP是Board Support Package的缩写。该术语通常用于嵌入式领域,主要指在开发嵌人式应用时系统开发商提供的各种支持库。由于每个嵌人式系统提供商都根据自己的操作系统而提出对BSP的不同理解,因此,在涉及到BSP的具体涵义时,必须基于具体的嵌入式系统。本文将以基于SEP3203的无线通讯产品为例,说明其BSP 的内容及实现。该无线通讯产品硬件结构如(图一 无线通讯产品硬件结构图),SEP3203外接了Nor flash和SDRAM,并通过串口与无线模块和仪表通讯。软件执行流程图如(图二无线通讯产品软件流程图)。该无线通讯产品的BSP将提供给应用程序开发者一个与硬件无关的开发平台。
2、概要设计
2.1、无线通信平台BSP的内容
根据无线数据终端的硬件平台,BSP的内容应包括EMI (存储器接口)的配置、PMU(电源管理模块)的配置、代码的搬运和串口的驱动程序。
2.2、整体框架
为了完成BSP的内容,上电后,首先应配置EMI,PMU,这是因为EMI 决定了内存的地址分配,而PMU 是配置其它硬件的前提。然后,考虑到代码执行效率,将代码搬运到内存中执行,并进行指针的重新定位。最后,在主程序中完成对串口的配置如(图三 BSP流程)。从上电开始到Remap操作结束运行的这段代码即为无线通信平台的启动代码。
3、启动代码的设计
3.1、启动代码的编写
上电后,pc指针指向地址0x00000000,而此时地址0x00000000与NOR FLASH 首地址重合, 这时NOR FLASH 同时拥有两个地址:0x00000000和0x20000000。因此,pc指针实际指向了NOR FALSH 的首地址,即为启动代码的起始地址。启动代码编写如下:
//配置PMU与EMI
ldr r1, =0x1000100c //配置内部模块时钟源供给的控制寄存器
ldr r2, =0x0ffff;
str r2,[r1]
ldr r1, =0x10001014 //配置芯片工作模式寄存器
ldr r2, =0x1
str r2,[r1]
……
ldr r1, =0x11000000 //配置存储器参数配置寄存器
ldr r2, =0xB91331FF
str r2, [ r1 ]
ldr r1, =0x11000014 //配置SDRAM 时序配置寄存器
ldr r2, =0x01004077
str r2, [ r1 ]
//搬运Nor flash中所有代码(包括bootloader)到SDRAM
ldr r3, =0x00000000 //SDRAM起始地址
ldr r1, =0x30002000 //搬运代码SDRAM目标地址
ldr r2, =0x20001000 //代码在flash中的起始地址
LOOP //每个循环搬运32位代码
ldr r4, [r2], #4 //将代码从flash搬运到SDRAM中
str r4, [r1], #4
add r3, r3, #1
cmp r3, #0x2C000 //0x2C000为代码量
bne LOOP
//REMAP操作
ldr pc, =0x20000080 //定位pc指针
mov r0, r0 //空语句
mov r0, r0
mov r0, r0
mov r0, r0
ldr r1, =0x11000010 //配置REMAP寄存器
ldr r2, =0x0000000b
str r2, [ r1 ]
//使pc指针指向主程序起始地址
ldr pc, =0x30002000 //定位pc指针
mov r0, r0
mov r0, r0
mov r0, r0
mov r0, r0
3.2、启动代码的难点分析
ARM7执行指令为三级流水线结构,即第一条指令执行的时,第二条指令正在译码,第三条指令正在取指如(图四三级流水线)。
Remap操作中,语句ldr pc, =0x20000080是将pc指针指向了下面的4条mov语句,这4条mov语句是没有意义的,只是用来填充三级流水线,以避免执行Remap操作时,产生不必要的错误。
Remap操作后,NOR FLASH 将失去零地址,而只拥有实际地址0x20000000,而SDRAM 则拥有了两个起始地址,即0x00000000和0x30000000,访问这两个地址实际上都是在访问SDRAM。因此,当完成代码搬运后,pc指针应先重新定位到Nor Flash实际地址(0x20000000开始的地址)再继续运行启动代码的剩余部分,否则Remap之后pc会取错地址导致错误。
语句ldr pc, =0x30002000将pc指针定位到主程序的入口,之后4条mov语句用于填充三级流水线,否则pc指针在读取重新定位pc指针指令后,将会继续向下移动,取错指令。
pc指针跳转到主程序的入口后,整个启动代码结束。
4、串口驱动程序
串口驱动程序包含串口配置和收发数据两部分,接收数据使用do(取fifo数据)while(fifo非空)的结构读取fifo中的数据;发送数据即直接向发送fifo填入数据,其代码不再赘述。串口配置是在主函数运行后进行的。代码如下:
int init_uart(unsigned long sysclk, unsigned long baudrate, unsigned long databit, unsigned long trigerlevel)
{
unsigned long baud, bit, triger, baudh, baudl;
baud = sysclk/16/baudrate
baudh = baud >> 8 //波特率高8位和低8位分离
baudl = baud 0xff
write_reg(UART0_LCR, bit); //选择访问波特率设置寄存器
write_reg(UART0_DLH, baudh) //分高
- 伪彩LCD驱动SSD1770的接口设计(10-22)
- 基于SEP3203为核心的工控系统(09-03)
- 基于SEP3203拉力试验机嵌入式测控系统设计(03-30)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- WinCE系统下BootLoader的开发(04-10)
- 嵌入式语音通信系统中VxWorks BSP的设计实现(09-18)