在我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)。 以上内容和下面一篇帖子(这里居然3天不审核通过),均已发往st.com的英文论坛 https://www.stmcu.org.cn/module/forum/thread-628850-1-1.html |