STM32G474RE Flash擦除失效及编译报错问题咨询
STM32G474RE Flash擦除代码移植解决方案
问题根因
STM32F7与G4系列的Flash硬件架构、HAL库定义存在原生差异,你遇到的报错均为平台不兼容导致。
具体修改步骤
1. 适配G4的页擦除逻辑
STM32G4系列Flash无扇区设计,仅支持页擦除:STM32G474RE单页大小为2KB,共256页分为2个Bank,Bank1对应页0127,Bank2对应页128255。擦除类型需要改为FLASH_TYPEERASE_PAGES,替换原有的扇区相关参数。
2. 移除无效的VoltageRange配置
G4的HAL库中FLASH_EraseInitTypeDef结构体没有VoltageRange成员,也没有FLASH_VOLTAGE_RANGE_3相关宏定义:G4的Flash控制器会自动根据VDD电压适配擦写时序,不需要手动配置电压范围,直接删除该赋值语句即可。
适配后的可运行代码示例
if( is_first_block ) { printf("Erasing the Flash memory...\r\n"); //Erase the Flash FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PageError; // 存储擦除失败的页号,替换原SectorError EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.Banks = FLASH_BANK_1; // 按擦除区域所属Bank设置,跨Bank需要分两次擦除 EraseInitStruct.Page = 16; // 示例为第16页,对应起始地址0x08008000,可按实际APP地址计算修改 EraseInitStruct.NbPages = 2; // 擦除连续2页,总大小4KB,可按需调整 ret = HAL_FLASHEx_Erase( &EraseInitStruct, &PageError ); if( ret != HAL_OK ) { break; } }
注意事项
- 擦除操作前后的Flash解锁、加锁逻辑和F7一致,需先调用
HAL_FLASH_Unlock()解锁,操作完成后调用HAL_FLASH_Lock()加锁。 - 页号计算方式:
页号 = (目标Flash起始地址 - FLASH_BASE) / FLASH_PAGE_SIZE,其中FLASH_BASE为0x08000000,FLASH_PAGE_SIZE为2048。 - 单次擦除操作不能跨Bank,若需要擦除跨Bank的区域,需要分两次配置擦除结构体分别操作。
内容的提问来源于stack exchange,提问作者Nazar Hussain
相关产品推荐
相关产品推荐

