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

【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT

文章目录

    • 一、概要
    • 二、内部FLASH排布
    • 三、内部FLASH主要特色
    • 四、OTP函数介绍
    • 五、测试验证

一、概要

  STM32系列是一款强大而灵活的微控制器,它的片内Flash存储器可以用来存储有关代码和数据,在实际应用中,我们也需要对这个存储器进行读写操作。

  STM32的FLASH主存储块按页组织,有的产品每页1KB,有的能到2KB,页面典型的用途就是用于按页擦除FLASH,STM32F407的FLASH页大一点,能到16K,我们也叫做扇区。


二、内部FLASH排布

1. 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。
2. 主存储块:用于存储程序,我们写的程序一般存储在这里,用户还可以存储数据。信息块又分成两部分:系统存储器、OTP、选项字节。
3. 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。
4. OTP(One Time Program)区域,指的是只能写入一次的存储区域,容量为528字节,写入后数据就无法再更改,OTP常用于存储应用程序的加密密钥。
5. 选项字节存储芯片的配置信息及对主存储块的保护信息,主要有写保护字节,读保护字节等。

STM32F407产品主存储块512KB, 每个扇区16KB~128K大小不等,一共有7个扇区

在这里插入图片描述
在这里插入图片描述


三、内部FLASH主要特色

  • 容量大的芯片可以高达 1 MB 容量
  • 128 位宽数据读取
  • 字节、半字、字和双字数据写入
  • 扇区擦除与批量擦除
  • 存储器构成

  Flash 结构如下:
  — 主存储器块,含 4 个 16 KB 扇区、1 个 64 KB 扇区 和 7 个 128 KB 扇区。
  — 系统存储器,器件在系统存储器自举模式下从该存储器自举。此区域为意法半导体预留,其中包含自举程序,用以通过以下接口之一对 Flash 进行重新编程:USART1、USART3、CAN2、USB OTG FS 设备模式(DFU:设备固件升级)。自举程序由 ST 在器件制造期间编写,用于防止误写/误擦除操作。
  — 512 OTP(一次性可编程)字节,用于存储用户数据。OTP 区域包含 16 个附加字节,用于锁定相应的 OTP 数据块。
  — 选项字节:读写保护、BOR 级别、软件/硬件看门狗以及器件在待机或停机模式下的复位。


四、OTP函数介绍

1. HAL_StatusTypeDef HAL_FLASH_Unlock(void);
  作用:解锁FLASH控制寄存器访问
  返回值:写寄存器的状态

2. HAL_StatusTypeDef HAL_FLASH_Lock(void);
  作用:锁定FLASH控制寄存器访问
  返回值:写寄存器的状态

3. HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);
  作用:解锁FLASH选项控制寄存器访问
  返回值:写寄存器的状态

4. HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);
  作用:锁定FLASH选项控制寄存器访问
  返回值:写寄存器的状态

5. HAL_StatusTypeDef HAL_FLASH_OB_Launch(void)
  作用:启动选项字节加载
  返回值:写寄存器的状态

6. HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
  作用通过选定的字节类型进行数据写入
  返回值:写寄存器的状态

7. OPT数据读写过程代码:由于OPT是用户数据的一次性写入,所有需要确定写入的数据无误,不然存储的数据一旦写入,就无法再进行更改,但是可以进行无数次的读写。

// 定义OPT区域的起始地址和结束地址
#define OPT_START_ADDR 0x1FFF7800
#define OPT_END_ADDR   0x1FFF7A0F/*** @brief 写入数据到OPT区域* @param data:需要写的用户数据* @param size:数据个数*/
void write_to_opt(uint32_t *data, uint32_t size)
{uint32_t addr = OPT_START_ADDR;HAL_StatusTypeDef status;// 检查数据大小是否超过OPT区域的大小if ((size * 4) > (OPT_END_ADDR - OPT_START_ADDR)){return;}HAL_FLASH_Unlock();             // 解锁FLASHstatus = HAL_FLASH_OB_Unlock(); // 解锁选项字节区域HAL_FLASH_OB_Launch();          // 生效设置// 写入OPT数据for (uint32_t i = 0; i < size; i++){// 按字写入数据status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data[i]);if (status != HAL_OK){rt_kprintf("opt data write error!!!\n");break;}addr += 4;}// 锁定FLASHHAL_FLASH_OB_Lock();HAL_FLASH_Lock();
}// 读取OPT区域的数据
void read_from_opt(uint32_t *data, uint32_t size)
{uint32_t addr = OPT_START_ADDR;for (uint32_t i = 0; i < size; i++){data[i] = *(uint32_t*) addr;addr += 4;}
}/*** @brief 设置OPT数据*/
int write_opt_data(int argc, char **argv)
{if (argc != 2 && argc != 3){return -RT_ERROR;}else{if (strcmp(argv[0], "opt") == 0){if (argc == 3){if (strcmp(argv[1], "w") == 0){int size = atoi(argv[2]);uint32_t time[50] = {0};if (atoi(argv[2]) <= 50){read_from_opt(time, size);for (int i = 0; i < size; ++i){rt_kprintf("time[%d]:%u\n", i, time[i]);}}}}else{uint32_t time = (uint32_t)strtol(argv[1], NULL, 16);rt_kprintf("time:%u(0x%X)\n", time, time);write_to_opt(&time, 1);}}else{return -RT_ERROR;}}return RT_TRUE;
}
MSH_CMD_EXPORT_ALIAS(write_opt_data, opt, write_opt_data);

