开发bootloader/IAP的一些注意事项(基于STM32F407VET6)

以下是博主本人使用的环境,也推荐一些好用的开发工具,:

WSL2 + VS Code,搭配Makefile构建项目(可从stm32cubemx获取)

调试工具推荐:J-Link + Ozone + EasyLogger(一款轻量化的日志调试工具)

烧录工具推荐: J-Flash

注意事项盘点:

Flash空间规划:

根据自己所使用的芯片型号,明确划分Bootloader区、参数区(用于放置APP区的参数如魔数字节,长度,CRC校验值等)、APP区,防止地址重叠导致固件覆盖。

下面是我使用的Flash分区:

#define FLASH_BOOT_ADDRESS          0x08000000
#define FLASH_BOOT_SIZE             48 * 1024

#define FLASH_ARG_ADDRESS           0x0800C000//魔数段地址,用于保存应用区的参数信息,即参数区
#define FLASH_ARG_SIZE              16 * 1024

#define FLASH_APP_ADDRESS           0x08010000
#define FLASH_APP_SIZE              256 * 1024

心跳提供

建议使用SysTick定时器(1ms中断),

void SysTick_Handler(void)
{
    ticks++;  //每一次进入中断,心跳数++
}
如果心跳数没有变化,可以试试在Makefile中将优化等级设置为O0,保证心跳的正常工作

链接脚本的使用:

在开发过程中不免需要提前烧录app区代码以用于验证一些功能(设计程序完整性验证函数用于在上电后校验app程序完整性;从参数区取出app区的参数,计算当前app的crc32校验值,与预定义的crc32值进行比对,若匹配失败,则陷入boot模式,防止跳转至已经被破坏的APP区程序,从而发送一些不可预料的错误):

可通过修改链接脚本,使烧录首地址指向app区,推荐使用J-Flash烧录

/* Specify the memory areas */
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (xrw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K   /*更改此处,修改程序在Flash存放的起始位置与大小*/
}

中断与跳转管理:

跳转前的准备

在从Bootloader跳转至APP前,须设置SP(offset+0)与PC(offset+4)指针必须禁用全局中断__disable_irq()),防止残留中断触发异常

    
    typedef int (*entry_t) (void);

    uint32_t address = FLASH_APP_ADDRESS;
    uint32_t _sp = *(volatile uint32_t *)(address + 0);//设置SP指针
    uint32_t _pc = *(volatile uint32_t *)(address + 4);//设置PC指针

    (void)_sp;
    
    entry_t app_entry = (entry_t)_pc;

    bl_lowlevel_deinit();//关闭开启的中断

    app_entry();//跳转至APP区

正确重设中断向量表

在APP的main()函数开头,通过SCB->VTOR重定向中断向量表至APP区首地址

//APP区
int main(void)
{   

    SCB->VTOR = 0x08010000; //设置中断向量表起始地址

    bl_lowlevel_init();
    bl_led_init();
while (1)
{
    bl_led_on();
    for (int i = 0; i < 1000000; i++);
    bl_led_off();
    for (int i = 0; i < 1000000; i++);
}
}

最后,通过以上注意事项,开发者可降低Bootloader开发中的风险,提升系统鲁棒性。具体还需结合芯片手册调试,确保底层操作(如Flash擦写)符合硬件规范

你可能感兴趣的:(stm32,嵌入式硬件,单片机)