当前位置: 首页 > article >正文

STM32 Option Bytes(选项字节)

文章目录

    • 注意
    • 1. `Option Byte`的定义
    • 2. 读取`Option Byte`
    • 3. `MCU Flash`读保护/写保护的配置
    • 4. `Option Byte`的数据字段
    • 5. `Option Byte`的配置字段

注意

STM32F103上经过反复测试,有如下问题及疑问(测试代码):

  1. 设置读保护时,数据字段可以通过备份后再保存的方式维持原来的数据,但之前设置的写保护设置都将丢失(恢复成默认值:所有页面的写保护都未开启)(不正常);而且必须上电复位后才能运行;(应对方案:在需要读保护时,先使能读保护,再设置写保护)
  2. 清除读保护时,整个固件都将被擦除,必须重新烧录;(正常)
  3. 写数据字段时,读保护设置可以维持,写保护设置将恢复到默认值(不正常),需复位;
  4. 设置写保护时,读保护设置可以维持,数据字段可以维持;可以使能指定页的写保护,需复位;(正常)
  5. 清除写保护时,读保护设置可以维持,数据字段可以维持;只能一次性清除所有页的写保护设置(不正常),需复位;

1. Option Byte的定义

// stm32f1xx_hal_flash_ex.h
/**
  * @brief  FLASH Options bytes program structure definition
  */
typedef struct
{
  uint32_t OptionType;  /*!< OptionType: Option byte to be configured.
                             This parameter can be a value of @ref FLASHEx_OB_Type */
  uint32_t WRPState;    /*!< WRPState: Write protection activation or deactivation.
                             This parameter can be a value of @ref FLASHEx_OB_WRP_State */
  uint32_t WRPPage;     /*!< WRPPage: specifies the page(s) to be write protected
                             This parameter can be a value of @ref FLASHEx_OB_Write_Protection */
  uint32_t Banks;        /*!< Select banks for WRP activation/deactivation of all sectors.
                              This parameter must be a value of @ref FLASHEx_Banks */
  uint8_t RDPLevel;     /*!< RDPLevel: Set the read protection level..
                             This parameter can be a value of @ref FLASHEx_OB_Read_Protection */
#if defined(FLASH_BANK2_END)
  uint8_t USERConfig;   /*!< USERConfig: Program the FLASH User Option Byte: 
                             IWDG / STOP / STDBY / BOOT1
                             This parameter can be a combination of @ref FLASHEx_OB_IWatchdog, @ref FLASHEx_OB_nRST_STOP, 
                             @ref FLASHEx_OB_nRST_STDBY, @ref FLASHEx_OB_BOOT1 */
#else
  uint8_t USERConfig;   /*!< USERConfig: Program the FLASH User Option Byte: 
                             IWDG / STOP / STDBY
                             This parameter can be a combination of @ref FLASHEx_OB_IWatchdog, @ref FLASHEx_OB_nRST_STOP, 
                             @ref FLASHEx_OB_nRST_STDBY */
#endif /* FLASH_BANK2_END */
  uint32_t DATAAddress; /*!< DATAAddress: Address of the option byte DATA to be programmed
                             This parameter can be a value of @ref FLASHEx_OB_Data_Address */
  uint8_t DATAData;     /*!< DATAData: Data to be stored in the option byte DATA
                             This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF */
} FLASH_OBProgramInitTypeDef;

2. 读取Option Byte

