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

STM32 内部 EEPROM 读写

STM32 的某些系列 MCU 自带 EEPROM。笔者使用的 STM32L151RET6 自带 16 KBEEPROM,可以用来存储自定义的数据。在芯片选型时,自带 EEPROM 也可以作为一个考量点,省去了在外接 EEPROM 的烦恼。

下面简单介绍下 STM32 内部 EEPROM 的读写流程。

Memory Mapping

以笔者使用的这款 STM32L151RET6 MCU 为例,自带 16 KB 的 EEPROM。Map 到了 2 个 Bank 中:

Memory Map

  • Data EEPROM Bank1: 0x08080000 ~ 0x08081FFF (8KB)
  • Data EEPROM Bank2: 0x08082000 ~ 0x08083FFF (8KB)

Operations

内部 EEPROM 的操作无非就是 读取写入擦除 等操作。直接调用库函数或者 HAL 库中对应的 API 即可。这里只是对内部 EEPROM 的操作做一个简要的分析。

本文档主要以库函数中的 EEPROM 接口 API 进行分析。

Unlocking/locking memory

STM32 复位后,Data EEPROMProgram/erase 控制寄存器 (FLASH_PECR) 默认是 处于 lock 状态需要 unlock 之后才能执行写入和擦除操作

如何 unlock 可以参考芯片对应的 datasheet,简单的说就是往 Program/erase 密钥寄存器 (FLASH_PEKEYR) 写指定的密钥集即可。

  • Write PEKEY1= 0x89ABCDEF to the Program/erase key register (FLASH_PEKEYR)
  • Write PEKEY2= 0x02030405 to the Program/erase key register (FLASH_PEKEYR)
/*** @brief  Unlocks the data memory and FLASH_PECR register access.* @param  None* @retval None*/
void DATA_EEPROM_Unlock(void)
{if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET){  /* Unlocking the Data memory and FLASH_PECR register access*/FLASH->PEKEYR = FLASH_PEKEY1;FLASH->PEKEYR = FLASH_PEKEY2;}
}
#define FLASH_PEKEY1               ((uint32_t)0x89ABCDEF) /*!< Flash program erase key1 */
#define FLASH_PEKEY2               ((uint32_t)0x02030405) /*!< Flash program erase key: used with FLASH_PEKEY2to unlock the write access to the FLASH_PECR register anddata EEPROM */

如何 lock 可以参考芯片对应的 datasheet,相较于 unlock,lock 仅需要置位 Program/erase 控制寄存器 (FLASH_PECR) 中的 FLASH_PECR 位。

/*** @brief  Locks the Data memory and FLASH_PECR register access.* @param  None* @retval None*/
void DATA_EEPROM_Lock(void)
{/* Set the PELOCK Bit to lock the data memory and FLASH_PECR register access */FLASH->PECR |= FLASH_PECR_PELOCK;
}

Erasing memory

对于 EEPROM,支持以下 2 种擦除方式:

  • Word 和 double word 擦除
  • Mass 擦除

对于 Word 和 double word 擦除,这种方式仅针对 EEPROM;但是对于 Mass 擦除,这种方式针对 Program memory、EEPROM 和 Option bytes。所以尽量在使用 EEPROM 的时候采用 Word 和 double word 擦除方式

EEPROM 擦除方式也很简单,只需要将值 0x00000000 写入到对应的有效的擦除地址中即可。

EEPROM Word Erase

/*** @brief  Erase a word in data memory.* @param  Address: specifies the address to be erased.* @note   For STM32L1XX_MD, A data memory word is erased in the data memory only *         if the address to load is the start address of a word (multiple of a word).* @note   To correctly run this function, the DATA_EEPROM_Unlock() function*         must be called before.*         Call the DATA_EEPROM_Lock() to disable the data EEPROM access*         and Flash program erase control register access(recommended to protect *         the DATA_EEPROM against possible unwanted operation).* @retval FLASH Status: The returned value can be: *   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or FLASH_TIMEOUT.*/
FLASH_Status DATA_EEPROM_EraseWord(uint32_t Address)
{FLASH_Status status = FLASH_COMPLETE;/* Check the parameters */assert_param(IS_FLASH_DATA_ADDRESS(Address));/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);if(status == FLASH_COMPLETE){/* Write "00000000h" to valid address in the data memory" */*(__IO uint32_t *) Address = 0x00000000;}/* Return the erase status */return status;
}

