硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1746|回复: 9
收起左侧

Flash选项字节配置函数HAL_FLASHEx_OBProgram使用

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
发表于 2022-3-28 00:21:03 | 显示全部楼层 |阅读模式
简单做个读保护。
[C] 纯文本查看 复制代码
FLASH_OBProgramInitTypeDef FLASH_OBInitStruct = {0};
HAL_FLASH_Unlock();
HAL_FLASH_OB_Unlock();
FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;
FLASH_OBInitStruct.RDPLevel= OB_RDP_LEVEL_1;
HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
HAL_FLASH_OB_Launch();
HAL_FLASH_OB_Lock();
HAL_FLASH_Lock();



回复

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2022-3-30 16:18:25 | 显示全部楼层
这个怎么用呢? 放在main函数中的话,每次上电都擦除写入一次ob的地址吗?
有没有办法,识别一下,再决定要不要写入ob?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2022-3-31 10:51:26 | 显示全部楼层
caicaptain2 发表于 2022-3-30 16:18
这个怎么用呢? 放在main函数中的话,每次上电都擦除写入一次ob的地址吗?
有没有办法,识别一下,再决定 ...

就是程序里面自己控制读写保护的,有些用户是这么玩的。
回复

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2022-4-21 16:29:19 | 显示全部楼层
今天复制粘贴这个代码的时候发现了问题:

FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;
FLASH_OBInitStruct.BORLevel = OB_RDP_LEVEL_1;    //这个成员变量是不是错了???






回复

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2022-4-21 16:29:19 | 显示全部楼层
今天复制粘贴这个代码的时候发现了问题:

FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;
FLASH_OBInitStruct.BORLevel = OB_RDP_LEVEL_1;    //这个成员变量是不是错了???






回复

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2022-4-21 16:31:24 | 显示全部楼层
caicaptain2 发表于 2022-4-21 16:29
今天复制粘贴这个代码的时候发现了问题:

FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;

我修改后,增加先判断读保护,避免每次启动都反复写选项字节。

[C] 纯文本查看 复制代码
    //2022-4-22 内部设置读保护。
    FLASH_OBProgramInitTypeDef FLASH_OBInitStruct = {0};
    
    HAL_FLASHEx_OBGetConfig(&FLASH_OBInitStruct);  //读取选项字节。
    
    if(FLASH_OBInitStruct.RDPLevel!=OB_RDP_LEVEL_1) //如果不是读保护1
    {
      HAL_FLASH_Unlock();
      HAL_FLASH_OB_Unlock();
      FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;
      FLASH_OBInitStruct.RDPLevel = OB_RDP_LEVEL_1; //这里已经修正
      HAL_FLASHEx_OBProgram(&FLASH_OBInitStruct);
      HAL_FLASH_OB_Launch();
      HAL_FLASH_OB_Lock();
      HAL_FLASH_Lock();
    }
    //----end 内部设置读保护。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2022-4-22 09:20:15 | 显示全部楼层
caicaptain2 发表于 2022-4-21 16:29
今天复制粘贴这个代码的时候发现了问题:

FLASH_OBInitStruct.OptionType = OPTIONBYTE_RDP;

没错,我这个就是工程代码里面的,估计我们的HAL库版本不同,ST就喜欢搞这种骚操作。
回复

使用道具 举报

336

主题

2045

回帖

3058

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3058
发表于 2022-4-22 10:20:42 | 显示全部楼层
eric2013 发表于 2022-4-22 09:20
没错,我这个就是工程代码里面的,估计我们的HAL库版本不同,ST就喜欢搞这种骚操作。

我还是坚持认为这是个错误。
试验了一下,这个代码写BORLevel居然可以实现读保护1。它不过是偶然了。
原因是,FLASH_OBInitStruct默认初始化为0,BORLevel虽然写了个寂寞(实际也没有执行BOR),但是RDPLevel确实默认的0值,被写了进去。然后就正好实现了读保护1。RDPLevel比较特殊,值AA代表无保护,CC代表保护2,其他值代表保护1.

如果考虑常规操作,我们是先使用HAL_FLASHEx_OBGetConfig()读取了默认的选项字节,得到RDPLevel的值AA,再使用了这个错误的代码,RDPLevel的值不会变化,就无法正确实现读保护了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2022-4-22 10:30:46 | 显示全部楼层
caicaptain2 发表于 2022-4-22 10:20
我还是坚持认为这是个错误。
试验了一下,这个代码写BORLevel居然可以实现读保护1。它不过是偶然了。
...

不好意思,我没有仔细看你的回复就回复了,这个地方确实错了。

BORLevel 对应的参数成员:

[C] 纯文本查看 复制代码
#define OB_BOR_LEVEL3          ((uint8_t)0x00)  /*!< Supply voltage ranges from 2.70 to 3.60 V */
#define OB_BOR_LEVEL2          ((uint8_t)0x04)  /*!< Supply voltage ranges from 2.40 to 2.70 V */
#define OB_BOR_LEVEL1          ((uint8_t)0x08)  /*!< Supply voltage ranges from 2.10 to 2.40 V */
#define OB_BOR_OFF             ((uint8_t)0x0C)  /*!< Supply voltage ranges from 1.62 to 2.10 V */


RDR才是读保护设置,参数成员:

[C] 纯文本查看 复制代码
/** @defgroup FLASHEx_Option_Bytes_Read_Protection FLASH Option Bytes Read Protection
  * @{
  */
#define OB_RDP_LEVEL_0   ((uint8_t)0xAA)
#define OB_RDP_LEVEL_1   ((uint8_t)0x55)
#define OB_RDP_LEVEL_2   ((uint8_t)0xCC) /*!< Warning: When enabling read protection level 2 
                                              it s no more possible to go back to level 1 or 0 */
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107567
QQ
 楼主| 发表于 2022-4-22 10:32:49 | 显示全部楼层
楼主位已经修正。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-6 07:38 , Processed in 0.215393 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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