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 protectedThis 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 / BOOT1This parameter can be a combination of @ref FLASHEx_OB_IWatchdog, @ref FLASHEx_OB_nRST_STOP, @ref FLASHEx_OB_nRST_STDBY, @ref FLASHEx_OB_BOOT1 */
#elseuint8_t USERConfig;   /*!< USERConfig: Program the FLASH User Option Byte: IWDG / STOP / STDBYThis 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 programmedThis parameter can be a value of @ref FLASHEx_OB_Data_Address */uint8_t DATAData;     /*!< DATAData: Data to be stored in the option byte DATAThis 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 */	// 进入STOP模式后不产生复位(默认值)
#define OB_STOP_RST     ((uint16_t)0x0000) /*!< Reset generated when entering in STOP */	// 进入STOP模式后产生复位(这个有什么用呢?每次进入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 */	// 通过这个配置产生的复位不会设置PWR_FLAG_SB位,即MCU不会认为此次复位是由唤醒Standby模式产生的
  1. USERConfig的默认值为0x07(OB_IWDG_SW | OB_STOP_NO_RST | OB_STDBY_NO_RST);
  2. 关于OB_STOP_RST配置的验证,可以参考STM32低功耗例程;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/473494.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…

(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细!!!)

续上篇博客&#xff08;长期更新&#xff09;《零基础入门 ArcGIS(ArcMap) 》实验一&#xff08;上&#xff09;----空间数据的编辑与处理&#xff08;超超超详细&#xff01;&#xff01;&#xff01;&#xff09;-CSDN博客 继续更新 本篇博客内容为道路拓扑检查与修正&#x…

Unity3D 完整直升机控制器(虚拟仿真级别)

采用了MVC框架&#xff0c;以四轴驱动的方式对直升机的启动、飞行做了仿真模拟&#xff0c;包括但不限于参数设置、启动发动机和旋翼、数据显示、HUD、UI、升降、水平移动、转弯等。 文末有完整的工程资源链接。 1.旋翼 直升机飞行过程中&#xff0c;有顶部的主旋翼和尾部的尾…

yum工具的学习

Linux下安装软件的方法 1.源代码安装 2.rmp包安装 3.包管理器进行安装 --- yum/apt Linux下载软件的过程 操作系统的好坏评估 -- 生态问题 yum具体操作 Linux软件安装所有人都能用&#xff0c;是以other的身份去执行可执行程序 文件拷贝&#xff08;sudo&#xff09;-- &g…

Linux:进程的优先级 进程切换

文章目录 前言一、进程优先级1.1 基本概念1.2 查看系统进程1.3 PRI和NI1.4 调整优先级1.4.1 top命令1.4.2 nice命令1.4.3 renice命令 二、进程切换2.1 补充概念2.2 进程的运行和切换步骤&#xff08;重要&#xff09; 二、Linux2.6内核进程O(1)调度队列&#xff08;重要&#x…

MongoDB在现代Web开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 MongoDB在现代Web开发中的应用 引言 MongoDB 概述 定义与原理 发展…

爬取链家二手房房价数据存入mongodb并进行分析

感谢您的关注&#xff01;需要完整源码评论区获取~ 【实验目的】 1. 使用 python 将爬虫数据存入 mongodb&#xff1b; 2. 使用 python 读取 mongodb 数据并进行可视化分析。 【实验原理】 MongoDB 是文档数据库&#xff0c;采用 BSON 的结构来存储数据。在文档中可嵌套其…

Solana 区块链的技术解析及未来展望 #dapp开发#公链搭建

随着区块链技术的不断发展和应用场景的扩展&#xff0c;性能和可拓展性成为各大公链竞争的关键因素。Solana&#xff08;SOL&#xff09;因其高吞吐量、低延迟和低成本的技术特性&#xff0c;在众多区块链项目中脱颖而出&#xff0c;被誉为“以太坊杀手”之一。本文将从技术层面…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 多文件同步上传、拖动上传、实时上传进度条、上传前的删除文件、原生file控件的美化 搁置的功能: 取消上传(上传过程中取消,即取消网络请求abort)、上传文件夹、大文件切片、以及很多限制条件未处理(重复上传、文件格式。。。) bug: 文件总大小(。。。竟然从d…

