代码执行到 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()就崩溃。
|
|