STM32 Bootloader与APP工程的建立
最近刚搞完电信物联网平台的OTA升级,将新的MCU固件代码,以.bin的形式放到电信物联网平台,然后平台与设备配合进行空中升级操作。有点蛋疼的事,开始做的时候,电信平台上叫“软件管理”的东西才是所需要的,而不是那个“固件管理”。开始的时候一直搞这个“固件管理”升级,弄不通。又要求一个礼拜搞完,我去,可急坏了。
好了,先说说这第一步,将STM32分成bootloader和APP工程吧
1、bootloader部分,分区,STM32的程序开始地址是0x8000000,分片0x3000即12K的大小(这个根据实际情况分配),
同时生成.bin和.hex文件,
C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o../OBJ/bootloader_v40.bin ../OBJ/bootloader_v40.axf
C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --i32 -o../OBJ/bootloader_v40.hex ../OBJ/bootloader_v40.axf
目标工程使用内存布局
Flash Download设置
工程配置完成
2、APP工程配置
注意这里的IROM1设置,是APP运行的起始地址,是从0x8000000再偏移0x3000,即0x8003000,app工程大小设置为0xc800(50k),我的分区是
bootloader 0x8000000 --- 0x8002FFF 12K
app 0x8003000 --- 0x800F7FF 50K
App BAK 0x800F800 --- 0x801C000 50K
app_info 0x801C000 --- 0x801FFFF 16K
app_info实际用不了这么大,一般1-4K 就可以了。也可以就留4K 其它12K 分给app,两个app各加6K,即56K
其它的都同bootloader设置
跳转指令
void jump_to_app(void)
{
if(((*(volatile uint32_t*)SYS_APP_SAVE_ADDR_BASE) & 0x2FFE0000) == 0x20000000) // 检查栈顶指针是否合法
{
jump_addr = *(volatile uint32_t*)(SYS_APP_SAVE_ADDR_BASE + 4);
jump_to_application = (FunVoidType)jump_addr;
__set_MSP(*(volatile uint32_t*)SYS_APP_SAVE_ADDR_BASE); //初始化堆栈指针
jump_to_application();
}
}
app区间内的程序下载一定要正确,不然跳转不到APP,会认为栈顶指针不合法,或者合法了,跳转了有其它问题
好了,几个分区的设置就完成了,有错误的地方,欢迎大家留言更正