stm32g bootloader编写 app跳转
时间: 2025-06-18 17:45:06 浏览: 11
### STM32G 微控制器 Bootloader 编写与 APP 地址跳转
#### 配置概述
在 STM32G 微控制器中,Bootloader 是一种用于更新固件的应用程序。它通常被放置在闪存的特定区域,并允许设备通过多种方式(如 UART、USB 或 SPI)接收新的应用程序代码并将其烧录到指定地址。为了实现这一功能,需要合理分配 Flash 存储空间,并确保 Bootloader 和应用程序之间的切换逻辑清晰。
Flash 的分区设计如下表所示:
| 功能 | 大小 | 描述 |
|--------------|---------|----------------------------------------------------------------------|
| BootLoader | 16 KB | 包含初始化代码和跳转逻辑 |
| 应用程序 (APP)| 44 KB | 主应用存储区 |
| 变量保留区 | 4 KB | 用于掉电保护的关键数据 |
这种划分可以满足大多数嵌入式系统的开发需求[^1]。
---
#### 工程配置
在使用 STM32CubeMX 创建项目时,需注意以下几点:
1. **设置 Flash 下载起始地址**
将 Bootloader 放置于 `0x08000000` 地址处,而应用程序则从 `0x08004000` 开始(假设 Bootloader 占用前 16KB)。这可以通过调整链接脚本中的参数来完成。
2. **禁用全芯片擦除选项**
在下载新版本的应用程序时,应选择“部分擦除”,以免误删已存在的 Bootloader 代码[^3]。
---
#### 示例代码
以下是完整的 Bootloader 实现流程及其核心函数定义:
```c
#include "stm32g4xx_hal.h"
#define APPLICATION_ADDRESS ((uint32_t)0x08004000)
// 检查目标地址是否有效
static uint8_t CheckValidApp(uint32_t addr) {
if (__HAL_FLASH_GET_FLAG(FLASH_FLAG_EOP)) {
return (*(volatile uint32_t *)addr == 0xFFFFFFFF || *(volatile uint32_t *)(addr + 4) != 0x2001C000);
}
return 1;
}
// 跳转至用户应用程序
void JumpToApplication(void) {
typedef void (*pFunction)(void);
// 获取向量表首地址
pFunction JumpAddress = (pFunction)*(__IO uint32_t*)(APPLICATION_ADDRESS + 4);
// 设置 MSP 寄存器为主栈指针
__set_MSP(*(__IO uint32_t*)APPLICATION_ADDRESS);
// 执行跳转
JumpAddress();
}
int main(void) {
HAL_Init();
// 初始化外设
SystemClock_Config();
MX_GPIO_Init();
// 按键检测:如果按下,则进入 IAP 更新模式;否则跳转到 APP
if (!User_Press_Key()) {
if (CheckValidApp(APPLICATION_ADDRESS)) {
JumpToApplication();
} else {
Error_Handler(); // 如果未找到有效的 APP 则停止运行
}
}
while (1) {
// 默认行为:闪烁 LED 表明处于 Bootloader 状态
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
HAL_Delay(500);
}
}
```
上述代码实现了以下几个主要功能:
- 定义了应用程序的起始地址为 `0x08004000`[^2];
- 提供了一种简单的校验机制以确认目标地址是否存在合法的代码;
- 使用堆栈指针 (`MSP`) 和重定位后的中断向量表完成了安全跳转过程。
---
#### 注意事项
当实际部署此方案时,请务必验证硬件平台的具体特性以及所使用的工具链支持情况。例如,在某些型号下可能还需要额外考虑缓存一致性问题或者特殊寄存器访问权限等问题。
阅读全文
相关推荐


















