AT91SAM7Sxx系列MCU Boot-Loader的设计
2.3Flash的操作
把所有操作Flash的函数定义在RAM空间,例如:
__ramfunc int CFlash::Erase_All(void)
因为SAM7Sxx系列的Flash采用单层结构,不允许程序在Flash上运行的同时改写Flash的内容, 所以要将操作Flash的程序放在RAM中运行.
2.4 数据包的处理
第一个数据包包含用户启动代码和异常向量表。Boot-Loader需要修改复位向量,并保存用户入口地址(伪代码如下)
if (Page == 0) {
Get User Entrance Address
Replace User Entrance Address with Boot-Loader Entrance Address
Program first page into Flash
Set flag to indicate an unfinished task
Calculate checksum and return to PC
}
收到结束指令后需要设置完成标志(伪代码如下):
if (Command == END_OF_TASK) {
Write last page into Flash
Reset unfinished flag
Calculate checksum and return to PC
}
如果页地址与boot-loader 重叠,则不进行写操作,仅返成功标志给PC:
if ( (Page >= BL_START_PAGE) (Page = BL_END_PAGE) ) {
ret = true ;
break ;
}
3 PC端下载软件的实现简介
下面是标准的PC端操作流程:
- 获得USB HID 类GUID
- 获得所有HID设备结构数组
- 根据VIDPID 获得设备信息
- 打开设备句柄
- 与Boot-Loader 进行通讯
以上操作步骤在Windows, MacOS, Linux 中都是通用的,读者可以在参考文献3找到关于PC端程序实现的具体方法。
图 Boot-loader 在Flash中的位置(以SAM7S256为例)
4 结论
本文介绍的实现方法简化了AT91SAM7Sxx系列用户程序升级过程。HID类的USB接口增加了产品跨平台应用的灵活性。笔者测试下载25K代码约2秒钟,具有一定实用价值。
参考文献
[1] at91sam7s_full.pdf. Http://www.at91.com
[2] HID1_11.pdf. Http://www.usb.org
[3] Stuart Allman Using the HID class eases the job of writing USB device drivers. Http://www.edn.com
评论