Programming memory

写入 EEPROM 的步骤也很简单,一般的流程如下:

  • unlock
  • erase
  • write
  • lock
/*** @brief  Programs a word at a specified address in data memory without erase.* @note   To correctly run this function, the DATA_EEPROM_Unlock() function*         must be called before.*         Call the DATA_EEPROM_Lock() to disable the data EEPROM access*         and Flash program erase control register access(recommended to protect *         the DATA_EEPROM against possible unwanted operation).* @note   The function  DATA_EEPROM_FixedTimeProgramCmd() can be called before *         this function to configure the Fixed Time Programming.* @param  Address: specifies the address to be written.* @param  Data: specifies the data to be written.* @retval FLASH Status: The returned value can be:*   FLASH_ERROR_PROGRAM, FLASH_ERROR_WRP, FLASH_COMPLETE or  FLASH_TIMEOUT. */
FLASH_Status DATA_EEPROM_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Status status = FLASH_COMPLETE;/* Check the parameters */assert_param(IS_FLASH_DATA_ADDRESS(Address));/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);if(status == FLASH_COMPLETE){*(__IO uint32_t *)Address = Data;/* Wait for last operation to be completed */status = FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);}/* Return the Write Status */return status;
}

Reading Momory

读取 EEPROM 中的数据就没那么多步骤了,直接读取对应的 Map 的 Bank 即可。

Note

对于 EEPROM 的操作,以下几点需要注意:

  • 尽量以 4 字节为一个单位进行操作
  • 在执行写入或者擦除操作的时候,尽量将全局中断关闭,以免中断触发引起其它的问题
  • 不要对相同的一个 Bank 同时做多种操作,尽量保证一个 Bank 只有一种操作在执行

列出一段 EEPROM 的参考代码:

void EEPROM_Test(void)
{__set_PRIMASK(1);DATA_EEPROM_Unlock();/* EEPROM Operations */DATA_EEPROM_Lock();__set_PRIMASK(0);
}

相关文章:

STM32 内部 EEPROM 读写

STM32 的某些系列 MCU 自带 EEPROM。笔者使用的 STM32L151RET6 自带 16 KB 的 EEPROM&#xff0c;可以用来存储自定义的数据。在芯片选型时&#xff0c;自带 EEPROM 也可以作为一个考量点&#xff0c;省去了在外接 EEPROM 的烦恼。 下面简单介绍下 STM32 内部 EEPROM 的读写流…...

androidStudio sync failed GradlePropertiesModel (V2)

大家在增加模块的时候经常遇到吧&#xff1f;重启后就好了。 Cannot get GradlePropertiesModel (V2) for project ‘GradleProject{path’:app’}’ 然而&#xff0c;今天开机以后&#xff0c;无论如何&#xff0c;点击gradle的大象图标(Sync Project with Gradle Files)&…...

结构方程模型(SEM)

结构方程模型&#xff08;Structural Equation Modeling&#xff09;是分析多变量间因果关系的利器&#xff0c;在众多学科领域具有巨大应用潜力。我们前期推出的《基于R语言结构方程模型》课程通过结构方程原理介绍、结构方程全局和局域估计、模型构建和调整、潜变量分析、复合…...

基于UDP的网络编程

UDP服务端 #ifdef _WIN32 #define _WINSOCK_DEPRECATED_NO_WARNINGS #define close closesocket #include <winsock2.h> #else #include <arpa/inet.h> #include <netdb.h> #include <netinet/in.h> #in…...

vue判断组件有没有传入的slot有就渲染slot没有就渲染内部节点

