nbhkdz.com冰点文库

ARM7处理器Bootloader的设计与实现

时间:2011-11-26


第 5期 2010年 10月









MI CROPRO CE SSOR S

N o. 5 O ct , 2010 .

ARM 7处理器 Bootloader的设计与实现
武国平, 史仪凯
( 西北工业大学机电学院, 西安 710072) 摘 要: AT 91SAM 7系列 ARM 核处理器没有专门的 BOOT 区, 每次更新应用程序都要借助于

JTAG接口和仿真器, 且每次都是从 FLASH 的 0x0处开始烧写应用程序, 一旦更新不成功, 就会破 坏原来的程序。为解决以上提到的问题, 以 AT 91SAM 7X256为例探究了一种新的通过串口实现应 用程序更新的 Bootloader 其由上位机下载软件和下位机 Boo tloader程序两部分组成。首先介绍 , Bootloader的通信协议, 接着给出上位 机软件和 Bootloader的详 细设计, 最后对 Boo tlo ader进行测 试, 并给出测试结果。 关键词: 串口; Serialport类; Xm ode 协议; 多线程; 程序更新 m DO I编码: 10. 3969 / . issn 1002- 2279 2010 05 030 j . . . . 中图分类号: TP368 1 . 文献标识码: A 文章编号: 1002- 2279( 2010) 05- 0103- 04

Design and Imp lem entation of ARM 7 - M PU Bootloader
WU Guo- p ing, SH I Y i- kai
( Co llege of M echatron ics Eng ineering, N orthw estern P oly technical U niver sity, X i an 710072, Ch ina)

Abstract AT91SAM 7 series of ARM M PU ( M icro Processing U nit) have no spec ial BOOT area T o : , update applicat io n prog ram, w e must use JTAG in terface and em ulato r and a l ays w e need to w rite appl, w i cat io n program at 0x0 once fa iled the pri ary application prog ram w ill be desdroyed T o reso lve the prob , , m . le m entioned above take AT 91SAM 7X256 fo r exam ple a Boo tlo aderw h ich updates application program m , , by Serial P ort is developed it contain s H ost Com puter softw are and L ow Com puter Boo tlo ader F irs, the , . t communicatio n pro toco l bet een H ost Com puter so ftw are and Boo tloader is introduced then the detailed w , design of H ost Com puter softw are and Boot lo ader is done at las, the Boo tloader is tested and the test , t resu lt is d isp layed . K ey w ords: Ser ia l Por; Ser ia lp ort C lass; Xm odem P rotoco ; M ultith read ing; P rogram Updation t l

1 引



之后 Bootloader再启动应用程序。

Bootloader作为嵌入式系统的上电启动代码, 不 仅可以作为操作系统的引导代码, 而且还可以作为 一个简易的、 廉价的应用程序开发工具, 实现应用程 序的下载或更新功能。通常先用 JTAG接口将 Boot lo ader烧到 ARM 里面的地 址 0x0处, 烧录完成后, 再用串口或者以太网口将 ARM 与电脑 连接, 此时 电脑上的上位机下载软件就可以与 ARM 上的 Boot lo ader进行通信, 这时就可以将应用程序通过串口 或者以太网口, 从电脑下载到 ARM 的 RAM 里。此 后, 若 Bootloader内含有写 FLAS 的程序, 则可以将 H RAM 里面的内 容写到 FLASH 里面去。 ARM 重新 启动后, 自动的从地址 0x0处运行 Bootloader程序,

2

Bootloader通信协议
以下介绍的 Boot lo ader 其上位机软件和下位机 ,

Boot lo ader通信所使用的通信协议是在 Xm odem 协 议 的 基 础 上, 根 据 实 际 情 况 修 改 而 成 的。 AT 91SAM 7系列 FLAS 每一页的大小为 256 个字 H 节, 下位机以页为单位对 FLAS 写操作, 为了方便 H FLAS 写操作, 本协议将每帧的有效数据定为 256 H 字节大 小, 更 新 数据 时, 每 下载 一 帧就 执 行一 次 FLAS 写操作。加上 帧起始 位, 帧序 号位和 CRC H 校验位, 本协议将一帧数据的大小定义为 260字节, 其格式如图 1所示。帧起始位为 SOH 或 EOT, 将最 后一个帧的帧起始位设置为 EOT, 下位机监测到帧

