stm32 IAP升级方案

时间:2024-04-04 22:55:05

Stm32常见的两种升级方案。

方案一:两个main程序,先跑bootloader的main函数,再跑app的main函数

Flash划分如下:

stm32 IAP升级方案

问:bootloader main和app main如何衔接

答:stm32进入main的流程如下:

 

stm32 IAP升级方案

一般工程配置从flash启动,即boot0接地,具体从哪个地方启动,请参阅相关资料。复位后从0x08000004取出中断向量复位地址,执行复位中断服务函数,执行如下指令进入bootloader main。

stm32 IAP升级方案

进入bootloader main后,就可以为所欲为了,例如更新app main代码,然后跳到app main执行。

问:更新了app main后如何从bootloader main跳转过去执行

答:看下图执行流程:

 

stm32 IAP升级方案

新的执行地址是0x08000004+N+M,假设app保存在appxaddr处,在bootloader main里面执行

stm32 IAP升级方案

问:代码里面如何设置新偏移

答:先划分好两部分代码在flash中的位置,然后设置keil ,再在代码里面添

stm32 IAP升级方案

例如这里从0x8010000开始放置app 代码,前面64k为bootloader代码;然后在flash main 函数里面添加

SCB->VTOR = FLASH_BASE |0x10000 即可;

方案二:单升级main代码,不包含bootloader代码

内部flash划分图如下:

stm32 IAP升级方案

问:Bootloader如何判断是否要更新main代码段

答:根据flag段,读取flag段标志位判断是否需要升级。在startup_xx.s里面,新增一个函数

stm32 IAP升级方案

问:如何提取单纯的main段代码

答:利用sct分散加载文件,keil配置如下,选择你编写的sct文件

stm32 IAP升级方案

编写sct文件,将各个段的内容放到对应的地址,例如

Bootloader段

stm32 IAP升级方案

Flag段:

stm32 IAP升级方案

main段:

stm32 IAP升级方案

编译后会生成对应的段,如下:

stm32 IAP升级方案

我们只需要将后面的两个合并成一个bin文件就可以跳过前面的段得到main段代码。通过串口下载到外部flash,然后将flag段的升级标志置位

问:如何确保数据是正确的

答:利用crc校验数据即可,制作main段代码时算出crc,下载到flash算出crc,读到内部flash再算出crc,有了crc就可以做错误处理流程了,这里就不细谈了。

总结:理解了启动流程,后面想怎么玩都行,后面鲁棒性系统再慢慢完善就可以了。更多信息欢迎关注微信公众号:子非魚的雪球。