STM32 Bootloader与APP工程的建立

最近刚搞完电信物联网平台的OTA升级,将新的MCU固件代码,以.bin的形式放到电信物联网平台,然后平台与设备配合进行空中升级操作。有点蛋疼的事,开始做的时候,电信平台上叫“软件管理”的东西才是所需要的,而不是那个“固件管理”。开始的时候一直搞这个“固件管理”升级,弄不通。又要求一个礼拜搞完,我去,可急坏了。

好了,先说说这第一步,将STM32分成bootloader和APP工程吧

1、bootloader部分,分区,STM32的程序开始地址是0x8000000,分片0x3000即12K的大小(这个根据实际情况分配),

STM32 Bootloader与APP工程的建立

同时生成.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

STM32 Bootloader与APP工程的建立

目标工程使用内存布局

STM32 Bootloader与APP工程的建立

Flash Download设置

STM32 Bootloader与APP工程的建立

工程配置完成

2、APP工程配置

STM32 Bootloader与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

STM32 Bootloader与APP工程的建立

其它的都同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,会认为栈顶指针不合法,或者合法了,跳转了有其它问题

好了,几个分区的设置就完成了,有错误的地方,欢迎大家留言更正