Bootloader技术在数字信号控制器中的应用
扫描二维码
随时随地手机看文章
摘 要: 介绍了Boot loader(引导加载)技术的原理, 着重讨论了M icroch ip公司的DSPIC30F系列数字信号控制器( DSC)的Boo tloader程序的编写及F lash存储器运行时自编程( RTSP)技术的原理, 并实现了电子皮带秤控制仪表程序的在线自编程升级。
1 引 言
当前, 随着MCU、DSP等高性能集成电路的广泛应用, 大部分电子设备需要对用户程序进行升级以达到完善、丰富系统功能的目的。但目前对这类设备的程序升级大多采用开发人员携带编程工具到现场进行操作的方式, 这样做给系统的统一管理和维护造成很大困难。针对这一问题提出一种基于dsPIC30系列芯片应用Bootloader技术实现用户程序在线自编程升级的方法, 从而达到了用户程序升级时无须下载器, 操作简单、快捷的目的。
2 Boo tloader的原理
Bootloader相当于PC主板上的B IOS, 是最底层的引导软件。Boo tloader是一段固化在嵌入式系统目标系统ROM或者是诸如FLASH 等非易失存储器中的一段程序, 它的主要作用就是引导操作系统或用户程序的运行。系统上电后Boo tloader将首先接管系统, 在进行一些最基本的上电自检后, Bootloader将对系统的硬件进行初始化, 为引导操作系统作好准备, 接下来, Bootloader需要将操作系统的代码拷贝到主存储器的特定地址, 最后Boot loader将控制权交给操作系统, 由操作系统完成接下来的工作;在不含操作系统的系统中, Bootloader可以完成这样一些操作: 分配程序存储空间; 重新映射复位和中断向量; 将程序代码从片外加载到程序区, 执行时再将代码加载到RAM 中以便快速执行; 检测是否需要下载新的用户代码, 若需要则通过某种通信方式接收新代码并将其写入指定程序存储空间中, 若不需要, 则执行原有用户代码。
在嵌入式领域中, Bootloader是严重地依赖于硬件的, 因此想要建立一个通用的Bootloader 几乎是不可能的。以dsPIC30F系列数字信号控制器为例,深入讨论在该系列芯片中编写Boot loader程序的方法, 这种方法同样适用于一些其它类型的微控制器。
3 Bootloader的操作模式
大多数Bootloader 都包含两种不同的操作模式: “启动加载 ”模式和“下载”模式, 这两种模式的定义如下:
启动加载( Boot Load ing)模式: 这种模式也称为 自主 ( AutONomous)模式。也即Bootloader从目标机上的某个固态存储设备上将用户程序加载到RAM 中运行, 整个过程并没有用户的介入。这种模式是Boo tloader的正常工作模式。
下载( Dow nloading) 模式: 在这种模式下, 目标机上的Bootloader将通过串口等通信手段从PC 机下载文件, 比如: 下载内核映像和根文件系统映像等。从PC机下载的文件通常首先被Bootloader保存到目标机的RAM中, 然后再被Bootloader写到目标机上的FLASH类固态存储设备中。Boo tloader的这种模式通常在系统程序更新时使用。工作于这种模式下的Boot loader通常都会向它的终端用户提供一个简单的接口。
4 dsPIC30F系列芯片简介
M icroch ip公司推出的dsPIC30F 系列数字信号控制器( DSC)可以灵活地运行一个常驻FLASH 的引导加载程序( Bootloader Prog ram )实现对用户程序的在线自编程升级。可以使用任何可用的数据接口和相关协议读取代码, 然后将代码写入(编程)到FLASH 存储器中, 从而实现电子设备在线自编程升级程序代码的目的。dsPIC30F系列数字信号控制器的Boo tloader程序需要自行编写, 并且可以通过SPI、UART等各种数据接口来接收PC 机发送的数据。显然, 采用了串口( RS232 方式) 与PC 机进行通信最为方便。
5 dsPIC30F系列芯片FLASH 存储器的运行时自编程( RTSP)
dsPIC30F系列数字信号控制器内部包含了用于执行用户代码的FLASH 存储器。用户可以使用两种方法对此存储器编程:a运行时自编程( Run-T ime Self Programm ing, RTSP ); b 在线串行编程( In- C ircu it Serial Programm ing, ICSP)。其中RTSP方式是由用户软件执行的, 允许用户代码修改闪存程序存储器的内容, 是实现用户程序在线自编程升级的基础。
dsPIC30F系列芯片对FLASH 存储器的运行时自编程是通过表指令TBLWT、TBLRD 和NVM 寄存器实现的。FLASH 存储器是由行和板构成的。每行由32 条指令( 96 字节) 组成。通常, 每个板由128行组成( 4K # 24条指令)。RTSP可以让用户每次擦除一行( 32条指令)以及一次编程32条指令。
程序存储器的每个板包括能够保存32条编程数据指令的写锁存器。这些锁存器不是存储器映射的。
用户访问写锁存器的惟一方法是使用写表指令。在实际编程操作前, 必须先用写表指令将待写数据装入板写锁存器。待编程入板的数据通常是按以下顺序装入写锁存器的: 指令0, 指令1, 依此类推。所有的32位写锁存器必须在编程操作期间写入, 以确保覆盖保存在锁存器中的旧数据。
RTSP编程的基本步骤是先建立一个表指针, 然后执行一系列TBLWT 指令以装入写锁存器。编程是通过将NVMCON 寄存器的特殊位置1 进行的。
需要将32条TBLWTL和32 条TBLWTH 指令装入四条指令。如果需要对多个不连续的程序存储器区进行编程, 应该为每个区域和下一个要写入的一组写锁存器修改表指针。
[!--empirenews.page--]
6 Bootloader程序编写
6. 1 dsPIC30F系列器件存储空间的分配
在编写Bootloader程序之前, 我们必须首先了解芯片的程序存储空间分配情况。dsPIC30F 系列芯片包含144K字节的FLASH 程序存储空间, 寻址范围为0x0000100~ 0x017FFE, 图1 ( a)为dsPIC30F系列芯片的程序存储器地址映射情况。
0x00~ 0x03地址单元是复位向量; 0x04~ 0xFE地址单元是中断向量表和后备中断向量表( IVT /A IVT) ; 在其后的0x100~ 0x17FFE单元为48K指令字的用户闪存程序存储器。原则上, Boot loader程序可以放在整个程序空间中的任何位置, 但是为了简单方便、具有通用性和尽量减少对用户程序的影响,本设计使用了0x100 ~ 0x4FE 的一段程序存储器( Boo tloader程序与用户程序的代码总量不能超过144KB)。Bootloader程序后面便可存放用户程序,但是受到FLASH 存储器页的限制, 用户程序不可紧跟在Boo tloader程序之后, 它必须从下一个FLASH存储器页的开始处(如0x500) 存放, 如图1 ( b) 所示。
图1 程序存储器地址映射
6. 2 . hex文件的解析
当dsPIC30F系列数字信号控制器的程序编写完成之后, 利用开发平台MPLAB IDE编译后会生成一个. hex 文件, 将这个. hex 文件烧写到FLASH 存储器中系统才能运行, 因此要完成的任务就是将这个. hex 文件下载到目标系统中。如果直接从PC 端将. hex 文件中的全部内容发送给下位机, 就需要Boot loader程序来解析提取要写入存储器的数据, 这样做势必加大Boo tloader程序代码长度, 也会影响整个Boo tloader过程的时间, 因此本设计采用在PC机端程序解析. hex 文件的方法。为了正确地将这个. hex文件下载到下位机中必须对. hex 文件有一个比较深入的了解。. hex文件的格式如下:
: BBAAAATTHHHH……HHCC
BB: 二位16 进制值, 表示该帧数据的字节长度。
AAAA: 四位16 进制值, 表示随后数据的起始地址, 该地址为字节地址。
TT: 二位16进制值, 表示数据帧类型( 00 : 数据帧; 01 : 结束帧; 04 : 扩展地址帧)。
HH: 16进制值, 表示具体的数据, 即具体程序代码。
CC: 二位16进制的校验码, 使该帧全部以二位16进制相加后总和为0。
一个. hex 文件可分为5部分代码: 复位向量代码、程序代码、中断向量代码、后备中断向量代码和结束代码, 除结束代码仅含结束帧外, 其余各部分代码都由扩展地址帧和数据帧组成, 其中仅数据帧存储了用户程序信息。因此PC 机端程序仅保留扩展地址帧和数据帧的内容并按顺序进行发送即可, 下位机接收数据后根据扩展地址帧可以直接将用户代码写入FLASH 存储器相应的地址单元中, 从而提高了整个Bootloader的效率。
[!--empirenews.page--]
6. 3 dsPIC30F器件. g ld文件的修改
Bootloader程序运行时, 需要读出用户程序中预先设置好的一个延时值(本设计为1s) 作为下位机等待PC 机发送升级命令的周期, 还要指定用户程序起始地址以便Boot loader程序执行完毕后可以继续执行用户程序。为了满足这两个要求, 必须修改用户程序的链接文件( . g ld文件), 以指定用户程序的起始地址和Bootloader 程序的延时周期。对于. g ld文件的具体修改如图2所示。
图2 . g ld文件的修改。
6. 4 Boot loader程序流程:
系统上电复位后, 在完成各种初始化配置后首先判断0x500地址单元中值是否为0xFF, 如果是,则说明系统从未下载过用户程序, 系统会一直运行Boot loader程序等待PC 机发送下载命令; 如果0x500中的值不是0xFF, 则说明系统中已经下载过用户程序了, 这时候根据0x500中的值来设置定时器T imer2的初值并开始计时, 如果UART2 在指定的自举周期内未接收到PC 机发来的下载命令(说明系统不需要下载程序), 系统会自动跳出Boo tloader程序而去运行已有的用户代码, 如果UART2在自举周期内接收到了下载命令, Boo tloader程序会进入循环状态等待PC机发送数据。如图3所示。
图3 程序流程图。
[!--empirenews.page--]
如前文所述, PC 机发送的数据是从. hex 文件中提取的, PC机首先发送扩展地址部分, 下位机接收保存后会继续等待接收32个指令字( 96字节)并保存到RAM 中, 然后根据接收到的地址擦除FLASH 存储器中的1行, 擦除FLASH 是通过调用汇编函数E raseMem来进行的, 函数原型如下:
mov# 0x4041, NVMCON ; 使NVMCON 寄存器为擦除FLASH模式
mov # 0x55, W 0
movW0, NVMKEY
mov # 0xAA, W0
movW 0, NVMKEY ; 将0x55、0xAA 写入密钥寄存器
bsetNVMCON, #WR ; 开始擦除
nop
nop
return
擦除FLASH存储器的一行后需要把接收到的32个指令字写入到FLASH 存储器写锁存器中, 这一过程可以通过函数W riteLatch 实现, 函数原型如下:
movW0, TBLPAG ; 写表寄存器
tb lw tlW3, [W1]
tb lw thW2, [W1] ; 写入锁存器
return
这一步完成之后就可以将接收到的32个指令字写入FLASH 存储器了, 其方法与擦除FLASH 类似, 写完一行后向PC 机发送应答。待FLASH 存储器全部写完之后, PC 机会发送表示结束下载的命令, 下位机接收后退出Boo tloader程序, 进入新的用户程序继续运行, 从而完成整个在线自编程过程。
7 结束语
dsPIC30F 系列数字信号控制器应用Boot loader实现用户程序在线自编程升级的方法具有很高的应用价值, 尤其是应用于自主开发的工业自动化仪表时给用户程序的现场升级带来了极大的方便。该方法已经成功用于电子皮带秤控制仪表系统中, 达到了提高系统软件升级的更换效率、降低升级费用、提高产品制造商对用户的服务质量满意度的目的。方法虽然仅以dsPIC30F系列芯片为例, 但对于M icrochip公司生产的其它系列芯片只要略加修改同样适用。