微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于SEP3203处理器的BSP的实现探讨

基于SEP3203处理器的BSP的实现探讨

时间:05-21 来源:互联网 点击:

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) //分高

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top