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

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, 下载次数: 120)
收藏 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版