GPT4国内站点&#xff1a;海鲸AI 在 Vue 中&#xff0c;你可以使用 $slots 对象来检查是否有特定的插槽内容被传递给组件。Vue 3 中的 $slots 是一个对象&#xff0c;其中包含了所有插槽的引用。如果插槽没有内容&#xff0c;对应的插槽属性将会是 undefined。 下面是一个例子…...

MS713/MS713T:CMOS 低压、4Ω四路单刀单掷开关,替代ADG713

产品简述 MS713/MS713T 是一款单芯片 CMOS 4 路可选择开关&#xff0c;具有低 功耗、高开关速度、低导通阻抗、低漏电和高带宽特性。其工作 电压范围是 1.8V 到 5.5V &#xff0c;可以广泛应用在电池供电仪器仪表、新 一代的模数转换和数模转换系统中。其高带宽特性可用在 …...

Android 内容生成pdf文件

1.引入itext7 implementation com.itextpdf:itext7-core:7.1.13上面比较大&#xff0c;可以直接下载需要集成的jar包 implementation files(libs\\layout-7.1.13.jar) implementation files(libs\\kernel-7.1.13.jar) implementation files(libs\\io-7.1.13.jar) implementatio…...

Javaweb-日程管理

094.日程管理第二期_准备数据库和实体类_哔哩哔哩_bilibili navicat 下载 学生认证: Navicat 教育版 - 学生许可证 | Navicat navicat连接mysql 使用navicat连接mysql数据库创建数据库、表、转储sql文件&#xff0c;导入sql数据_哔哩哔哩_bilibili...

SwiftUI之深入解析如何创建一个灵活的选择器

一、前言 在 Dribbble 上找到的设计的 SwiftUI 实现时&#xff0c;可以尝试通过一些酷炫的筛选器扩展该项目以缩小结果列表。筛选视图将由两个独立的筛选选项组成&#xff0c;两者都有一些可选项可供选择。但是&#xff0c;在使用 UIKit 时&#xff0c;总是将这种类型的视图实…...

【模拟量采集1.2】电阻信号采集

【模拟量采集1.2】电阻信号采集 1 怎么测&#xff1f;2 测输入电阻电压即转为测模拟电压值&#xff0c;这里需要考虑选用怎样的辅助电阻&#xff1f;3 实际电路分析3.1 在不考虑 VCC-5V 电压的纹波等情况时&#xff08;理想化此时输入的 VCC 就是稳定的 5V&#xff09;3.2 若考…...

c++牛客总结

一、c/c语言基础 1、基础 1、指针和引用的区别 指针是一个新的变量&#xff0c;指向另一个变量的地址&#xff0c;我们可以通过这个地址来修改该另一个变量&#xff1b; 引用是一个别名&#xff0c;对引用的操作就是对变量本身进行操作&#xff1b;指针可以有多级 引用只有一…...

ts相关笔记(基础必看)

推荐一下小册 TypeScript 全面进阶指南&#xff0c;此篇笔记来源于此&#xff0c;记录总结&#xff0c;加深印象&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&#xff0c;可以参考我的其他笔记&#xff1a; vue3ts开发干货笔记TSConfig 配置&#xff08;tsconfig.…...

Docker随笔

OverView 为什么需要Docker 如果我需要部署一个服务&#xff0c;那么我需要提前部署其他应用栈&#xff0c;不同的应用栈会依赖于不用的操作系统和环境。这样做会产生一些负面影响&#xff1a; 不同版本依赖较长的部署时间不同的Dev/Test/Prod环境 这时我们需要一个工具去解…...

uni-app 前后端调用实例 基于Springboot

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…...

vue3+ts开发干货笔记

总结一下在vue3中ts的使用。当篇记录部分来自于vue官网&#xff0c;记录一下&#xff0c;算是加深印象吧。 纯干笔记&#xff0c;不断补充&#xff0c;想到什么写什么&#xff0c;水平有限&#xff0c;欢迎评论指正&#xff01; 另外&#xff0c;如果想了解更多ts相关知识&…...

Android开发新的一年Flag

