APP下载

CC2530 芯片中BootLoader 程序的设计与实现

2016-05-16樊星男

太原学院学报(自然科学版) 2016年4期
关键词:主程序字节串口

樊星男

(太原学院,山西 太原 030032)

1 引言

BootLoader(启动引导)程序是运行于主程序之前的一段程序,其主要功能是要完成对主程序的更新、配置和启动[1-2]。BootLoader 程序与主程序是两个独立存在的程序,它所实现的功能并不被用户可见,但是对设备的运行、维护、升级却起着极其重要的作用。我们知道,设备在使用过程中经常会遇到需要进行软件升级的情况,有时是为了修改已有的软件错误,有时是为了增加新功能。这时BootLoader 程序可以极大的简化软件更新方式,降低设备维护成本。同时,BootLoader 程序还可以接受外部控制命令,完成对主程序运行参数的配置。

2 BootLoader程序功能分析

BootLoader 程序运行于主程序之前。当设备上电后首先运行BootLoader 程序。一般情况下,BootLoader 程序会对设备芯片进行必要的配置,并检查是否有外部触发信号。如果没有触发信号,则跳转至主程序;如果有触发信号,则进入BootLoader 循环。外部触发信号可以是多种多样的,常用的方式有跳线、按键、串口字符等。BootLoader 循环的主要功能是等待外部通过串口发送来的命令,然后执行该命令。BootLoader 程序是与硬件平台强相关的,所以对于不同的硬件设备,程序实现的方式会各不相同,但是整体的工作流程和功能是基本一致的。BootLoader 程序工作流程见图1。

图1 BootLoader 程序工作流程图

3 BootLoader程序在CC2530芯片上的实现

CC2530 芯片使用的是8051内核,所以我们选取IAR for 8051 软件作为BootLoader 程序的集成开发环境,这也是德州仪器公司推荐使用的开发环境。

3.1 CC2530芯片闪存划分

BootLoader 程序与主程序是两个相互独立的程序,所以二者必须被存储于独立的闪存空间。

根据Flash 闪存空间的大小不同,CC2530 芯片分为CC2530F32/64/128/256 四个版本,分别具有32/64/128/256KB 的闪存,我们选取的是CC2530F256 芯片。该芯片的闪存被等分为128个闪存页面,每个页面大小为2KB[3]。这128个闪存页面需要被划分为几个独立空间,分别存储BootLoader 程序和主程序,以保证两者在运行过程中不会修改对方的闪存空间。CC2530 闪存划分示意图见图2 。

图2 闪存划分示意图

从图2 中可以看到,CC2530F256 芯片的128个闪存页面被分为三部分。

第一部分:BootLoader 程序区,从页面0 开始到页面3 结束,地址范围为0x0000 到0x1FFF,用于存储BootLoader 程序。由于芯片启动后首先从地址0x0000 开始执行程序,所以BootLoader 程序的起始地址必须为0x0000。具体划分方法是将BootLoader 工程中xcl 文件的CODE_START 字段修改 为0x0000,将CODE_END 修 改 为0x1FFF。CODE_START 和CODE_END 字段分别代表代码在起始地址和结束地址,这样在使用IAR 开发环境对工程进行编译时,编译器就只会将代码分配在页面0 到页面3 的地址范围内。

第二部分:主程序区,从页面4 开始到页面126结束,地址范围为0x2000 到0x3F7FF,用于存储主程序代码,通过设置主程序工程中xcl文件的相应字段实现。

第三部分:保留区,页面127,地址范围为0x3F800 到0x3FFFF。该部分是由德州仪器分配使用,用于存储芯片信息。

3.2 CC2530串口通信

BootLoader程序进入循环后主要任务就是接收外部通过串口发送来的命令并执行。为了更为方便和有效的进行通信,我们对BootLoader 程序的通信数据格式进行了定义,数据格式见表1。

表1 串口通信数据格式

起始位:该位是一个完整命令的开始,这里我们设置为0xFE 。

长度:该位表示的是数据段的长度。

