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

运行到 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 () 一调用就死机的原因。

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

举报

1个回答
DazzlingOkami 回答时间:昨天 18:07

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字节对齐吧。

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

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