STM32F103 bootloader例程
时间: 2025-04-18 15:06:52 浏览: 19
### STM32F103 Bootloader 示例代码
对于STM32F103系列微控制器而言,Bootloader是一种允许用户通过不同接口(如UART、USB或CAN)来更新应用固件的程序。下面展示的是一个简单的基于串口通信的Bootloader示例代码[^2]。
#### 主要功能模块解析
- **初始化硬件资源**
配置系统时钟、GPIO端口以及USART外设参数。
- **检测启动模式**
判断当前是否处于Bootloader模式还是直接跳转至用户应用程序执行。
- **命令处理机制**
实现接收来自PC端发送过来的各种指令并作出相应响应的功能逻辑。
```c
#include "stm32f1xx_hal.h"
#define BOOTLOADER_START_ADDR ((uint32_t)0x0800C000) // 用户区起始地址
#define APP_START_ADDR ((uint32_t)0x08000000) // 应用区起始地址
// USART句柄定义
extern UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
HAL_Init();
/* 初始化系统时钟 */
SystemClock_Config();
/* GPIO初始化 */
MX_GPIO_Init();
/* 检查BOOT0引脚状态决定进入哪个模式 */
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0))
{
// 进入Bootloader模式
while(1){
// 处理上传/下载请求...
// 发送提示符给终端模拟器
char prompt[] = "> ";
HAL_UART_Transmit(&huart1, (uint8_t*)prompt, sizeof(prompt)-1, HAL_MAX_DELAY);
uint8_t buffer[64];
uint16_t length;
// 等待接收命令
HAL_UART_Receive(&huart1, buffer, &length, HAL_MAX_DELAY);
// 解析接收到的数据包
// 执行对应操作(读取Flash、擦除扇区、编程写入等)
}
}else{
// 启动用户应用程序
JumpToApplication(APP_START_ADDR);
}
}
/* 函数用于跳转到指定的应用程序入口点 */
__attribute__((noreturn)) static inline void JumpToApplication(uint32_t app_addr)
{
typedef void (*app_func)(void);
volatile app_func jump_to_app;
/* 获取复位向量表中的初始SP指针值 */
__set_MSP(*(__IO uint32_t*)(app_addr + 4));
/* 设置PC寄存器指向应用程序的第一条指令位置 */
jump_to_app = (app_func)(*(__IO uint32_t*)app_addr);
/* 开启中断使能 */
__DSB();
__ISB();
/* 跳转到目标函数 */
jump_to_app();
}
```
此段代码展示了如何构建一个基本框架,在此基础上可以根据实际需求进一步扩展更多特性,比如增加CRC校验支持以提高传输可靠性;加入安全认证环节防止非法刷机行为发生等等。
阅读全文
相关推荐


