命令码:该位表示命令类型,可以根据开发者的习惯自行定义,这里我们定义0x01 为写闪存、0x02 为读闪存、0x03 为加载程序、0x04 为启动设备。

响应:该位只有对命令进行响应时才有,表示BootLoader 程序对命令的执行结果。

数据:该段表示数据内容。当命令为写闪存和加载程序时,数据段中前两个字节为操作起始地址;当命令为读闪存时,数据段中前两个字节为操作起始地址,第3个字节为读取长度。由于整个芯片闪存有256KB,这个大小超过了两个字节所能表示的地址范围,所以这里对地址进行了一些处理,即串口数据中传输的地址是实际地址除以4,它表示的是字地址,而不是字节地址。

校验位:该位是从起始位开始至数据结束按字节进行异或操作的结果,通过计算和检测该位可以确认数据传输的完整性和正确性。

3.3 CC2530的闪存读写

CC2530F256 芯片拥有256KB 的闪存空间,这些闪存空间被等分为128 页,而这128 页空间又可以等分为8个闪存块。通过操作芯片内部的MEMCTR 寄存器可以分别将这8个闪存块空间映射到芯片内存空间0x8000——0xFFFF 这个地址范围内,然后通过操作指针的方式读取闪存内容。

CC2530 芯片有两种写闪存的方式,分别是DMA 写方式和CPU 写方式。为了保护闪存内容,防止程序在运行过程中修改程序代码,从而产生不可预知的错误,芯片在运行过程中是禁止程序修改闪存内容的,所以如果使用CPU 写方式时,必须将程序搬迁到SRAM 中运行,并且要严格按照芯片的时序要求进行写操作。为此我们采用的是DMA写方式。DMA 写方式的操作步骤见图3。

图3 DMA 写闪存操作步骤

在配置DMA 通道的时候要注意的是DMA 通道的目标地址是寄存器FWDATA 而不是闪存地址。闪存地址需要在第二步操作中写入到寄存器FADDRL 和FADDRH 中。此外还需要遵守以下几点要求:首先,页面是存储器进行擦除操作的最小单位,通过设置FCTL.ERASE 为1 可以将FADDRH 所对应的闪存页面整页擦除,擦除结果为全部变为0xFF。其次,字是存储器进行写操作的最小单位,也就是写入闪存的数据必须为4 字节整数倍。第三,存储器只允许将存储器中的每个比特位由‘1’写为‘0’。所以,在对闪存进行写操作时必须首先将目标地址所在页面进行擦除操作。

4 BootLoader上位机程序设计

为了配合BootLoader 程序完成设备维护人员的操作命令,我们使用VisualBasic 软件设计开发了上位机程序。通过使用VisualBasic 中的MSComm组件可以方便的实现计算机与芯片的串口通信。上位机程序如图4。

图4 上位机服务程序

通过使用MSComm 控件的CommPort 属性设置串口号,使用PortOpen 属性打开关闭串口,通过使用Settings 属性设置串口波特率等信息。Input 和Output 方法可以分别实现串口的读写操作[4-5]。

为了配合BootLoader 完成闪存的写操作,上位机程序在设计中需要注意以下几点:一是进行写操作时的数据长度必须为4 字节整数倍。二是进行读写操作的数据长度不能超过BootLoader 程序中串口读写缓冲大小。三是客户端必须在接收到BootLoader 程序的响应后才能发出下一条命令。

5 结束语

本文分析了BootLoader 程序的一般功能,并结合CC2530 芯片的硬件特点,设计实现了CC2530芯片中的BootLoader 程序。通过实际测试表明,该程序运行稳定,可以极大地降低CC2530 芯片设备的运行维护成本,具有良好的实际应用价值。

猜你喜欢

主程序字节串口
自动升级程序在船舶监测系统中的应用
No.8 字节跳动将推出独立出口电商APP
浅谈AB PLC串口跟RFID传感器的通讯应用
浅谈数控铣削技术代码程序的嵌套方式研究
No.10 “字节跳动手机”要来了?
电控冰箱软件模块化设计
基于MSP430的四旋翼飞行器的S-BUS通信协议的设计与实现
时光倒流 换回PotPlayer老图标
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索