作者简介: 武国平 ( 1983- ) , 男, 陕西省榆林市人, 硕士研究生, 主研方向: 机电系统控制、 嵌入式控制。 收稿日期: 2009- 12- 11

104 起始位为 EOT 时, 就知道是最后一帧。
帧起始位 帧序号 有效数据 CRC 校验值 ( 2字节 ) ( 1字节 ) ( 1 字节 ) ( 256字节 )









2010年

下: 首先调用串 口初始化 函数 InitPort( ) 初始 化串 口, 再调用函数 BOOL StarM o rn itoring( ) 启动串口监 t 视线程, 至此, 串口就被打开, 各种串口状态和事件 就可以被监控。当串口监视线程监测到串口接收到 数据、 流控制事件或其它串口事件后, 就以消息方式 通知主程序, 激发消息处理函数来进行数据处理, 这 是对 接 收 数 据 而 言 的, 消 息 ( WM _COMM _RXCHAR )的消息处理函数 OnComm ( ) 需要手工添加; 发送数据可以 直接使用 串口发送 函数 W riteT oPort ( char* string) 向串口发送, 同 时也可以调用 Stop M ornitorin g( ) 暂停或停止监 视线程, 调 用 C losePort ( )来关闭串口, 释放串口资源。 3 2 2 上位机主要程序设计说明 . . ( 1)文件的加载 以二进制只读方式加载应用程序文件, 将文件放 入一个字节型的缓冲区 (假设设为 fpBuff) , 获取文件 总长度 F_len 以每包 P _S ize( 256)大小为单位将文件 , 分包, 然后计算文件总包数 ( P _Sum ) , 代码如下: CF ileD ialo g dlg ( TRUE, NULL, NULL, OFN _H I DEREADONLY | OFN _OVERWRI EPROMPT, "B in F ile |* . bin | ", T NULL); OpenF ile a e = dlg GetPath Nm . Nam e( ); CF ile OpenF ile ; OpenF ile Open( OpenF ile . Nam e CF ile : modeRead) , : F_len= OpenF ile GetL ength( ); . OpenF ile Read( fpBuf,f fplength); . OpenF ile C lo se( ); . P_Su = ( F _len /P_S ize) + ( F_len P_Size)? 1 0 m % : ; ( 2)数据帧的组建和下载 加载应用程序文件成功后创建写线程 ( 驱动写 线程的事件 wEvent在工程初始化时已经创建, 并处 于无信号状态 ) , 当数据传输被启动, 在写线程里按 图 1所示协议格式开始数据帧的组建, 帧的序列号 从 0x00开始, 每发送成功一个包, 包序号自动加 1 , 当包 序号等 于 255 时, 将下 一个包 的包 序号置 为 0x00 如果最 后一帧的 有效数据 不够 256 字节, 用 , 0xFF 填充; 每帧最后两字节存放有效数据 CRC 校 验值。 调用 CserialPort类提供的数据发送函数将准备 好的帧发送出去, 置 wEven t为无信号状态, 阻塞写 线程, 即: R esetE vent ( wEvent )、 a itForS ing leOb ject W ( wEven, I F I ITE ) , 等待 下 位 机 Bootloader 的 回 t N N 复。如果回复为 ACK、 NAK 或 CAN, 置事件有信号:

图 1 协议格式

数据传 输由 上位机 启动, 在传 输过 程中 使用 ACK, NAK 和 CAN 这三个控制 字符实现上位机和 下位机之间的交互。当上位机发送完一个包以后, 等待下位机的接收和解析, 当下位机接收到的包序 号 Seq和下位机对包的 CRC 校验与上位机发送的 包 Seq和 CRC 对应相等时, 则调用写 FLASH 函数 将 256个有效数据写入指定的 FLASH 地址。如果 写成功, 回复 ACK, 通知上位机继续发送下一个包, 如果包 列 号不 正 确、CRC 校 验不 正 确, 或 者 是写 FLASH 不成功, 回复 NAK, 通知上位机重新发送; 下 位机遇到异常情况时, 回复 CAN强迫上位机停止数 据帧的发送。

