STM32F072 RFID Reader BootLoader(LL 库)踩坑笔记

2026-10-20 · 嵌入式
STM32BootLoaderLL

给 RFID Reader 做 OTA,第一步就是个能跳转、能收固件、能校验的最小 BootLoader。F072 没有 DFU 之外的现成方案,所以自己写一个最稳。这里记一下关键结构。

1. Flash 分区

2. 向量表重映射

APP 跑到自己区域后,中断向量必须重定位,否则一进中断就飞。F0 系列没有 VTOR,要用 SYSCFG->CFGR1 把 SRAM 映射到 0x0000_0000:

// 在 APP 启动最前面做
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_SYSCFG_REMAPMEMORY_SRAM();   // 0x20000000 映射到 0x00000000
// 然后把中断向量表从 Flash 复制到 SRAM 头部
memcpy((void*)0x20000000, (void*)APP_ADDR, 0x100);

3. BootLoader 跳转到 APP

typedef void (*pFunc)(void);
void jump_to_app(uint32_t app_addr) {
    if (((*(volatile uint32_t*)app_addr) & 0x2FFE0000) != 0x20000000) return; // 栈顶合法性
    uint32_t sp = *(volatile uint32_t*)app_addr;
    pFunc pc = (pFunc)*(volatile uint32_t*)(app_addr + 4);
    __set_MSP(sp);
    pc();
}
注意:跳转前一定要先 __disable_irq(),关掉 BootLoader 用到的外设时钟和中断,否则 APP 起来后会被旧中断打断。

4. 升级协议(最小可用)

  1. 主机发 0xAA + len 进入升级模式;
  2. 分帧发固件,每帧带偏移和 CRC16,BootLoader 写入 Flash;
  3. 发完写「就绪标志 + 总长度」,软复位;
  4. BootLoader 起来先校验 CRC,通过则跳转,失败则停留在升级模式。

LL 库下擦写 Flash 用 FLASH_ErasePage / FLASH_ProgramHalfWord,记得每次操作前 FLASH_Unlock()、操作后 FLASH_Lock()。

← 返回首页