五、测试验证

  通过下面的测试数据可以看到,当第一次写入数据之后,可以正常读取导数据,读取的数据是写入的数据。当第二次重新写入数据的时候,读取到的数据还是之前写入的数据,没有改变,因此说明OPT数据只会被写入一次,然后无法再次写入。

在这里插入图片描述


相关文章:

【STM32】RTT-Studio中HAL库开发教程九:FLASH中的OPT

文章目录 一、概要二、内部FLASH排布三、内部FLASH主要特色四、OTP函数介绍五、测试验证 一、概要 STM32系列是一款强大而灵活的微控制器&#xff0c;它的片内Flash存储器可以用来存储有关代码和数据&#xff0c;在实际应用中&#xff0c;我们也需要对这个存储器进行读写操作。…...

[SWPUCTF 2021 新生赛]crypto9

[MoeCTF 2021]Web安全入门指北—GET 意思是GET传参&#xff0c;moeflag 就可以得到falg 输入?moeflag flag为&#xff1a; NSSCTF{ff26110b-8793-403c-990e-15c7f1820596} [SWPUCTF 2021 新生赛]crypto9 #gpt写的代码 from itertools import product letter_list ABCDEFG…...

vue中常用的指令

v - if 指令 功能详细解释 它是一种真正的条件渲染指令。在 Vue 实例初始化以及数据更新过程中&#xff0c;Vue.js 会对v - if指令中的表达式进行求值。这个表达式可以是简单的布尔变量&#xff0c;也可以是一个复杂的计算表达式&#xff0c;只要最终结果是布尔值就行。当表达式…...

Docker Compose实战三:轻松部署PHP

通过前面的文章&#xff08;Docker Compose基础语法与MySQL部署&#xff09;&#xff0c;你已经掌握了Docker Compose的基本语法和常用指令&#xff0c;并成功部署了一个MySQL数据库服务器。今天&#xff0c;我们将继续深入探索Docker Compose的强大功能&#xff0c;介绍如何使…...

数据分析实战—房价特征关系

1.实战内容 &#xff08;1&#xff09; 读取房价特征关系表&#xff08;house_price.npz&#xff09;绘制离地铁站的距离与单位面积的房价的散点图&#xff0c;并对其进行分析&#xff1b; import pandas as pd import numpy as np import warnings warnings.filterwarnings(&…...

云和恩墨 zCloud 与华为云 GaussDB 完成兼容性互认证

近日&#xff0c;云和恩墨&#xff08;北京&#xff09;信息技术有限公司&#xff08;以下简称&#xff1a;云和恩墨&#xff09;的多元数据库智能管理平台 zCloud 与华为云计算技术有限公司&#xff08;以下简称&#xff1a;华为云&#xff09;的 GaussDB 数据库完成了兼容性互…...

【大语言模型LangChain】 ModelsIO OutputParsers详解

【大语言模型LangChain】 ModelsIO OutputParsers详解 一、简介二、OutputParsers 的优势三、解析器类型四、实战示例1、String 解析器2、Json 解析器3、Pydantic 解析器4、结构化输出解析器5、OpenAI 函数输出解析器5.1、JsonOutputFunctionsParser5.2、JsonKeyOutputFunction…...

PaddleSpeech本地部署文档

windows安装paddlespeech步骤&#xff1a; 1. 安装vs c编译环境 对于 Windows 系统&#xff0c;需要安装 Visual Studio 来完成 C 编译环境的安装。 Microsoft C Build Tools - Visual Studio 2. 安装conda conda create -y -p paddlespeech python3.8 conda activate pad…...

