打印
[应用相关]

STM32F4单片机bootloader及在线升级IAP基本原理

[复制链接]
手机看帖
扫描二维码
随时随地手机跟帖
81
正常情况下BootLoader1、BootLoader2、APP1、APP2四份代码需要更改烧写首地址用keil进行四次烧写。为了方便我们可以在APP1中将BootLoader1、flag、BootLoader2以boot数组表的形式存在。如下

使用特权

评论回复
82
发给她更好fh|  楼主 | 2024-1-31 20:31 | 只看该作者
const u32 bootflag[]  __attribute__((at(STM32_FLASH_UPDATERUN_FLAG_BASE))) ={
        0x00000011,//升级运行标志  
        0x00008000 //变量表偏移长度       
};
const u8 bootloader1[]  __attribute__((at(STM32_FLASH_BASE))) ={
0x78,0x06,0x00,0x20,0x81,0x04,0x00,0x08,0x55,0x02,0x00,0x08,0x57,0x02,0x00,0x08,
0x5B,0x02,0x00,0x08,0x5F,0x02,0x00,0x08,0x63,0x02,0x00,0x08,0x00,0x00,0x00,0x00,
                               。。。
0x00,0x7A,0x03,0x0A,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,
0x06,0x07,0x08,0x09,0x00,0x00,0x00,0x00
};

使用特权

评论回复
83
发给她更好fh|  楼主 | 2024-1-31 20:34 | 只看该作者
这样每次烧写,APP1会烧写在对应的偏移区域,BootLoader1、BootLoader2、flag会烧写在指定地址内。
boot表数组值从bin文件中提取,可以使用UltraEdit进行打开复制提取。

使用特权

评论回复
84
发给她更好fh|  楼主 | 2024-1-31 20:34 | 只看该作者

最后进行复制粘贴到keil代码里的数组中(轻松加愉快!)

使用特权

评论回复
85
发给她更好fh|  楼主 | 2024-1-31 20:34 | 只看该作者
5.5 测试
为方便测试此次升级直接将bin文件通过单片机串口发送至数组中,发送16进制的 7d 7d 7b 7b当做校验。
使用vofa+进行了串口测试,也可以使用其它的,

使用特权

评论回复
86
发给她更好fh|  楼主 | 2024-1-31 20:35 | 只看该作者
总结
总体上内容看起来很多其实原理非常简单,基本上就是flash的读写,BootLoader方案设计好基本都能实现。
本文仅从原理及基本实现上进行了讲解,实际使用可做具体优化:BootLoader函数指针数组化,升级串口增加通信协议,使用.s19文件或hex文件代替bin文件进行升级等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则