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

STM32F103,HAL库如何设置flash写保护?

[复制链接]
any012 提问时间:2016-12-26 14:31 /
本帖最后由 any012 于 2016-12-26 16:19 编辑

cube自带的例程里有个工程是关于flash写保护的。
但是看不懂啊。
节选了开头的一部分,想请大家帮分析下。
  1. <div>int main(void)
  2. {
  3. ...  

  4.   /* Get pages write protection status ****************************************/
  5.   HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);

  6. #ifdef WRITE_PROTECTION_DISABLE
  7.   /* Check if desired pages are already write protected ***********************/
  8.   if((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != FLASH_PAGE_TO_BE_PROTECTED)
  9.   {...}
  10. #elif defined WRITE_PROTECTION_ENABLE
  11.   /* Check if desired pages are not yet write protected ***********************/
  12.   if(((~OptionsBytesStruct.WRPPage) & FLASH_PAGE_TO_BE_PROTECTED )!= FLASH_PAGE_TO_BE_PROTECTED)
  13.   {...}
  14. #endif /* WRITE_PROTECTION_DISABLE */</div><div>}

  15. </div>
复制代码

#ifdef WRITE_PROTECTION_DISABLE
if((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != FLASH_PAGE_TO_BE_PROTECTED)
{...}
#elif defined WRITE_PROTECTION_ENABLE
if(((~OptionsBytesStruct.WRPPage) & FLASH_PAGE_TO_BE_PROTECTED )!= FLASH_PAGE_TO_BE_PROTECTED)
{...}
#endif /* WRITE_PROTECTION_DISABLE */


这几个条件编译,第一句,是先判断是否定义了写保护功能,如果没有的话,执行第一个条件编译,如果设置了的话,执行第二个条件编译?
根据是否定义了WRITE_PROTECTION_DISABLE这个宏,先使能写保护,或者禁止写保护。
那么接下来这些:
if ((OptionsBytesStruct.WRPPage & FLASH_PAGE_TO_BE_PROTECTED) != 0x00)
  {
    HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
    ...
    }

是先擦出有写保护的页,再写入?
那么为什么不是写入数据后,再使能写保护呢?

FLASH_WriteProtection.zip (3.03 MB, 下载次数: 124)
收藏 1 评论2 发布时间:2016-12-26 14:31

举报

2个回答
any012 回答时间:2016-12-27 10:00:35
本帖最后由 any012 于 2016-12-27 10:03 编辑

在阿莫论坛搜到了相关办法:

  1.     FLASH_OBProgramInitTypeDef OBInit;
  2.     __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  3.     HAL_FLASHEx_OBGetConfig(&OBInit);
  4.     if(OBInit.RDPLevel == RESET)
  5.     {
  6.         OBInit.OptionType = OPTIONBYTE_RDP;
  7.         OBInit.RDPLevel = OB_RDP_LEVEL_1;
  8.         HAL_FLASH_Unlock();
  9.         HAL_FLASH_OB_Unlock();
  10.         HAL_FLASHEx_OBProgram(&OBInit);
  11.         HAL_FLASH_OB_Lock();
  12.         HAL_FLASH_Lock();
  13.     }
  14.     __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
复制代码



这个是读保护的,写保护和这个类似。
在程序里加上这部分后,利用串口下载到单片机里,再次下载时,提示需要移除保护。
但,我如何知道是写保护起作用了还是读保护起作用了?

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

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