3 上位机软件设计
3 1 上位机软件设计流程 . 上位机软件是在 VC6 0开发环境下, 基于 MFC基 . 本对话框和一个 AP I串口通信类 CserialPor, 并采用线 t 程阻塞和事件驱动的方式实现的。基于 M FC 基本 对话框的工程建立好以后, 需要手工添加 C serialPort 类到工程中去, 上位机程序设计流程如图 2所示。

图 2 上位机程序设计流程

3 2 上位机软件设计说明 . 3 2 1 关于 CserialP ort类 . . CserialP ort类是 基于多线 程的, 其工作 流程如

5期

武国平等: ARM 7处理器 Boo tloader的设计与实现

105

SetE ven t( wEvent) , 恢复写线程的运行, 在写线程里 完成对 ACK、 NAK、 CAN的响应。

PDC传输, 只要指定每次接收字节数和接收数据缓 冲区, 系统会自动将接收到的数据放入指定的缓冲 区。 通信接口初始化步骤为: 使能串口外设、 开启串 口时钟、 允许出口接收和发送、 配置串口波特率和通 信模式、 开启串口 PDC 传输、 PDC 接收指定接收 为 缓冲区和缓冲 区长度 ( 接 收缓冲 区的长 度设 置为 260字节, 与上位机每次发送的数据包大小相等, 这 样上位机每发送一个包, 就会触发一次 PDC缓冲区 满中断 )、 使能串口 PDC 接收缓冲区满中断, 最后开 启总中断。 ( 2)存储器和向量表初始化 AT 91SAM 7X256的 FLASH 大小为 256K 字节, 即从 0x0到 0x40000 。而此处定义为 0x0 0x01FFF 是为了将 256K 字节的剩下部分留作应用程序区。 Boot lo ader程序编译成二进制文件大概是 6K, 所以 0x0到 0x01FFF 这个空间足够; RAM 区的配置采用 系统默认配置; 中断向量表地址必须是 FLAS 起始 H 地址处的 32字节, 这样 Boo tloader程序才可以正常 启动。对 XCL 文件的配置如下: 内部 ROM 地址: - DROM START = 00000000 - DROMEND= 00001FFF 内部 RAM 地址: - DRAM START = 00200000 - DRAMEND= 0020FFFF 中断向量表地址: - Z ( CODE) I TVEC = 00- 3F N ( 3)数据帧的接收、 解析和烧写 AT 91SAM 7系列 ARM 的 FLAS 只有一个 BANK H ( 除 AT 91SAM 7X512) , 如果 对 FLASH 写 操作 的函 数运行在 FLAS 区, 就无法对 FLASH 进行写操作, H 因此将应用程序写入 FLAS 前须先将写 FLASH 函 H 数搬到 RAM 区里运行, 然后进行 FLASH 写操作, 其

4 Boo tloader程序设计
4 1 Bootloader程序设计流程 . Bootloader程序, 在 I R4. 31 开发环境下设计, A 用于接收、 解析和将应用程序写入指定 FLASH 区。 Bootloader程序主要由启动代码和主程序两部分组 成, 启动代码 由汇编 程序和 C 语言 程序两 部分组 成。在启动代码里主要完成对向量表、 堆栈、 系统时 钟和中断状态寄存器的初始化; 串口的初始化和串 口中断函数的编写在主程序里完成, 串口中断函数 完成对每帧数据的接收、 解析和 FLASH 写操作; 存 储器和向 量表的初始化 工作在 XCL 文件 里完成。 Bootloader程序设计流程如图 3所示。

图 3

Boo tloade r程序设 计流程

4 2 Bootloader主要程序设计说明 . 关于启动代码部 分, 直接 引用了 ATMEL 提供 的面向 AT 91SAM 7系列的启动代码, 其由 Cstartup . s79和 C startu p_SAM 7 c两个文件组成。 . ( 1) 通信接口初始化 鉴于每次传输数据较多, 采用 PDC ( 外设 DMA 控制器 ) 通道完成串口 与上位机之间的数据传输, 这样可以避免处理器干涉, 减少处理器中断处理开 销。 PDC 传输方 式比通过读串口接 收保持寄存器 ( US_RHR )来接收数据的方式在效率上要高很多, 如果不使用 PDC 传输, 每次接收数据需要一个字节 一个字节地从 US _RHR 中往出 读数 据; 如 果使用

