[STM32C0] STM32C0 Flash 写入失败,触发 HardFault_Handler () 中断

[复制链接]
47|10
SocialButterfly 发表于 2026-3-5 15:31 | 显示全部楼层 |阅读模式
我编写了一段仅用于擦除 Flash 的程序,结果直接触发了 HardFault_Handler () 函数。
请教哪位高手能提供一些在 STM32CubeIDE 中对 STM32C0 进行 Flash 写入操作的参考示例?
以下是代码:

void myFlash_init(void)
{
FLASH_EraseInitTypeDef flash_erase_struct = {0};
HAL_FLASH_Unlock();
flash_erase_struct.TypeErase = FLASH_TYPEERASE_PAGES;
flash_erase_struct.Page = 3;
flash_erase_struct.NbPages = 3;

uint32_t  error_status = 0;
HAL_FLASHEx_Erase(&flash_erase_struct, &error_status);
}

void myFlash(void)
{
uint64_t data64 = 0x1234567812345678;

HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, FLASH_ADDRESS_START, data64);
HAL_FLASH_Lock();
}

公羊子丹 发表于 2026-3-6 08:30 | 显示全部楼层
我看你代码里擦除Flash后直接就编程了,连擦除的错误状态都没判断,STM32C0擦除失败会直接触发硬fault,你先在HAL_FLASHEx_Erase后加if(error_status!=0)的判断,排查擦除阶段的问题。
周半梅 发表于 2026-3-6 08:33 | 显示全部楼层
这问题太常见了,STM32C0的Flash操作有地址对齐要求,双字编程必须8字节对齐,你先检查FLASH_ADDRESS_START是不是8的整数倍,不对齐的话直接操作必触发HardFault。
帛灿灿 发表于 2026-3-6 08:34 | 显示全部楼层
兄弟你是不是在主程序里直接调用Flash操作函数了?Flash擦写不能在Flash区运行的代码里执行,得把函数放到RAM里,或者用中断暂停再操作,C0系列对这个要求特别严格。
童雨竹 发表于 2026-3-6 08:36 | 显示全部楼层
我怀疑你没配置Flash的等待周期,STM32C0的HCLK超过一定频率必须调FLASH_ACR里的LATENCY,你去CubeMX里检查时钟配置,把Flash等待周期配好,不然擦写会直接硬fault。
万图 发表于 2026-3-6 08:37 | 显示全部楼层
教你个排查小技巧,先把擦除的页数改小,比如只擦1页试试,STM32C0的Flash有扇区保护,你选的3页可能有部分被写保护了,擦除受保护区域必触发异常,先查保护配置。
Wordsworth 发表于 2026-3-6 08:38 | 显示全部楼层
好奇你定义的FLASH_ADDRESS_START是多少?STM32C0的Flash有固定的地址范围,要是你写的地址超出了芯片实际的Flash范围,操作的时候直接就触发HardFault了,先核对芯片手册的地址区间。
Bblythe 发表于 2026-3-6 08:39 | 显示全部楼层
你代码里HAL_FLASH_Unlock只在擦除里加了,编程函数myFlash里没解锁啊!STM32C0解锁后如果执行了其他操作,锁存器会复位,编程前必须重新解锁,少这一步必出问题。
Pulitzer 发表于 2026-3-6 08:40 | 显示全部楼层
STM32C0的Flash操作要关总中断的,你擦写的时候外设中断还在跑,大概率会打断Flash操作流程触发硬fault,在HAL_FLASH_Unlock前加__disable_irq(),操作完再加__enable_irq()试试。
Uriah 发表于 2026-3-6 08:41 | 显示全部楼层
我用过C0系列做Flash操作,CubeIDE里有现成的官方例程,你直接在STM32CubeMX里生成工程时,搜Flash_EraseProgram的例程,里面有完整的擦写流程,比自己写的规范多了。
Clyde011 发表于 2026-3-6 08:42 | 显示全部楼层
你有没有检查工程的编译优化等级?把优化等级开到O2/O3的话,Flash操作的关键代码可能被优化掉,导致执行流程出错,先把优化等级改成O0,重新编译再测试Flash操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

131

主题

131

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0