一、生成iap工程
1、新建boot loader工程
2、芯片stm32g431cbux,使用cubemx配置工程,用can盒子,配置:


3、开启串口和USB,设置DMA



4、配置时钟为168Mhz,usart1也为168Mhz
5、生成程序后编译下载,测试是否成功
二、编写iap
1、编译一次,找到工程中后缀.map文件打开,搜索Memory Map of the image

程序rom为28.24k,其实直接编译之后在编译信息也能看到,把前三者加起来即可

这个就是程序大小,等下需要偏移的量
2、给iap程序设置大小,点开魔术棒

0x20000 为 131072/1024=128kb,这个是芯片flash的大小,现在需要32k的容量,修改为32*1024=32768即0x8000


这样iap程序就设置完成了。需要注意的是,因为flash擦除都是按页的,所以这里也按页进行分配。
3、在app中,需要偏移32kb即

并在主函数中加入:SCB->VTOR = FLASH_BASE | 0x8000; //0x8000为BootLoader大小(偏移量) 注意只需要在app中加入,iap不用(其实也可以在iap程序中加入)

或者只在iap程序中加入,这样也是可以的

4、iap程序中添加跳转函数
定义类型

跳转函数

调用函数

正常跳转的话是不会进入while的了,可以打印输出试试
5、上面测试发现,无法从app中进入iap。经过研究后,也需要在iap中把中断向量偏移回来,

6、发现烧录了iap后,app程序不见了,是因为勾选了erase full chip,需要勾选到erase sectors,不管是app还是iap都需要这样设置

7、疑惑:不知道为什么在程序中直接调用app跳转会导致无法正常进入,需要重新拔插上电或者点击硬件复位才能正常进入。函数卡死在osKernelStart中。后改成使用软件复位方式进入app或者iap

iap中:

app中:

踩了很多坑,也还是有很多一知半解的东西

被折叠的 条评论
为什么被折叠?



