STM32F072 RFID Reader BootLoader(LL 库)踩坑笔记
给 RFID Reader 做 OTA,第一步就是个能跳转、能收固件、能校验的最小 BootLoader。F072 没有 DFU 之外的现成方案,所以自己写一个最稳。这里记一下关键结构。
1. Flash 分区
0x0800_0000起 16KB:BootLoader 自己0x0800_4000起:APP 区(注意和链接脚本里的FLASH_ORIGIN对齐)- 末尾留一小块当「升级标志 + 固件长度 + CRC」
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. 升级协议(最小可用)
- 主机发
0xAA + len进入升级模式; - 分帧发固件,每帧带偏移和 CRC16,BootLoader 写入 Flash;
- 发完写「就绪标志 + 总长度」,软复位;
- BootLoader 起来先校验 CRC,通过则跳转,失败则停留在升级模式。
LL 库下擦写 Flash 用 FLASH_ErasePage / FLASH_ProgramHalfWord,记得每次操作前 FLASH_Unlock()、操作后 FLASH_Lock()。