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

运行到 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 回答时间:7 天前
如果你用的是keil / uVision 编译器,并打了断点后,这时候可能会引起 CFGBSY 置位,会引起后面操作变化。
尽量避免这种情况发生。






关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版