你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

运行到 WRITE_REG (FLASH->OPTKEYR, FLASH_OPTKEY1)跳转 HardFaultHandler

[复制链接]
patch1582 提问时间:2026-7-1 16:01 / 未解决

单看文档HAL_FLASH 相关文档以为操作流程就是: 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 足足 1441 页,通篇没有说明 TypeProgram 参数含义、用途、可选有效值。仅模糊描述:TypeProgram 代表指定地址的编程模式,取值为 FLASH Type Program 相关宏。但根本没解释什么是 FLASH Type Program。 手册 234 页列出一组枚举: FLASH_TYPEPROGRAM_BYTE FLASH_TYPEPROGRAM_HALFWORD FLASH_TYPEPROGRAM_WORD FLASH_TYPEPROGRAM_DOUBLEWORD 但实际测试时,字节、半字、单字模式无法编程,仅双字模式可用。 查看 stm32g0xx_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)) 宏里仅认可双字、快速行编程两种模式,手册列出的字节 / 半字 / 单字均为无效参数。 至今我仍未找到 HAL_FLASH_OB_Unlock () 一调用就死机的原因。

赞 收藏 评论2 发布时间:2026-7-1 16:01

举报

2个回答
DazzlingOkami 回答时间:2026-7-1 18:07:26

HAL_FLASH_OB_Unlock是用来解锁选项字节区的Flash的,如果要写这个区域的内容,要先执行Flash的解锁 HAL_FLASH_Unlock() 再执行OB区域解锁HAL_FLASH_OB_Unlock,如果只是对普通的Flash区别编程不需要执行HAL_FLASH_OB_Unlock。

STM32单片机各个系列的HAL_FLASH_Program接口都不太统一,在STM32G0上,有两种编程模式:FLASH_TYPEPROGRAM_DOUBLEWORD 一次写入8字节,地址需要8字节对齐,可用于编程普通Flash区和OB区域,函数参数中的Data就是一个8字节的待写入数据(uint64_t)。FLASH_TYPEPROGRAM_FAST一次写入256字节,地址需要对齐256字节,只能编程普通Flash,不能写OB区。函数参数中的Data是一个地址,也就是待编程数据的指针,这个指针至少需要4字节对齐吧。

没有字节、半字、单字编程模式。

butterflyspring 回答时间:2026-7-2 11:23:59
如果你用的是keil / uVision 编译器,并打了断点后,这时候可能会引起 CFGBSY 置位,会引起后面操作变化。
尽量避免这种情况发生。






关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版