IAP实现方式
一般包括网上使用较多的方式是采用"bootloader" + "主程序"的方式来实现。bootloader提供升级及引导,主程序负责功能实现。
这样实现的好处:独立了升级部分,只需要在主程序中添加一条升级命令,即可实现程序升级。
暂时来看,唯一的缺点是占用空间比一个程序大,主要是两部分代码会有重合部分。
Bootloader部分
Bootloader必须实现如下功能:
- 判断是否需要升级;
- 接收升级文件,并写入ROM flash;
- 升级失败处理(如升级出错/主程序无法正常运行,能够准确检测,并报错);
主程序部分
主程序除了需要添加一条命令外,还需要主程序能从非起始地址(如STM32的起始地址为0x8000000)启动并正常运行。
此处涉及到两处修改(以起始地址0x8000000为例):
第一修改程序的中断向量偏移
在文件“system_stm32f4xx.c”中有其定义:
/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET 0x0
上面这个值为默认偏移量。如果主程序放到0x8020000处,则这个偏移量需要修改为0x20000。可以看到这个值即为你需要的偏移地址。
第二 修改程序的下载地址
这个值,不同的编译环境,有不同的配置。
如sw4stm32中,用STM32CubeMX生成的在文件STM32F405VGTx_FLASH.ld中定义;直接创建的工程在LinkerScript.ld中定义。
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 1024K -- STM32CubeMX生成的工程
ROM (rx) : ORIGIN = 0x8000000, LENGTH = 1024K -- 原始工程
如上,这是sw4stm32工程中关于FLASH起始地址及大小的定义。只需要将这个0x8000000修改为0x8020000即可,大小可改可不改建议改掉。
特别注意:修改这个需要先删除编译的DEBUG文件夹,以便进行重新编译。
keil环境中,修改Target配置中的IROM即可,用keil的可以找一下,不在此详述。
下载
由于gcc编译出来的为bin文件,不带有一些地址参数,所以用下载器或者其它工具下载代码时需要注意选择下载地址,不要配置为默认地址0x8000000了。