打印
[STM32F1]

STM32F103VBT6 HAL库设置FLASH读保护

[复制链接]
6359|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
killalljp|  楼主 | 2018-8-21 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 killalljp 于 2018-8-23 17:16 编辑

最近用到要在STM32F103VBT6程序中使用HAL库加入FLASH读保护功能,网上找了一下多多少少都有点问题
最后奉献已验证代码
/****************************************************************
* Function:    Flash_EnableReadProtection
* Description: Enable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/

void Flash_EnableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

/****************************************************************
* Function:    Flash_DisableReadProtection
* Description: Disable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/
void Flash_DisableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}
沙发
天灵灵地灵灵| | 2018-8-21 15:35 | 只看该作者
发代码姿势不够帅
看我的
/****************************************************************
* Function:    Flash_EnableReadProtection
* Description: Enable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/

void Flash_EnableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

/****************************************************************
* Function:    Flash_DisableReadProtection
* Description: Disable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/
void Flash_DisableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

使用特权

评论回复
评论
dabendan001 2018-12-23 12:00 回复TA
贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableReadProtection(),我怎么看,内容都是一样的呢? 
板凳
天灵灵地灵灵| | 2018-8-21 15:36 | 只看该作者
发代码姿势不够帅
看我的
/****************************************************************
* Function:    Flash_EnableReadProtection
* Description: Enable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/

void Flash_EnableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

/****************************************************************
* Function:    Flash_DisableReadProtection
* Description: Disable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/
void Flash_DisableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

使用特权

评论回复
地板
killalljp|  楼主 | 2018-8-23 11:15 | 只看该作者
天灵灵地灵灵 发表于 2018-8-21 15:36
发代码姿势不够帅
看我的

超级潜水艇 偶尔冒泡。学了一招

使用特权

评论回复
5
leafz| | 2018-9-3 16:21 | 只看该作者
这个设置貌似不能禁止stlink读出芯片里的程序啊

使用特权

评论回复
6
monty·feng| | 2018-10-28 15:42 | 只看该作者
leafz 发表于 2018-9-3 16:21
这个设置貌似不能禁止stlink读出芯片里的程序啊

请问关于禁止stlink读程序的这个问题你找到了,该如何解决呢?

使用特权

评论回复
评论
Z赤心木QW 2018-12-28 09:38 回复TA
需要到option位里设置读写保护。 
7
dabendan001| | 2018-12-23 00:53 | 只看该作者
一楼、二楼、三楼,贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableReadProtection(),我怎么看,内容都是一样的呢?

使用特权

评论回复
8
dabendan001| | 2018-12-23 12:00 | 只看该作者
贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableReadProtection(),我怎么看,内容都是一样的呢?

使用特权

评论回复
9
天灵灵地灵灵| | 2018-12-27 09:22 | 只看该作者
dabendan001 发表于 2018-12-23 00:53
一楼、二楼、三楼,贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableR ...

你眼花了。一个是lock,一个是unlock
其他我看也一样。眼晕。

使用特权

评论回复
10
天灵灵地灵灵| | 2018-12-27 09:22 | 只看该作者
dabendan001 发表于 2018-12-23 12:00
贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableReadProtection(), ...

仔细看里面调用的函数。不同。

使用特权

评论回复
11
天灵灵地灵灵| | 2018-12-27 09:24 | 只看该作者
dabendan001 发表于 2018-12-23 12:00
贴的两个函数,内容似乎是一样的呢? Flash_DisableReadProtection()和 Flash_EnableReadProtection(), ...

现在HAL库用的是

/* Peripheral Control functions  **********************************************/
HAL_StatusTypeDef HAL_FLASH_Unlock(void);
HAL_StatusTypeDef HAL_FLASH_Lock(void);
HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);
HAL_StatusTypeDef HAL_FLASH_OB_Lock(void);
/* Option bytes control */
HAL_StatusTypeDef HAL_FLASH_OB_Launch(void);
这几个。我看头文件里是这几个。你仔细看楼主发的函数里面封装的两个不同。
其实直接用就可以的。他为了安全可靠多了一道验证的工序。
因为两个工序一样,所以大部分代码相同。容易 看花眼

使用特权

评论回复
12
dabendan001| | 2018-12-27 18:38 | 只看该作者
天灵灵地灵灵 发表于 2018-12-27 09:22
你眼花了。一个是lock,一个是unlock
其他我看也一样。眼晕。

我晕!我真的不好意思再发问了……我又瞅了3遍,还是没发现哪里不同……两个函数里写的,都是这一样的代码啊?
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();

使用特权

评论回复
13
dabendan001| | 2018-12-27 18:38 | 只看该作者
天灵灵地灵灵 发表于 2018-12-27 09:22
你眼花了。一个是lock,一个是unlock
其他我看也一样。眼晕。

我晕!我真的不好意思再发问了……我又瞅了3遍,还是没发现哪里不同……两个函数里写的,都是这一样的代码啊?(方便告诉我哪两行内容不同不?代码前有行号)
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();

使用特权

评论回复
14
coco01| | 2018-12-28 09:16 | 只看该作者

使用特权

评论回复
15
liw_ei| | 2019-1-11 16:06 | 只看该作者
我比较了.代码是一样的

使用特权

评论回复
16
mj1114| | 2019-6-28 11:26 | 只看该作者
网上很多发布的代码是有很多有意或无意的坑的。

使用特权

评论回复
17
jay8830095| | 2019-12-7 17:55 | 只看该作者
大坑,不能用;
[..] Any operation of erase or program should follow these steps:
     (#) Call the HAL_FLASH_OB_Unlock() function to enable the Flash option control
         register access.
     (#) Call the following functions to program the desired option bytes.
         (++) HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);      
     (#) Once all needed option bytes to be programmed are correctly written, call the
         HAL_FLASH_OB_Launch(void) function to launch the Option Bytes programming process.
     (#) Call the HAL_FLASH_OB_Lock() to disable the Flash option control register access (recommended
         to protect the option Bytes against possible unwanted operations).

HAL_FLASH_OB_Launch

使用特权

评论回复
18
killalljp|  楼主 | 2020-12-6 19:17 | 只看该作者
本帖最后由 killalljp 于 2020-12-6 19:18 编辑

更正一下

/****************************************************************
* Function:    Flash_EnableReadProtection
* Description: Enable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/

void Flash_EnableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_0)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_1;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}

/****************************************************************
* Function:    Flash_DisableReadProtection
* Description: Disable the read protection of user flash area.
* Input:        NONE
* Output:        NONE
* Return:  NONE
*****************************************************************/
void Flash_DisableReadProtection(void)
{

  FLASH_OBProgramInitTypeDef OBInit;
  
  __HAL_FLASH_PREFETCH_BUFFER_DISABLE();
  
  HAL_FLASHEx_OBGetConfig(&OBInit);
  if(OBInit.RDPLevel == OB_RDP_LEVEL_1)
  {
    OBInit.OptionType = OPTIONBYTE_RDP;
    OBInit.RDPLevel = OB_RDP_LEVEL_0;
    HAL_FLASH_Unlock();
    HAL_FLASH_OB_Unlock();
    HAL_FLASHEx_OBProgram(&OBInit);
    HAL_FLASH_OB_Lock();
    HAL_FLASH_Lock();
  }
  __HAL_FLASH_PREFETCH_BUFFER_ENABLE();

}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

24

帖子

1

粉丝