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 ] [page]
//搬运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) //分高低8位分别配置波特率
write_reg(UART0_DLL, baudl)
read_reg(UART0_LCR) &= (~(0x1 << 7)) //关闭波特率配置寄存器访问
write_reg(UART0_FCR, triger) //配置fifo触发级
write_reg(UART0_IER, 0x00) //使能串口相关中断源
irq_enable(INT_UART0); //使能串口中断
}
由于SEP3203处理器的串口波特率配置寄存器地址是与其他寄存器地址复用的,所以在配置波特率时须进行如下操作:语句:write_reg(UART0_LCR, bit)中bit参数的第7位决定了波特率配置寄存器的访问,之后语句:read_reg(UART0_LCR) &= (~(0x1 << 7))关闭了波特率配置寄存器的访问。
本文作者创新点:
根据无线通信平台的测试及在仪表监控系统中应用的实际情况,本BSP完成了预定内容,且运行稳定。BSP的成功编写为今后更为复杂的底层开发提供了保证,也有助于相关嵌入式操作系统的移植与开发。
参考文献
1 杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.1-160
2 Andrew N.Sloss,Dominic Symes,Chris Wright. ARM嵌入式系统开发——软件设计与优化[M].北京:北京航空航天大学出版社,2005.1-92
3 董策,杨志家. AES加密算法的高速低功耗ASIC设计[J]. 微计算机信息-2005年09X期,36-37
上一篇:基于ARM的RFID阅读器设计
下一篇:基于U-BOOT的S3C44B0引导装载程序的设计与实现
推荐阅读最新更新时间:2024-03-16 12:59
设计资源 培训 开发板 精华推荐
- 芯启源(上海)将持续发力,“做深做精”EDA及IP产品
- 本田严厉警告日产:若与鸿海合作,那么本田与日产的合作将终止
- Microchip推出新款交钥匙电容式触摸控制器产品 MTCH2120
- Matter对AIoT的意义:连接AIoT设备开发人员指南
- 我国科学家建立生成式模型为医学AI训练提供技术支持
- Diodes 推出符合车用标准的电流分流监测器,通过高精度电压感测快速检测系统故障
- Power Integrations面向800V汽车应用推出新型宽爬电距离开关IC
- 打破台积电垄断!联电夺下高通先进封装订单
- Ampere 年度展望:2025年重塑IT格局的四大关键趋势
- 存储巨头铠侠正式挂牌上市:首日股价上涨超10%
- 参加RT-Thread软件包赛,赢取RoboMaster等丰厚奖品!
- 有奖直播:安森美电感式位置传感器接口 NCS32100
- 学C2000精品课程,低价抢购 C2000 LaunchPad!
- 有奖直播|相约Keysight World 2019“汽车电子及新能源汽车测试”论坛
- ADI有奖下载活动之9 电机控制解决方案—伺服控制
- 英飞凌角度传感器应用解锁机看看你能找到几种?
- TI携您共创未来乘驾新体验——初步学习: TI 汽车专题任务打卡
- 【读书月】读一本RT-Thread技术好书,写下你的读书笔记
- 有奖直播:新科技、新课堂、新学期~ ADI软件定义无线电ADALM-Pluto入门实战
- 你评论,我送礼!《玩转TI MSP430 Launchpad》TI社区与EEWORLD联合首发!