通常实现IAP功能时,需要在设计固件程序时编写两个项目代码,第一个项目程序即BOOT程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USART)接收程序或数据,执行对第二部分代码的更新;第二个项目程序即APP程序用户真正的功能代码。这两部分项目代码同时烧录在Flash中,当芯片上电后,首先是第一个项目程序BOOT开始运行,它主要实现如下功能:
更多信息咨询请联系angel.qi:13827489351(微信与手机号码同步)
1)检查是否需要对第二部APP程序代码进行更新
2)如果不需要更新则转到4)
3)执行更新操作
4)跳转到第二部分代码执行
第一部分BOOT代码可以通过SWD或者离线编程器下载到芯片Flash内部,第二部分APP和第一部分BOOT一起烧入芯片内部,以后需要程序更新再通过第一把BOOT代码更新。根据芯片系列的Flash存放不同地址范围,从最低地址区域开始存放BOOT,紧跟其后的就是APP程序,本篇笔记受限于芯片内部Flash容量,只是存放一个APP程序。即在芯片内部有两个程序即BOOT和APP程序。
IAP功能具体实现
芯片程序一般从Flash地址0x0000_0000开始执行,基于Cortex-M0+内核特性,内部通过中断向量表来响应中断,程序从中断向量表取出复位中断向量执行中断程序,当中断产生,芯片内部PC指针定位到中断向量表来取出对应的中断服务程序执行。如果没有中断产生,在芯片执行完复位中断服务程序后,跳转到main函数顺序执行死循环。如果有中断产生,通过中断向量表执行对应的中断服务程序。
当加入IAP后,芯片还是从中断向量表取出复位中断向量执行中断程序,如果没有中断产生,在芯片执行完复位中断服务程序后,跳转到main函数。在执行完IAP后,新程序的复位中断向量地址为0x0000_0004 + BOOT程序大小,跳转到APP程序的复位向量表,执行APP的复位中断服务程序,随后跳转到APP程序的main函数执行。
其中:BOOT程序大小3.5KB
Para 区域存放IAP升级期间参数和标志占用0.5KB
APP程序大小为24KB
Demo程序,操作流程如下:
先将APP工程HEX下载到芯片内部
打开BOOT工程HEX下载到芯片,或者可以使用工具将两个HEX文件合并在一起下载到芯片内部。
使用上位机演示程序,打开串口波特率固定为9600。按照协议将APP工程的bin文件下载到0x1000开始的芯片内部,其中要求APP的bin文件小于28KB。
参考样例及驱动
通过上述介绍,使用演示Demo程序IAP需要特定协议。
通信协议格式如下:
///*frame:68 A0 A1 C Page L0 L1 D0... DN-1 CRC0 CRC1 16*///
///*offset :0 1 2 3 4 5 6 7 8+N 9+N 10+N 11 +N*///
头字符: 固定字符为0x68 一个字节
地址: A0 A1 两个字节
控制码C: 读地址为0x15 写地址为0x25
页地址page: 一个字节 代表现在要操作的那个页
长度L0 L1: 两个字节 L0代表高字节,L1代表低字节,此处长度仅代表数据区域长度
数据域D0…DN-1 : 代表读出或者写入的数据
数据校验CRC: 采用CRC-16方式,代表数据域数据的校验。
结束符号:固定字符为0x16 一个字节
读指令如下:
68 A0 A1 15 Page 0x00 0x00 CRC0 CRC1 16
正确回复:68 A0 A1 95 Page 0x04 0x00 D0 ………… D1023 CRC0 CRC1 16
错误回复 68 A0 A1 D5 Page 0x00 0x00 CRC0 CRC1 16
Page 选择(0 -- 27)
每次读取1K字节数据
写指令如下:
68 A0 A1 25 Page 04 00 D0 ………… D1023 CRC0 CRC1 16
正确回复:68 A0 A1 A5 Page 04 00 CRC0 CRC1 16
错误回复 68 A0 A1 E5 Page 00 00 CRC0 CRC1 16
Page 选择(0 -- 27)
每次写1K字节数据
开始IAP升级指令
68 A0 A1 36 00 00 00 00 00 16
正确回复 68 |