前言
扩展-IAP 主要用于产品出厂后应用程序的更新作用 ,类似于其他引导装载升级程序的方法,在系统中必须始终 存在一段用于程序装载的代码(bootloader),该代码在启动时被运行。
其基本功能是根据外部条件来判断是运行现有版本的程序还是从主机下载新程序。
可用于使用串口下载器替换专用下载器进行下载,硬件设备的软件的远程升级等功能。
一、ROM资源
如图0x0000到0x3fff为程序空间,可将程序空间进行分配,此处分为两个空间分别存储两个程序,共两个工程,一段为BootLoader(引导加载程序),一段为application(用户程序),MCU启动先执行BootLoader程序,检测有无升级标志位,再跳转入application程序执行,因此将BootLoader程序放在MAIN FLASH 空间最前面,芯片上电既运行BootLoader程序,再由BootLoader程序跳转到app程序执行。
例程程序为BootLoader,空间分配为0x0000-0x0A00,共2.5k程序空间作为BootLoader程序存放空间 。
0x0A00-0x3FFF空间可用作app空间。
二、KEIL有关知识
本例程使用keil作为编译工具,keil已经为我们做好了程序空间分配的相关功能,并能使用相应的连接器连接程序代码,不同的连接方式储存空间的分配方式不同,下面介绍keil的两种链接器。
Keil连接器介绍:
keil有两种连接器
- 一种为BL51是keil默认连接器
- 一种为LX51是BL51扩展连接器
两种连接器均可设置keil代码存放空间。
以下图片均可作为例程APP代码配置。
1.BL51连接器:
在device选项卡中去掉LX51的√即选用BL51连接器,即可选用KEIL默认链接器BL。
在BL51locate
选项卡中,Use memory layout from target dialog
选项为使用默认代码存放位,代码存放地址为0x0000
起始开始,去掉勾后可改变代码存放地址,
code range
为代码存放地址,即ROM空间,xdata
为RAM空间分配,
可默认,跳转后可重新分配,如:
2.LX51连接器:
在device选项卡中勾上LX51的√即选用LX51连接器
Use memory layout from target dialog选项为使用默认代码存放位,代码存放地址为0x0000起始开始,去掉勾后可改变代码存放地址,user classes分配代码空间,如:
分配代码空间为0x0A00-0x3FFF,具体可自己按格式定义。
三、Keil其他相关项说明:
Memory model:默认变量分配,small默认分配变量为idata,large默认分配变量为xdata。 Code rom size:small程序代码最大2k,Large程序代码最大64k。
Level:程序优化等级,考虑到程序优化时的分配,建议app程序优化等级不可超过8。
Interrupt vector at address:中断偏移地址。
四、MCU启动文件说明:
CSEG AT 0A00h 启动地址为0x0A00。 MCU程序跳转语句: ((void (code *) (void)) 0x0A00) ();定义函数指针指向0x0A00地址。
五、例程BOOTLOADER使用说明
程序占用空间:例程程序大小大约占0x0000-0x0900,因为flash分页设置及BootLoader余量考虑,BootLoader程序占用空间为0x0000-0x0A00。 程序运行顺序:
程序以P05脚为检测标志位,可自行更改,P05设置为上拉输入,拉低为需要更新程序,更新程序时先擦除flash,再写入,可写入的flash空间为0x0A00-0x3FFF。不可超出此空间。写入完成后会跳转到app程序执行。
六、例程使用可更改说明:
更改启动文件里中断偏移量,与app起始地址相同。
更改烧写地址,与app起始地址相同 定义触发升级IO口。其中串口定义为P03 (RX),P04(TX)脚。 完成程序更改。
七、程序使用通信方式:XMODEM
XModem是一种在串口通信中广泛使用的异步文件传输协议,分为XModem和1k-XModem协议两种,前者使用128字节的数据块,后者使用1024字节即1k字节的数据块。本例程限于RAM大小使用XModem协议。
1. XModem信息包格式
XModem协议最早由Ward Christensen在20世纪70年代提出并实现的,传输数据单位为信息包,信息包格式如下:
2. 校验和的计算
所有的数据字节都将参与和运算,由于校验和只占一个字节,如果累加的和超过255将从零开始继续累加。
3. 字段定义
01H
04H
06H
15H
18H
4. 校验和方式的XModem传输流程
传输流程如图所示: 对于发送方仅仅支持校验和的传输方式,接收方应首先发送NAK信号来发起传输,如果发送方没有数据发送过来,需要超时等待3秒之后再发起NAK信号来进行数据传输。对于数据传输正确,接收方需要发送ACK信号来进行确认,如果数据传输有误,则发送NAK信号,发送方在接收到NAK信号之后需要重新发起该次数据传输,如果数据已近传输完成,发送方需要发送EOT信号,来结束数据传输。
5. 如何取消数据传输
当接收方发送CAN表示无条件结束本次传输过程,发送方收到CAN后,无需发送EOT来确认,直接停止数据的发送。
八、APP程序说明
App程序主要注意以下几点
- 定义代码存放位置,详见上面连接器有关知识。
- 中断偏移,详见keil其他相关项说明
- 代码启动位置,详见启动项说明。
- 代码空间,注意不能超出剩余代码空间,否则程序烧写不完整。
九、APP代码升级说明
一般代码升级有两种方式,PC端软件升级或通过另一模块升级。
升级前要下载BootLoader程序到芯片并置位相应的脚触发升级信号。
PC端升级
使用支持xmodem协议的串口助手。
十、代码合并烧写
考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次,
增加工人劳动力的基础上写了IAP+APP ==>双剑合一
,
减少烧写次数,增加烧写效率。
代码合并软件,此处使用Notepad++。
直接打开两个工程生成的HEX文件
滑到文件最下方可以看到:00000001FF 这句话,这句话为文件结束语句,删除,然后Copy另一文件全部数据,加入到文件后方,如图:
即完成两个hex的合并,可以使用量产编程器下载验证。