如何将IAP代码和APP代码一次性烧写进单片机

如何将IAP代码和APP代码一次性烧写进单片机,第1张

把zone1作为运行区,zone2作为备份区,每次升级时先将代码写在zone2,并设置标志,然后重启,bootloader识别有升级标志,将zone2的代码拷贝至zone1区,并清标志,就可以了,每次都是跳转至zone1运行。

我找到一个比较好的折中办法:

1. IAP 起始地址0x08000000,APP 起始地址0x08004000,上电复位进入IAP 程序

2. APP 程序的长度和CRC32校验码存放在0x0800FC00(Flash最后一页);

3. IAP 如果检测到是上电复位,IAP首先检查APP程序的CRC32校验码是否正确,如果正确则立即跳到APP程序;否则在IAP程序中等待软件重新配置APP程序FLash区;

这样,USB设备重枚举只会在第一次上电的时候会出现,当然,如果STM32固件需要升级,那么软件首先请求STM32 软复位,

4. STM32 软复位后进入IAP程序,IAP判断出如果是软复位,则等在IAP 中,接收上层软件的命令并配置APP Flash区;

5. 配置APP Flash完成之后,软件请求跳到APP区

IAP起始地址:iapaddr

APP起始地址:appaddr

中断向量表的起始地址:IAP:iapaddr+4(APP:appaddr+4)

中断向量存储的内容是中断服务程序的入口地址

typedef void(*iapfun)(void)  //定义函数指针类型

理解:iapfun表示一个指向函数的指针类型的名字,该指针类型为“指向返回void类型并且无参数的函数的指针”,可以使用函数名对函数指针进行初始化(定义函数指针对象):

iapfun iapjump2app //定义函数指针对象

jump2app=(iapfun)*(vu32*)(appxaddr+4) //为函数指针对象赋值

appxaddr+4:APP程序中断向量表起始地址(即复位中断)

(vu32*)(appxaddr+4):将APP程序中断向量表起始地址强制类型转换为指向vu32类型数据的地址

*(vu32*)(appxaddr+4):取出(vu32*)(appxaddr+4)地址所存储的内容(这个内容刚好就是该地址对应中断向量的中断服务程序入口地址,其实就是复位中断服务程序函数的函数名)

jump2app() //调用函数

运行的是中断服务程序对应的函数


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11265255.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存