STM32BOO跳转APP
时间: 2025-01-27 19:17:09 浏览: 54
### STM32 Bootloader 跳转至应用程序的方法
#### 1. 设置BOOTLOADER 和 APP 的空间
为了使STM32能够区分BOOTLOADER和应用程序,需要合理规划两者占用的闪存区域。通常情况下,BOOTLOADER会被放置在较低地址处,而应用程序则位于较高地址位置。例如,如果使用的是0x80000字节大小的Flash存储器,则可以将前4K保留给BOOTLOADER,剩余部分留给应用代码[^5]。
#### 2. 接收并写入应用程序BIN文件到FLASH
当通过UART或其他接口接收到新的固件更新数据包后,应将其保存为二进制格式(.bin),随后利用HAL库中的`HAL_FLASH_Program()`函数逐页编程的方式把该镜像写入指定的应用区段内。注意要确保擦除目标扇区后再进行写操作,并且每次写之前都要验证CRC校验码以保证数据完整性。
#### 3. 修改应用程序链接脚本与启动文件
对于应用程序而言,必须调整其ROM起始地址以便于正确加载到预设的位置上(如前所述可能是0x08002000);同时还需要更改中断向量表偏移量指向新基址处,这可以通过修改startup_stm32xxx.s汇编源码里的Vectors定义来完成。此外,在编写C/C++项目时记得同步更新scatter file或.ld文件内的MEMORY布局描述语句。
#### 4. 实现从BOOTLOADER 到 APP 的跳转逻辑
一旦确认有合法有效的用户程序存在于外部Flash中之后就可以准备切换控制权了。具体做法是在适当时候调用如下所示的一组指令序列:
```c
void JumpToApplication(uint32_t *pAppVectorTable){
/* Enable instruction cache */
SCB_EnableICache();
/* Disable interrupt before jumping to application */
__disable_irq();
/* Remap RAM at address 0x0000_0000 (optional depending on device family)*/
// SYSCFG->MEMRMP |= SYSCFG_MEMRMP_SWAP_BANK;
/* Set stack pointer and program counter from vector table of the app*/
uint32_t StackPointer = *(volatile uint32_t*) pAppVectorTable;
void (*ResetHandler)(void)=*(void (**)(void))(pAppVectorTable + 1);
/* Load new SP value into MSP register */
__set_MSP(StackPointer);
/* Execute reset handler which will start user code execution */
ResetHandler();
}
```
上述代码片段展示了如何安全地转移处理器上下文环境至另一份独立存在的可执行体当中去。这里的关键在于读取目的映像的第一项作为堆栈指针初值(MSP),第二项则是入口点即复位处理程序(RST Handler)。
阅读全文
相关推荐

















