STM32F4调用FLASH_If_Write写入双bank Flash偶发HardFault问题咨询
故障诱因汇总
- 参数类型不匹配导致非对齐访问(最高概率)
你调用FLASH_If_Write时传入的是uint8_t类型的数组指针blockData,但函数形参要求的是uint32_t *p_source。函数内部直接对指针做32位解引用*(uint32_t *)(p_source + i)时,如果栈上分配的blockData数组起始地址不是4字节对齐,Cortex-M4内核虽然支持部分非对齐访问,但这种强制类型转换的非对齐指针访问会偶发触发HardFault,栈地址的分配随机性刚好对应故障偶发的特征。 - 长度参数合法性缺失
你传入的packet_length = frameDataCount - 8没有做4字节对齐校验,FLASH_If_Write中要求写入长度必须是32位(4字节)的整数倍,若传入的长度不是4的倍数,要么会丢失末尾不足4字节的数据,要么在边界访问时触发非法地址访问。 - Flash操作期间未关闭中断
STM32F4的Flash在编程/擦除操作期间,对应Bank的Flash是只读锁定状态,如果此时触发中断,且中断向量表存放在正在操作的Flash Bank上,会导致内核取指失败直接触发HardFault,中断触发的随机性对应故障偶发的特征。 - 目标地址合法性校验缺失
全局变量Flash_Write_Address没有做前置校验:如果地址没有4字节对齐、超出用户Flash范围、刚好落在双Bank的非法切换边界,都会在调用HAL_FLASH_Program时触发异常。 - 全局变量并发访问风险
代码中用到的全局变量fwFrameCounter、Flash_Write_Address如果在中断或其他线程中被修改,会导致写入参数异常,偶发触发非法访问。
内容的提问来源于stack exchange,提问作者NetworkStudent
相关产品推荐
相关产品推荐

