[STM32F1] 什么原因导致 HAL_FLASH_OB_Unlock() 触发硬件异常 HardFaultHandler

[复制链接]
113|15
zhouyou99 发表于 2026-8-1 23:51 | 显示全部楼层 |阅读模式
代码执行到 WRITE_REG(FLASH->OPTKEYR, FLASH_OPTKEY1) 就直接跳入 HardFault。
HAL_FLASH_OB_Unlock()
HAL_FLASH_Program(...)
HAL_FLASH_OB_Lock()
第一步 HAL_FLASH_OB_Unlock() 直接崩溃。
HAL_FLASH_Program() 函数:
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
HAL 使用手册 UM1940 中,没有说明 TypeProgram 参数含义、用途以及合法取值。
文档描述TypeProgram 代表指定地址的编程方式,取值为 FLASH Type Program 枚举。
手册 234 页列出:
FLASH_TYPEPROGRAM_BYTE
FLASH_TYPEPROGRAM_HALFWORD
FLASH_TYPEPROGRAM_WORD
FLASH_TYPEPROGRAM_DOUBLEWORD
但我使用字节、半字、单字模式全部无法编程,仅双字模式可用。
tm32g0xx_hal_flash.c内HAL_FLASH_Program()注释如下:
/**
* @brief Program double word or fast program of a row at a specified address.
* @param TypeProgram Indicate the way to program at a specified address.
*           This parameter can be a value of @ref FLASH_Type_Program
* @param Address Specifies the address to be programmed.
* @param Data Specifies the data to be programmed
*        This parameter is the data for the double word program and the address where
*        are stored the data for the row fast program depending on the TypeProgram:
*        TypeProgram = FLASH_TYPEPROGRAM_DOUBLEWORD (64-bit)
*        TypeProgram = FLASH_TYPEPROGRAM_FAST (32-bit).
*
* @retval HAL_StatusTypeDef HAL Status
*/
里面提到还有 FLASH_TYPEPROGRAM_FAST 模式,但是在手册 234 页的列表里找不到这个宏!
校验宏定义:
#define IS_FLASH_TYPEPROGRAM(__VALUE__)        (((__VALUE__) == FLASH_TYPEPROGRAM_DOUBLEWORD) || \
                            ((__VALUE__) == FLASH_TYPEPROGRAM_FAST))
可以看到,文档列出的 BYTE/HALFWORD/WORD 全部不合法。
搞不清楚为什么调用HAL_FLASH_OB_Unlock()就崩溃。

dongnanxibei 发表于 2026-8-2 17:04 | 显示全部楼层
本质是内存非法访问、内核总线故障、FLASH 控制器时序 / 配置错误、寄存器操作越权、栈溢出四大类
cr315 发表于 2026-8-3 17:08 | 显示全部楼层
OPTKEY1写入时崩溃,可能是FLASH寄存器地址映射错误或总线时钟没使能。
duo点 发表于 2026-8-3 17:39 | 显示全部楼层
检查RCC中FLASH接口时钟是否开启,没开时钟写寄存器直接触发总线错误
flycamelaaa 发表于 2026-8-3 18:20 | 显示全部楼层
选项字节解锁函数崩溃,往往是因为之前调用过Lock但没有重新使能FLASH接口
jcky001 发表于 2026-8-3 18:52 | 显示全部楼层
崩溃前检查FLASH_CR的LOCK位是否还置1,没解锁就写OPTKEYR会产生硬件异常。
onlycook 发表于 2026-8-3 19:23 | 显示全部楼层
文档说的TypeProgram参数只支持双字和快速模式,是因为F1不支持字节和半字编程。
powerantone 发表于 2026-8-3 20:10 | 显示全部楼层
HAL_FLASH_Program的注释和代码不一致,说明库文件版本和手册版本不匹配。
probedog 发表于 2026-8-3 20:42 | 显示全部楼层
调用OB_Unlock前必须先调用HAL_FLASH_Unlock,否则FLASH_CR没解锁。
solty 发表于 2026-8-3 21:15 | 显示全部楼层
选项字节区域有写保护,如果芯片已锁定,写操作会触发硬件错误。
spicy 发表于 2026-8-3 21:48 | 显示全部楼层
检查NVIC里HardFault的向量表是否偏移正确,向量偏移错误会导致异常处理进不去。
今天会画卧蚕吗 发表于 2026-8-3 22:19 | 显示全部楼层
尝试在HAL_FLASH_OB_Unlock前添加HAL_FLASH_Unlock,两个锁是分开的。
又见江南雨 发表于 2026-8-3 22:48 | 显示全部楼层
F1的FLASH_OPTKEY寄存器只接受连续的两次密钥写入,中间不能有中断。
classroom 发表于 2026-8-4 12:13 | 显示全部楼层
关闭所有中断再执行解锁和编程操作,避免中断嵌套破坏时序导致崩溃。
小明的同学 发表于 2026-8-4 11:49 | 显示全部楼层
OB 解锁有严格时序、寄存器先决条件,条件不满足直接触发总线错误 → HardFault
jf101 发表于 2026-8-4 13:26 | 显示全部楼层
FLASH寄存器地址映射错误或总线时钟没使能,可能会导致这些问题发生
您需要登录后才可以回帖 登录 | 注册

本版积分规则

194

主题

194

帖子

0

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