搜索
查看: 809|回复: 0

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

[复制链接]

该用户从未签到

2

主题

32

帖子

0

蝴蝶豆

初级会员

最后登录
2021-3-12
发表于 2021-1-27 16:09:11 | 显示全部楼层 |阅读模式
在我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

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 15:41 , Processed in 1.150242 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表