Android 第三方框架:RxJava:源码分析:责任链模式

文章目录 责任链模式RxJava中的责任链总结 责任链模式 RxJava中的责任链 链式调用的使用过程中形成了两个单向链表 第一个单向链表是Observable链表 它的形成过程&#xff1a; 1.首先调用Observable的静态方法创建第一个Observable对象&#xff0c;作为Observable链表的表…...

网络安全 与 加密算法

计算机中的网络安全 在本篇中介绍了以下几个方面: 机密性 密码学 对称加密算法(DES, 3DES, AES) 公开秘钥算法 RSA大素数的获取 完整性 散列函数(MD5, SHA-1, 并没有提及算法实现) 报文鉴别(MAC) 数字签名 端点鉴别 应用 SSL(TCP网络安全) 运行时安全 防火墙的基本知识 …...

UE4_贴花_贴花基础知识二

五、多表面投射 在本示例中&#xff0c;你将了解贴花如何在多个表面上进行投射。请注意&#xff0c;如果表面朝向与投射方向较为平行&#xff0c;贴花投射时必然会产生一些拉伸。另外&#xff0c;请记住&#xff0c;贴花可以在包括骨骼网格体在内的静态和动态网格体上进行投射。…...

ElasticSearch 搜索、排序、分页功能

一、DSL 查询文档 ElasticSearch 的查询依然是基于 json 风格的 DSL 来实现的。 官方文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/8.15/query-dsl.html 1.1 DSL 查询分类 常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数…...

MySQL-9.1.0 实现最基础的主从复制

目录 1 实验介绍 2 实验准备 2.1 创建目录为MySQL挂载使用 2.2 编写 docker-compose.yml 文件 2.3 启动容器 3 主从复制操作 3.1 MASTER 操作指令 3.2 SLAVE1 操作指令 3.3 SLAVE2 操作指令 4 验证是否实现主从 4.1 导入sql脚本查看是否正常主从复制 4.2 检验从库是否看见复制…...

Java中的“泛型“

泛型&#xff08;Generics&#xff09;是Java中的一种重要特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。泛型的主要目的是提高代码的类型安全性和重用性。下面我将详细讲解Java中的泛型。 1. 泛型的基本概念 泛型允许我…...

前端(五)css属性

css属性 文章目录 css属性一、字体属性二、文本属性三、背景属性四、盒子模型 一、字体属性 font-weight&#xff1a;文字粗细&#xff0c;在100到900之间&#xff0c;normal(400),bord(700),inherit(继承父类) font-style&#xff1a;文字风格&#xff0c;normal表示正常(默认…...

总结拓展十七:SAP 采购订单行项目“交货“页签解析

《 SAP采购订单行项目“交货”页签字段解析》 在 SAP 系统的采购流程中&#xff0c;采购订单行项目的“交货”页签承载着关键的信息&#xff0c;其中的字段更是对整个交货环节的精准描述和把控的重要元素。理解和正确解析这些字段&#xff0c;对于确保采购流程的顺利进行、优化…...

分布式日志系统设计

一、分布式日志系统定义 分布式日志系统是一种用于收集、存储和分析大规模分布式系统日志的系统。它可以帮助开发人员和系统管理员实时监控和调试系统&#xff0c;提高系统可靠性和可用性&#xff0c;同时也可以用于日志分析和故障排查。 二、简单设计思路 日志收集&#xff…...

DApp开发如何平衡性能与去中心化?

DApp的核心价值在于信任、透明和去中心化&#xff0c;但这些特点往往伴随着性能的瓶颈和高成本。在DApp开发中&#xff0c;如何在保证去中心化的前提下提升性能&#xff0c;成为开发者面临的重要挑战。如何实现性能与去中心化的平衡是一个重要课题。 一、为什么去中心化影响性…...

RK3588开发笔记-Buildroot编译Qt5WebEngine-5.15.10

目录 前言 一、Qt5WebEngine简介 二、Qt5WebEngine编译 总结 前言 Rockchip RK3588是一款强大的多核处理器,广泛应用于边缘计算、人工智能、嵌入式系统等领域。为了在RK3588上运行自定义的Linux系统,并使用Qt5WebEngine进行Web内容渲染,Buildroot是一个非常合适的工具。本…...

2024年12月GESPC++三级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案 B D A A D B C A A D D C D C A 1.下列二进制表示的十进制数值分别是&#xff08; &#xff09;[10000011]原&#xff08; &#xff09; [10000011]补&#xff…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...