在新的一年里&#xff0c;为了提升Android开发技能&#xff0c;实现更优质的应用程序&#xff0c;我们制定了2024的新年Flag。这些Flag涵盖了技术学习、代码优化、架构升级、用户体验等多个方面&#xff0c;旨在帮助我们成为更优秀的Android开发者。 1. 学习新技术 1.1. Andr…...

好的OODA循环与快慢无关

OODA循环是指观察&#xff08;Observe&#xff09;、导向&#xff08;Orient&#xff09;、决策&#xff08;Decide&#xff09;和行动&#xff08;Act&#xff09;这四个步骤的循环过程。它是一种决策和行动的框架&#xff0c;旨在帮助个人或组织更快地适应和应对变化。 OODA循…...

Android 车联网——CarUserService介绍(十三)

一、简介 CarUserService 是 Android 汽车平台的一个组件,它用于管理和提供车辆用户信息。该组件可以让开发者创建和管理与车辆用户相关的数据和配置,包括车辆拥有者和乘客的个人信息、偏好设置、用户偏好配置文件等。 CarUserService 提供了以下功能和特性: 用户配置管理:…...

【开题报告】基于微信小程序的母婴商品仓库管理系统的设计与实现

1.选题背景 随着社会经济的发展和家庭生活水平的提高&#xff0c;母婴商品市场逐渐兴起。然而&#xff0c;传统的母婴商品仓库管理方式存在着许多问题&#xff0c;如信息不透明、操作繁琐等。为了提高仓库管理的效率和准确性&#xff0c;基于微信小程序的母婴商品仓库管理系统…...

分布式锁相关问题(三)

Redis实战精讲-13小时彻底学会Redis 一、什么是分布式锁&#xff1f; 要介绍分布式锁&#xff0c;首先要提到与分布式锁相对应的是线程锁、进程锁。 l 线程锁&#xff1a;主要用来给方法、代码块加锁。当某个方法或代码使用锁&#xff0c;在同一时刻仅有一个线程执行该方法或该…...

grep!Linux系统下强大的文本搜索工具!

grep&#xff01;Linux系统下强大的文本搜索工具&#xff01; grep是一个强大的文本搜索工具&#xff0c;它可以在文件中查找包含指定字符串的行。grep的基本语法如下&#xff1a; grep [选项] "搜索字符串" 文件名其中&#xff0c;选项可以是以下几种&#xff1a;…...

(学习打卡1)重学Java设计模式之设计模式介绍

前言&#xff1a;听说有本很牛的关于Java设计模式的书——重学Java设计模式&#xff0c;然后买了(*^▽^*) 开始跟着小傅哥学Java设计模式吧&#xff0c;本文主要记录笔者的学习笔记和心得。 打卡&#xff01;打卡&#xff01; 设计模式介绍 一、设计模式是什么&#xff1f; …...

docker 部署教学版本

文章目录 一、docker使用场景及常用命令1&#xff09;docker使用场景2&#xff09;rocky8(centos8)安装 docker3&#xff09;docker 常用命令补充常用命令 二、 单独部署每个镜像&#xff0c;部署spring 应用镜像推荐&#xff08;2023-12-18&#xff09;1、 安装使用 mysql1.1 …...

2023春季李宏毅机器学习笔记 05 :机器如何生成图像

资料 课程主页&#xff1a;https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub&#xff1a;https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程&#xff1a;https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、图像生成常见模型…...

C#和C++存储 和 解析 bin 文件

C 解析 bin 文件 // C 解析 bin 文件 #include <stdio.h>int main() {FILE *file; // 定义文件指针file fopen("example.bin", "rb"); // 打开二进制文件&#xff08;只读模式&#xff09;if (file NULL) {printf("无法打开文件\n");re…...

【React系列】Redux(二)中间件

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 中间件的使用 1.1. 组件中异步请求 在之前简单的案例中&#xff0c;redux中保存的counter是一个本地定义的数据…...

YOLOv8改进 | 2023Neck篇 | 利用Gold-YOLO改进YOLOv8对小目标检测

