登录/注册

stm32 bootloader编写

更多

编写STM32的Bootloader涉及芯片启动流程、内存管理、Flash编程和跳转机制。以下是详细步骤和关键点(以标准库/HAL库为例):


1. 基础概念


2. Bootloader设计流程

(1) 内存分配规划

区域 起始地址 大小示例 用途
Bootloader 0x0800 0000 16KB Bootloader代码
应用程序(APP) 0x0800 4000 剩余Flash 用户程序
APP中断向量表 0x0800 4000 - APP的中断向量

:需在链接脚本(.ld文件)中为APP配置偏移地址(示例地址:0x4000


(2) Bootloader核心代码

#include "stm32f1xx.h"  // 根据芯片型号选择头文件

#define APP_ADDRESS 0x08004000  // APP起始地址

typedef void (*pFunction)(void);

void JumpToApp(void) {
    uint32_t *pAppStack = (uint32_t*)APP_ADDRESS;
    uint32_t *pAppReset = (uint32_t*)(APP_ADDRESS + 4);

    // 检查栈顶地址是否在RAM范围内
    if((*pAppStack & 0x2FFE0000) == 0x20000000) {
        // 关闭全局中断
        __disable_irq();

        // 重置所有外设(可选)
        RCC->APB2RSTR = 0xFFFFFFFF;
        RCC->APB2RSTR = 0x00000000;

        // 设置主堆栈指针
        __set_MSP(*pAppStack);

        // 跳转到APP复位中断服务程序
        pFunction AppStart = (pFunction)pAppReset;
        AppStart();
    } else {
        // 错误处理:LED报警或重启
        while(1);
    }
}

int main(void) {
    // 初始化时钟、串口、Flash等
    HAL_Init();
    SystemClock_Config();

    // 检查是否需要固件更新(如串口接收到升级命令)
    if(NeedUpdate()) {
        UpdateFirmware(); // 通过UART/USB接收新固件并写入APP区域
    }

    // 跳转到APP
    JumpToApp();
}

(3) 固件更新函数(伪代码)

void UpdateFirmware(void) {
    FLASH_EraseInitTypeDef erase;
    uint32_t sector_error = 0;

    // 解锁Flash
    HAL_FLASH_Unlock();

    // 擦除APP区域(以扇区为单位)
    erase.TypeErase = FLASH_TYPEERASE_PAGES;
    erase.PageAddress = APP_ADDRESS;
    erase.NbPages = 10;  // 根据实际大小调整
    HAL_FLASHEx_Erase(&erase, &sector_error);

    // 通过串口接收新固件(如YMODEM协议)
    while(接收数据中) {
        // 写入Flash(每次写入4字节)
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, target_addr, data);
    }

    // 锁定Flash
    HAL_FLASH_Lock();
}

(4) 用户程序(APP)关键修改

在APP的main.c开头重定向中断向量表:

// main.c
int main(void) {
    // 重定向中断向量表到APP起始地址
    SCB->VTOR = FLASH_BASE | 0x4000;  // 与链接脚本偏移一致

    // ...后续初始化代码
}

在链接脚本(.ld文件)中修改Flash起始地址:

MEMORY {
  RAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 64K
  FLASH (rx) : ORIGIN = 0x8004000,  LENGTH = 256K - 16K  // 减去Bootloader空间
}

3. 关键注意事项

  1. 中断处理

    • Bootloader中禁用所有中断,跳转前关闭全局中断(__disable_irq()
    • APP中第一时间重定向中断向量表(SCB->VTOR
  2. Flash编程

    • 严格按照芯片页/扇区大小擦除
    • 写操作需按字(4字节)对齐
  3. 通信协议

    • 推荐使用可靠协议(如YMODEM、XMODEM-CRC)
    • 包含数据校验(CRC32/MD5)
  4. 失败恢复

    • 添加超时机制和看门狗
    • 保留备份固件区域(双APP切换)

4. 调试技巧

  1. Bootloader调试

    • 临时修改跳转地址到SRAM调试APP
      #define DEBUG_ADDR 0x20000000  // 在SRAM中调试APP
  2. 日志输出

    • 通过串口打印关键步骤状态
  3. 硬件支持

    • 使用LED指示Bootloader状态(闪烁模式)
    • 预留按键强制进入升级模式

5. 官方资源参考

  1. 文档
    • AN2606: STM32系统Bootloader手册
    • AN3155: USART协议说明
  2. 示例代码
    • STM32Cube内置IAP例程(路径:Projects/STM32xxx_IAP

通过以上步骤可实现基础Bootloader。实际项目中需根据芯片型号(如F1/F4/F7)调整Flash操作细节,并严格测试异常处理逻辑。

STM32无法进入片上Bootloader的处理方法

STM32无法进入片上Bootloader的处理方法  当STM32芯片无法进入片上B

2024-02-02 14:33:14

ARM处理器如何编写Bootloader

前面给大家分享过Bootloader从应用角度执行的相关文章,今天从底层原理来给大家描述ARM处理器如何编写Bootloader,以及底层流程。

2023-07-26 09:10:47

STM32单片机Bootloader的实现

之前一篇的文章中,主要介绍了STM32的启动流程和内存主要空间的分配,这篇文章将在上一篇文章的基础上,来阐述一下STM32 Bootloader

2023-01-11 17:29:44

STM32 Bootloader异常复位案例

电子发烧友网站提供《STM32 Bootloader异常复位案例.pdf》资料免费下载

资料下载 吕钢格 2023-09-25 09:17:46

STM32单片机bootloader扫盲

STM32单片机BootLoader扫盲BootLoader和APP之间的关系APP就是平时写的单片机上的应用程序,而

资料下载 佚名 2021-11-26 18:21:04

写了个通用的stm32串口bootloader

写了个通用的stm32串口bootloader

资料下载 无人岛 2021-11-26 15:51:11

STM32系统bootloader应用

嵌入式开发中,经常需要bootloader进行程序固件升级和系统维护,所以bootloader是必不可少的功能。STM32系统自带的系统

资料下载 佚名 2021-11-26 13:36:04

关于M0内核MCU的Bootloader编写

在使用MCU的时候如果要使用程序下载、程序升级或程序备份,那么都需要自己编写Bootloader。那么编写

资料下载 h1654155275.3132 2021-10-28 11:36:16

关于编写Bootloader的资料大合集

在使用MCU的时候如果要使用程序下载、程序升级或程序备份,那么都需要自己编写Bootloader。那么编写

2021-11-03 08:05:10

Stm32bootloader和App的编写注意事项有哪些?

Stm32的bootloader和App的编写注意事项有哪些?如何使用STM32

2021-10-29 07:35:08

BootLoader是什么? 怎样去编写BootLoader源程序?

BootLoader是什么?怎样去编写BootLoader源程序?BootLoader

2021-04-27 07:08:34

什么是Bootloader 浅谈STM32bootloader的内存分配

准备好环境。 2. Bootloader的特点 Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。在

2021-02-15 06:10:00

如何编写ARM处理器的Bootloader

作者 | strongerHuang 微信公众号 | strongerHuang 之前从应用的角度给大家分享过Bootloader相关的文章,今天从底层原理来给大家描述ARM处理器如何编写

2020-10-27 11:02:36

STM32系统bootloader的应用有哪些

嵌入式开发中,经常需要bootloader进行程序固件升级和系统维护,所以bootloader是必不可少的功能。STM32系统自带的系统

2020-10-22 12:19:45

基于STM32F4和RT-Thread通用BootLoader使用经验

基于STM32F4、RT-Thread通用BootLoader使用经验

2020-02-27 17:23:06

7天热门专题 换一换
相关标签