Stm32常见的两种升级方案。
方案一:两个main程序,先跑bootloader的main函数,再跑app的main函数
Flash划分如下:
问:bootloader main和app main如何衔接
答:stm32进入main的流程如下:
一般工程配置从flash启动,即boot0接地,具体从哪个地方启动,请参阅相关资料。复位后从0x08000004取出中断向量复位地址,执行复位中断服务函数,执行如下指令进入bootloader main。
进入bootloader main后,就可以为所欲为了,例如更新app main代码,然后跳到app main执行。
问:更新了app main后如何从bootloader main跳转过去执行
答:看下图执行流程:
新的执行地址是0x08000004+N+M,假设app保存在appxaddr处,在bootloader main里面执行
问:代码里面如何设置新偏移
答:先划分好两部分代码在flash中的位置,然后设置keil ,再在代码里面添
例如这里从0x8010000开始放置app 代码,前面64k为bootloader代码;然后在flash main 函数里面添加
SCB->VTOR = FLASH_BASE |0x10000 即可;
方案二:单升级main代码,不包含bootloader代码
内部flash划分图如下:
问:Bootloader如何判断是否要更新main代码段
答:根据flag段,读取flag段标志位判断是否需要升级。在startup_xx.s里面,新增一个函数
问:如何提取单纯的main段代码
答:利用sct分散加载文件,keil配置如下,选择你编写的sct文件
编写sct文件,将各个段的内容放到对应的地址,例如
Bootloader段
Flag段:
main段:
编译后会生成对应的段,如下:
我们只需要将后面的两个合并成一个bin文件就可以跳过前面的段得到main段代码。通过串口下载到外部flash,然后将flag段的升级标志置位
问:如何确保数据是正确的
答:利用crc校验数据即可,制作main段代码时算出crc,下载到flash算出crc,读到内部flash再算出crc,有了crc就可以做错误处理流程了,这里就不细谈了。
总结:理解了启动流程,后面想怎么玩都行,后面鲁棒性系统再慢慢完善就可以了。更多信息欢迎关注微信公众号:子非魚的雪球。