STM32L073调用HAL_FLASHEx_DATAEEPROM_Program触发HardFault问题咨询
核心问题排查
1. EEPROM寄存器操作顺序错误
你当前代码先调用HAL_FLASHEx_DATAEEPROM_DisableFixedTimeProgram()再执行解锁操作,而所有EEPROM控制寄存器在锁定状态下都是写保护的,此时写保护寄存器会直接触发总线错误,进入HardFault。
正确的操作顺序应该是先解锁EEPROM,再修改控制寄存器配置:
HAL_FLASHEx_DATAEEPROM_Unlock(); // 解锁后再修改固定时间编程配置 HAL_FLASHEx_DATAEEPROM_DisableFixedTimeProgram();
2. 指针非对齐访问触发异常
STM32L0系列使用Cortex-M0+内核,该内核不支持非对齐的32位数据访问。如果你传入的pData是从字符串指针强制转换而来,没有保证4字节对齐,那么代码执行到*pData读取32位数据时就会直接触发HardFault,根本不会执行后续的EEPROM写入操作。
你可以在函数入口增加对齐校验,或者在传入字符串时手动对齐到4字节边界。
3. 循环逻辑语义模糊
参数dataLength的定义不清晰,当前循环逻辑会导致计数错误:
- 如果
dataLength代表要写入的字数(每个字4字节),那么循环终止条件应该改为ui32Addr < dataLength * 4,否则循环次数只有实际需要的1/4 - 如果
dataLength代表要写入的字节数,需要保证传入的字节数是4的整数倍,否则会出现越界访问pData或者写入不完整的问题
优化建议
EEPROM编程过程中建议临时关闭全局中断,避免其他中断打断编程流程导致操作异常,编程完成后再恢复中断状态。
内容的提问来源于stack exchange,提问作者Dr_Smu
相关产品推荐
相关产品推荐