Element-ui Select选择器自定义搜索方法

效果图 具体实现 <template><div class"home"><el-selectref"currencySelect"v-model"currency"filterable:spellcheck"false"placeholder"请选择":filter-method"handleCurrencyFilter"change&q…

JS的学习与使用

JS的学习与使用 一 什么是Javascript&#xff1f; Javascript是一门跨平台&#xff0c;面向对象的脚本语言&#xff0c;是用来控制网页行为的&#xff0c;它能使网页可以交互 java与Javascript是完全不同的语言&#xff0c;不论是概念还是设计&#xff0c;但是基础语法类似 E…

Docker:查看镜像里的文件

目录 背景步骤1、下载所需要的docker镜像2、创建并运行临时容器3、停止并删除临时容器 背景 在开发过程中&#xff0c;为了更好的理解和开发程序&#xff0c;有时需要确认镜像里的文件是否符合预期&#xff0c;这时就需要查看镜像内容 步骤 1、下载所需要的docker镜像 可以使…

【网络安全 | 漏洞挖掘】通过密码重置污染实现账户接管

未经许可,不得转载。 文章目录 密码重置污染攻击漏洞挖掘的过程目标选择与初步测试绕过 Cloudflare 的尝试发现两个域名利用 Origin 头部污染实现账户接管攻击流程总结在今天的文章中,我们将深入探讨一种 账户接管 漏洞,并详细分析如何绕过 Cloudflare 的保护机制,利用密码…

Redis 5 种基本数据类型详解

Redis 共有 5 种基本数据类型&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#xff08;集合&#xff09;、Hash&#xff08;散列&#xff09;、Zset&#xff08;有序集合&#xff09;。 这 5 种数据类型是直接提供给用户使用的&…

AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!

1、原则解释 当与 ChatGPT 交流时&#xff0c;提供具体和详细的信息非常重要。 这样做可以帮助 ChatGPT 更准确地理解你的需求和上下文&#xff0c;从而生成更相关和有用的回答 明确的信息可以包括具体的问题背景、相关领域的说明、你所期望的答案类型等。 2、如何实践 明…

数据库的隔离机制---对MySQL 默认隔离级别的理解

参考&#xff1a; 脏读、幻读和不可重复读_脏读 ​​​​​​ 全网最详细MVCC讲解&#xff0c;一篇看懂 - 知乎全网最详细MVCC讲解&#xff0c;一篇看懂 - 知乎 面试官&#xff1a;MySQL 的默认隔离级别是什么?可以解决幻读问题吗&#xff1f; 目录 一、脏读、幻读、不可…

UNI-APP小程序答题功能开发(左右滑动,判断,填空,问答,答题卡,纠错,做题倒计时等)

原博&#xff1a;uni-app小程序答题功能开发(左右滑动,判断,填空,问答,答题卡,纠错,做题倒计时等)_uniapp答题模板-CSDN博客 标签&#xff1a; 小程序 uni-app 模板链接:答题模板 html部分 这里没啥好说的,就是根据不同的状态显示不同的内容 <template><view>…

SpringBoot多环境配置的实现

前言 开发过程中必然使用到的多环境案例&#xff0c;通过简单的案例分析多环境配置的实现过程。 一、案例 1.1主配置文件 spring:profiles:active: prod server:port: 80801.2多环境配置文件 开发环境 blog:domain: http://localhost:8080测试环境 blog:domain: https:/…

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…

Linux下多线程

在Linux下的底层里并没有多线程这个概念&#xff0c;取而代之的是轻量级进程的概念。应为在Llinu下内核下并没有TCB,而只有PCB。 线程是什么 在⼀个程序⾥的⼀个执⾏路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“⼀个进程内部 的控制序…