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

STM32F系列HAL库的写保护字擦除函数的错误

[复制链接]
人生之际 提问时间:2021-1-27 16:09 /
在我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

收藏 评论0 发布时间:2021-1-27 16:09

举报

0个回答

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版