STM32
直播中

abdkjshd

8年用户 1156经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F系列只要调用HAL_FLASHEx_OBProgram进行WRP的解除操作,WRP就会变成0xFFFFFFFF,为什么?

在我STM32CubeMX使用的STM32Cube_FW_F1_V1.8.3库的stm32f1xx_hal_flash_ex.c源文件中,有个和Option 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)。



回帖(1)

更多回帖

发帖
×
20
完善资料,
赚取积分