FLASH_OBProgramInitTypeDef OBInit;
HAL_FLASHEx_OBGetConfig(&OBInit);
// 以下都回来的值并不是每个都有意义,根据需要使用即可
LOG_DBG("OptionType:  [0x%08X]\n", OBInit.OptionType);	// 需要修改OptionByte时才使用
LOG_DBG("USERConfig:  [0x%02X]\n", OBInit.USERConfig);	// 当前MCU的一些配置信息,后面详细说
LOG_DBG("RDPLevel:    [0x%02X]\n", OBInit.RDPLevel);	// 表示当前MCU Flash的读保护状态
LOG_DBG("Banks:       [0x%08X]\n", OBInit.Banks);		// 这三个一起表示了当前MCU Flash的写保护状态
LOG_DBG("WRPPage:     [0x%08X]\n", OBInit.WRPPage);
LOG_DBG("WRPState:    [0x%08X]\n", OBInit.WRPState);
LOG_DBG("DATA0:       [0x%02X]\n", HAL_FLASHEx_OBGetUserData(OB_DATA_ADDRESS_DATA0));	// 获取数据字段值
LOG_DBG("DATA1:       [0x%02X]\n", HAL_FLASHEx_OBGetUserData(OB_DATA_ADDRESS_DATA1))

3. MCU Flash读保护/写保护的配置

参考STM32_RDP_WRP_SRAM

4. Option Byte的数据字段

  1. 这个用户字段在F1系列只有两个字节(非连续),用于存储一些掉电也可以保存的状态、标志位;至于需要怎么用,看用户自己的需求,个人目前感觉最大的用处就是用于固件升级时保存一下升级的标志位;(参考:STM32固件更新)

5. Option Byte的配置字段

  1. USERConfig可设置的选项如下:
// @defgroup FLASHEx_OB_IWatchdog Option Byte IWatchdog
#define OB_IWDG_SW      ((uint16_t)0x0001)  /*!< Software IWDG selected */	// MCU 复位后 IWDG 需要软件配置后才启动
#define OB_IWDG_HW      ((uint16_t)0x0000)  /*!< Hardware IWDG selected */	// MCU 复位后 IWDG 直接生效,不需要软件配置

// @defgroup FLASHEx_OB_nRST_STOP Option Byte nRST STOP
#define OB_STOP_NO_RST  ((uint16_t)0x0002) /*!< No reset generated when entering in STOP */
#define OB_STOP_RST     ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */

// @defgroup FLASHEx_OB_nRST_STDBY Option Byte nRST STDBY
#define OB_STDBY_NO_RST ((uint16_t)0x0004) /*!< No reset generated when entering in STANDBY */
#define OB_STDBY_RST    ((uint16_t)0x0000) /*!< Reset generated when entering in STANDBY */
  1. USERConfig的默认值为0x07(OB_IWDG_SW | OB_STOP_NO_RST | OB_STDBY_NO_RST);

http://www.kler.cn/a/394269.html

相关文章:

  • 微服务各组件整合
  • 【计算机网络】【传输层】【习题】
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • Elasticsearch 实战应用:高效搜索与数据分析
  • 前端:块级元素和行内元素
  • 【Linux】-学习笔记03
  • 【项目组件】第三方库——websocketpp
  • Flutter 应用在真机上调试的流程
  • 【WiFi】ubuntu20.4 WiFi6 无线抓包环境搭建及使用
  • PostgreSQL 序列字段达到最大值
  • 一文窥见神经网络
  • 【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题
  • Easyui ComboBox 数据加载完成之后过滤数据
  • AutoDL远程连接技巧
  • php preg_match 不到内容,修改pcre.backtrack_limit解决问题
  • elementui el-table中给表头 el-table-column 加一个鼠标移入提示说明
  • Android 关于使用videocompressor库压缩没有声音的问题
  • GOF设计模式中各模式支持的可变方面(封装变化)
  • 远程链接mysql步骤
  • UE5.4 PCG 生成藤蔓墙体
  • Hbase小测
  • 基于Java Springboot快递物流管理系统
  • Leetcode 56-合并区间
  • [JAVAEE] 面试题(五) - HashMap, Hashtable, ConcurrentHashMap
  • 如何确定光伏建设中的最佳安装倾角
  • day08|计算机网络重难点之 DNS查询过程、CDN是什么,有什么作用?、Cookie和Session是什么?有什么区别?