1. STM32H5 BootLoader开发概述
在嵌入式系统开发中,BootLoader作为系统启动的第一段代码,承担着初始化硬件、加载应用程序(APP)的重要职责。STM32H5系列微控制器凭借其高性能和丰富的外设资源,在工业控制、物联网等领域得到广泛应用。本文将深入探讨STM32H5 BootLoader开发中的两个核心环节:Flash烧录与APP启动实现。
BootLoader开发不同于普通应用程序开发,它需要直接操作硬件底层,特别是对Flash存储器的操作有着严格的要求。STM32H5内部集成了2MB Flash存储器,分为两个Bank(Bank1和Bank2),每个Bank包含128个8KB大小的扇区。理解这种存储结构对于实现可靠的固件升级功能至关重要。
在实际项目中,一个完善的BootLoader通常需要实现以下功能:
- 固件版本管理
- 固件下载与校验
- Flash擦除与编程
- APP跳转与启动
- 异常处理与恢复
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. STM32H5 Flash操作原理
2.1 Flash存储特性
STM32H5的Flash存储器具有几个重要特性需要开发者特别注意:
-
擦除优先原则:Flash存储器在写入新数据前必须先擦除对应区域。未擦除的区域无法直接写入数据,这不同于RAM或EEPROM的写入方式。
-
最小擦除单位:STM32H5的最小擦除单位是8KB的扇区,也可以按整个Bank(1MB)擦除。擦除操作会将目标区域所有位设置为1(0xFF)。
-
编程对齐要求:写入Flash时,STM32H5支持多种编程宽度,包括字节(8位)、半字(16位)、字(32位)和四字(128位)。使用更大的编程宽度通常能获得更高的写入效率。
-
操作保护机制:为了防止意外修改,Flash在复位后默认处于锁定状态。进行任何擦除或编程操作前,必须先解锁Flash。
2.2 HAL库Flash操作接口
STM32 HAL库提供了一组API用于Flash操作,开发者应熟悉这些接口的使用:
c复制// Flash解锁/锁定函数
HAL_StatusTypeDef HAL_FLASH_Unlock(void);
HAL_StatusTypeDef HAL_FLASH_Lock(void);
// Flash编程函数
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
// Flash擦除函数
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
其中,FLASH_EraseInitTypeDef结构体用于配置擦除参数:
c复制typedef struct {
uint32_t TypeErase; // 擦除类型:扇区擦除或Bank擦除
uint32_t Banks; // 指定操作的Bank
uint32_t Sector; // 起始扇区号
uint32_t NbSectors; // 要擦除的扇区数量
} FLASH_EraseInitTypeDef;
3. Flash烧录实现细节
3.1 跨Bank烧录函数设计
在实际项目中,固件大小可能超过1MB,需要跨Bank存储。下面是一个支持跨Bank烧录的函数实现:
c复制#define SECTOR_SIZE (8 * 1024) // 8KB扇区大小
#define BANK_SIZE (128 * SECTOR_SIZE) // 1MB Bank大小
int WriteFirmware(uint8_t *data, uint32_t len, uint32_t flash_addr) {
FLASH_EraseInitTypeDef erase_init;
uint32_t sector_error;
uint32_t sectors_needed =