方法就是在写 FLASH 函数前加 _ram func 。 当串口接收到一包 260字节的数据后, 就会触 发处理器执行接收缓冲区满中断处理函数。中断处 理函数首先指定应用程序入口地址 StartA dr和一个 指向该入口地址的整型地址指针 addr_ptr 然后对 。 接收到的 260字节数据进行解析, 如果数据解析正 确, 就将 256字节 有效数据用写 FLAS 函数从 * H addr_ptr开始写入 FLASH。写 FLASH 之前 关闭总 中断, 写 FLASH 之后开启总中断。若写成功且非最 后一个包, 对包需 要 Seq 加 1 重 新设定 地址 指针 , addr_ptr 即: addr_ptr + = 64 , 。如果最后一 个帧处 理成功, 则将程序指针指向应用程序入口地址 Star tA dr运行程序。

106









2010年

5 Boo tloader测试
应用程 序可执行文件也 是由一个完整 的 I R A 工程生成。应用程序对应工程的启动代码与 Boot lo ader程序的启动代码在存储器初始化和向量表初 始化部分有所不同。对应用程序的存储器初始化和 向量表初始化要依据应用程序的烧写地址来完成, 假设应用程序起始地址为 0x00002000 对存储器和 , 向量表的初始化如下所示: 内部 ROM 地址: - DROMSTART = 00002000 - DROM END= 0003FFFF 内部 RAM 地址: - DRAMSTART = 00200000 - DRAM END= 0020FFFF 中断 向 量 表 地 址: - Z ( CODE ) I TVEC = N 00002000- 0000203F 将下位机的 Boo tloader程序借助 JTAG 接口烧 入 FLAS 起始地址 0X0处, 复位单片机, 然后就可 H 以通过串口, 借助于上位机下载软件完成应用程序 的加载或更新。在波特率为 115200bps时, 对该软 件进行了 200多次测试, 成功率 100 , Boo tloader测 % 试结果如图 4所示。

更新失败, 也可以运行原来的程序. 使用了 Boo tload er后, 在以后的程序更新中就可以省去对价格昂贵 的仿真器的依赖, 这在大量的实际工程应用中会节 约很多成本。

图 4 Bootloader测试结果 参考文献: [ 1] 龚建伟, 熊光明. 串口 通信 程序 实践 [ M ]. 北 京: 电子 工业出版社, 2007. [ 2] 徐爱钧. I AR EW ARM 嵌入式系统编 程与实践 [M ] . 北 京: 北京航空航天大学出版 社, 2006 . [ 3] 杜春雷. ARM 体系结构与编 程 [M ]. 北京: 清 华大学出 版社, 2003. [ 4] 马 忠 梅. AT 91 系 列 ARM 核 微 处 理 器 结 构 与 开 发 [M ]. 北京: 北京航空航天大学出版社, 2003. [ 5] ARM Incorporated ARM 7TDM I techn ica l reference m an. ua l[ Z]. ARM Incorporated 2004 , . [ 6] ATM EL. AT 91SAM 7X256 D atasheet[ Z ]. A t e l Co rpo ra m tion, 2003.

6 结束语
如果将此 Boo tlo ader应用到 实际工程 中, 可以 在 FLAS 里开辟两个应用程序区, 交替实现程序的 H 更新, 每次更新都不覆盖原来的程序, 这样即使程序 ( 上接第 102页 )

( a) 采用传统的 PI 电压波形 D

( b ) 采用非线性变速积分电压波形

图 4 充电机启动阶段输出电压波形

6 结束语
分段积分, 变速积分, 非线性变速积分等优化方 法相对于传统 P I 算法都有很大改进, 其中非线性 D 变速积分更为完善, 它既有控制速度快、 超调小、 线 性控制精度高等特点, 又有防止积分饱和的优势, 有

很强的实用性。
参考文献: [ 1] 胡寿松. 自动控制 原理 [M ]. 北京: 科学出版社, 2001 . [ 2] 李华, 范 多旺. 计 算机 控制 技术 [M ]. 北 京: 机械 工业 出版社, 2007. [ 3] 张卫平. 开关变换 器的建模 与控制 [M ]. 北京: 中国电 力出版社, 2005.


赞助商链接