一、本文介绍 本文给大家带来的改进机制是Gold-YOLO利用其Neck改进v8的Neck,GoLd-YOLO引入了一种新的机制——信息聚集-分发(Gather-and-Distribute, GD)。这个机制通过全局融合不同层次的特征并将融合后的全局信息注入到各个层级中,从而实现更高效的信息交互和融合。这种…...

ubuntu环境安装配置nginx流程

今天分享ubuntu环境安装配置nginx流程 一、下载安装 1、检查是否已经安装 nginx -v 结果 2、安装 apt install nginx-core 过程 查看版本&#xff1a;nginx -v 安装路径&#xff1a;whereis nginx nginx文件安装完成之后的文件位置&#xff1a; /usr/sbin/nginx&#xf…...

【LMM 010】MiniGPT-v2:使用独特的标识符实现视觉语言多任务学习的统一的多模态大模型

论文标题&#xff1a;MiniGPT-v2: Large Language Model As a Unified Interface for Vision-Language Multi-task Learning 论文作者&#xff1a;Jun Chen, Deyao Zhu, Xiaoqian Shen, Xiang Li, Zechun Liu, Pengchuan Zhang, Raghuraman Krishnamoorthi, Vikas Chandra, Yun…...

人工智能如何重塑金融服务业

在体验优先的世界中识别金融服务业中的AI使用场景 人工智能&#xff08;AI&#xff09;作为主要行业的大型组织的重要业务驱动力&#xff0c;持续受到关注。众所周知&#xff0c;传统金融服务业在采用新技术方面相对滞后&#xff0c;一些组织使用的还是上世纪50年代和60年代发…...

全渠道运营平台系统/鞍山seo优化

ImagePicker 项目地址&#xff1a;Lichenwei-Dev/ImagePicker 简介&#xff1a;高仿微信图片选择器&#xff08;支持单图&#xff0c;多图&#xff0c;视频选择&#xff0c;支持图片自由缩放&#xff0c;视频播放等功能&#xff09; 更多&#xff1a;作者 提 Bug 标签…...

网站开发给网站设置图标在什么文件中写代码/全网整合营销推广方案

明确人生的目的和意义 在经营十二条中&#xff0c;第一条就是“明确事业的目的意义”&#xff0c;做企业如果不能明确事业的目的和意义&#xff0c;那就没有办法办的长久&#xff0c;也没有办法聚拢人心&#xff0c;企业就会像一盘散沙。 人生也是一样的&#xff0c;如果不能明…...

有什么网站可以下做闭软件/市场营销策划案的范文

目的&#xff1a;从指定的身份证号码中提取出去年月。 方法&#xff1a; 1、选定目标单元格。 2、输入公式&#xff1a;TEXT(MID(C3,7,8),"00-00-00")。 3、CtrlEnter填充。 解读&#xff1a; 1、利用MID函数从C3单元格中提取从第7个开始&#xff0c;长度为8的字符串…...

苏州高端网站建设kgu/淘宝数据查询

Hadoop解决大规模数据分布式计算的方案是MapReduce。MapReduce既是一个编程模型&#xff0c;又是一个计算框架。也就是说&#xff0c;开发人员必须基于MapReduce编程模型进行编程开发&#xff0c;然后将程序通过MapReduce计算框架分发到Hadoop集群中运行。我们先看一下作为编程…...

怎样在领英上做公司网站/淘宝搜索指数

HTML介绍 HTML&#xff08;HyperText MarkupLanguage&#xff09;简称超文本标记语言。它和CSS、JavaScript组合完成一个网页的设计。对于一个网页&#xff0c;HTML定义网页的结构&#xff0c;CSS描述网页的样子&#xff0c;JavaScript则实现人机交互。 HTML语义化 说起HTML&am…...

新网站怎样做推广/2024北京又开始核酸了吗今天

小程序的消息推送很简单&#xff0c;主要把几个步骤理清就好了。 在小程序的微信开发平台上配置服务器前端传递必要参数后端实现推送功能 下发条件说明 支付 当用户在小程序内完成过支付行为&#xff0c;可允许开发者向用户在7天内推送有限条数的模板消息&#xff08;1次支付…...