在我
STM32CubeMX使用的STM32Cube_FW_F1_V1.8.3库的stm32f1xx_hal_flash_ex.c源文件中,有个和Op
tion Bytes中的写保护字擦除有关的函数:
Line 767: static HAL_StatusTypeDef FLASH_OB_DisableWRP(uint32_t WriteProtectPage)
函数为static,用户通过公开函数HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit)进行WRP解除一些保护位操作时会调用它
OBInit.WRPPage = value;
OBInit.OptionType = OPTIONBYTE_WRP;
OBInit.WRPState = OB_WRPSTATE_DISABLE;
HAL_FLASHEx_OBProgram( OBInit);
在此函数中的如下内容:
Line 834: OB->WRP0 |= WRP0_Data;
Line 844: OB->WRP1 |= WRP1_Data;
Line 854: OB->WRP2 |= WRP2_Data;
Line 864: OB->WRP3 |= WRP3_Data;
将使得WRP被错误的更改为0xFFFFFFFF,因为在前面的代码,已经将Option bytes全部擦除了
Line 826: status = HAL_FLASHEx_OBErase();
此时 WRP已经是0xFFFFFFFF了,所以再 or 任何内容都不会改为期望的内容了。
结论:只要调用HAL_FLASHEx_OBProgram进行WRP的解除操作,WRP就会变成0xFFFFFFFF,不保护任何Sector,而不是你期望的值。
修改:将4个 | 操作符删掉,成为OB->WRPx = WRPx_Data;就行了。
BTW:(在加保护的函数FLASH_OB_EnableWRP中有对应的OB->WRP0 = WRP0_Data;操作,之所以是正确的,是因为0xFF and Value = Value)。