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

FreeRtos——22、HAL库片内EEPROM以及flash读写数据

基础知识补充:

1 字节 = 8 位(bit) 1 千字节(KB)= 1024 字节 1 兆字节(MB)= 1024 千字节(KB) 1 吉字节(GB)= 1024 兆字节(MB) 1 太字节(TB)= 1024 吉字节(GB)

容量:

STM32F103C8T6的内部Flash容量为64KB,即64 * 1024字节,属于小容量产品。

以下是针对STM32F1系列芯片的常见型号,按照容量范围划分的示例:

容量范围芯片型号Flash大小容量大小
小容量STM32F103C8T664 KB64 * 1024 字节
STM32F103RCT6256 KB256 * 1024 字节
中容量STM32F103RBT6128 KB128 * 1024 字节
STM32F103RET6512 KB512 * 1024 字节
大容量STM32F103VET6512 KB512 * 1024 字节
STM32F103ZET61024 KB1024 * 1024 字节

扇区划分:

内部Flash 存储器 被划分为多个扇区,每个扇区的大小为2KB或4KB,具体划分取决于具体的芯片型号。

  • Flash大小为 64KB, 地址范围:0x08000000-0x08010000-1,单个扇区大小:1KB=0x400,最后一个扇区地址:0x0800FC00
  • Flash大小为 128KB,地址范围:0x08000000-0x08020000-1,单个扇区大小:1KB=0x400,最后一个扇区地址:0x0801FC00
  • Flash大小为 256KB,地址范围:0x08000000-0x08040000-1,单个扇区大小:2KB=0x800,最后一个扇区地址:0x0803F800
  • Flash大小为 512KB,地址范围:0x08000000-0x08080000-1,单个扇区大小:2KB=0x800,最后一个扇区地址:0x0807F800

STM32F103C8T6(64KB的扇区划分)
 

扇区编号起始地址结束地址大小
扇区00x080000000x080003FF1 KB
扇区10x080004000x080007FF1 KB
扇区20x080008000x08000BFF1 KB
...............
扇区610x0800F4000x0800F7FF1 KB
扇区620x0800F8000x0800FBFF1 KB
扇区630x0800FC000x0800FFFF1 KB

第一点、片内EEPROM,因为是片内资源, 不需要任何外设。所以,不需要做任务初始化,直接调用  库函数,就可以了。

第二点,EEPROM 主要实现的是, 在任意一个位置写入数据,在任意一个位置读出自己想要的数据。

第三点,片内EEPROM不需要进行Cube的配置,调用库函数即可直接使用。基本操作分为三步:

1.解锁

2.写入数据(擦除也是写入数据只不过写的是0x00)

3.上锁(建议上锁,其实没啥用,不用问题不是很大)

第四点,必须看明白,一个MCU的里面的EEPROM 的分布情况 和  地址;

需要自行查阅数据手册。

EEPROM用于断电保存数据,stm32自带EEPROM,可以在cubemx的选型中看到

如何写内置EEPROM?
函数定义在Drivers\STM32L0xx_HAL_Driver\Inc\stm32l0xx_hal_flash_ex.h 

HAL_FLASHEx_DATAEEPROM_Unlock(); HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE,DATA_EEPROM_BASE+0x00,233); HAL_FLASHEx_DATAEEPROM_Lock();

不需要配置CUBEMX,直接调用上面的函数即可向0x00写入一个字节:233

如何读取内置EEPROM?
直接读地址就行 

uint8_t data=*(uint8_t *)(DATA_EEPROM_BASE+0x00);

如何写入结构体到EEPROM?

struct{ double input_wh,output_mah; }eeprom_data; HAL_FLASHEx_DATAEEPROM_Unlock(); for (uint8_t i = 0; i < sizeof(eeprom_data); i++) { HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE,DATA_EEPROM_BASE+i,*(((uint8_t *)&eeprom_data)+i)); } HAL_FLASHEx_DATAEEPROM_Lock();

如何读取到结构体里?

for (uint8_t i = 0; i < sizeof(eeprom_data); i++) { *(((uint8_t *)&eeprom_data)+i)=*(uint8_t *)(DATA_EEPROM_BASE+i); }

1. 从“掉电就失忆”到“数据永驻”:为什么你需要了解STM32的内部EEprom?

想象一下这个场景:你辛辛苦苦调试好了一个智能温控器,用户设定了25度的舒适温度。结果设备一断电重启,温度设置又回到了默认的20度。用户肯定会抱怨:“这产品怎么连个设置都记不住?” 问题的根源,往往就在于数据的非易失存储没做好。在单片机里,我们程序里定义的变量都住在RAM里,一断电,RAM里所有数据就“清零”了,就像一场梦,醒了就没了。

那么,怎么让数据“记住”呢?这时候,内部EEprom就该登场了。它就像是芯片内置的一个“小本子”,专门用来记录那些需要长期保存、不怕掉电的关键信息。比如设备的唯一序列号、用户的自定义参数、系统累计运行时间、甚至是固件的版本号等等。相比外挂一个EEprom芯片,使用片内EEprom的好处显而易见:省空间、省成本、连线简单、驱动方便。尤其是对于成本敏感、PCB空间紧凑的产品,这个优势是决定性的。

不过,很多朋友刚开始接触STM32的内部EEprom时,可能只是简单调用HAL库的读写函数,觉得“能写进去、能读出来”就万事大吉了。我在早期项目里也这么干过,直到后来在现场吃了亏——有些设备在极端电压波动或强干扰环境下,偶尔会出现写入的数据出错,或者读出来的数据“变脸”了。这种偶发性的错误非常隐蔽,调试起来极其头疼。从那以后我才深刻意识到,对于关键数据,单纯的读写是远远不够的,必须有一套完善的校验机制来保驾护航。

所以,这篇文章我们不只讲“怎么用”,更要重点聊聊“怎么用得稳”。我会结合自己踩过的坑,带你用STM32HAL库,从零开始实现内部EEprom的读写,并重点剖析几种实用的数据校验机制,比如双读比对、写后即读验证,让你的数据存储真正做到“稳如泰山”。无论你是正在做毕业设计的学生,还是正在开发产品的工程师,相信这些实战经验都能让你少走弯路。

2. 动手前先“摸底”:你的STM32有内部EEprom吗?

在撸起袖子写代码之前,有一个特别关键的步骤,就是确认你手上的这块STM32芯片,到底有没有内部EEprom这个“硬件外挂”。这不是废话,因为并非所有STM32型号都内置了EEprom。

2.1 如何查阅芯片手册确认

STM32的家族非常庞大,从低功耗的L0/L1系列,到主流的F1/F4系列,再到高性能的H7系列,它们的存储结构设计各有不同。通常,STM32L0、L1、L4等低功耗系列,以及部分F2/F3/F4系列,是明确包含独立内部EEprom存储区的。而大家最熟悉的STM32F1系列,其内部Flash并没有划分出独立的EEprom区域,如果需要,就得用一部分主Flash来模拟EEprom,也就是我们常说的“Flash模拟EEPROM”,但这会带来擦写寿命和操作复杂度的不同。

怎么确认呢?最权威的方法就是查数据手册。这里我以手边的STM32L051C8T6为例,给大家演示一下。

  • 找到《STM32L051x8数据手册》(Datasheet)。这份文档主要讲芯片的电气特性、引脚定义和存储器映射。
  •  在目录里找到“Memory organization”(存储器组织)这一章。翻到对应页面,你会看到类似下面的描述:

Embedded SRAM: 8 Kbytes Embedded Flash memory: 64 Kbytes Data EEPROM: 512 bytes ... 这就明确告诉你,有512字节的独立数据EEprom。

  • 进一步查看《STM32L0xx参考手册》(Reference Manual)。这份文档讲的是编程模型。我们需要找到EEprom的起始地址。在参考手册的“Flash memory”章节里,通常会有一个存储器地址映射表。对于STM32L051,你会发现:
    • Flash主存储区地址:0x0800 0000 - 0x0800 FFFF<
http://www.jsqmd.com/news/569737/

相关文章:

  • AgentCPM-Report部署教程:Pixel Epic镜像免配置+GPU显存优化双实战
  • Qwen3-14B部署避坑指南:从环境配置到服务上线的完整流程
  • 零基础玩转AI绘画:WuliArt Qwen-Image Turbo快速入门指南
  • GLM-4.1V-9B-Base运维指南:高可用模型服务部署与监控实践
  • 终极视频修复指南:使用UNTRUNC快速恢复损坏的MP4/MOV文件
  • 最详细的京东超市卡快速回收指南,零风险变现! - 团团收购物卡回收
  • 3步解锁魔兽争霸III最佳体验:WarcraftHelper全方位优化工具指南
  • Blender USDZ插件终极指南:3步搞定AR模型导出
  • 3步告别网络依赖:用Tomato-Novel-Downloader打造个人小说图书馆的完整指南
  • WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具
  • 抖音批量下载工具全方位解析:从技术原理到企业级实战指南
  • 2026年口碑好的二手货车发动机源头厂家推荐 - 行业平台推荐
  • Asian Beauty Z-Image Turbo 生成原理浅析:与Matlab仿真对比理解扩散过程
  • 2026年口碑好的四川爬坡刮板输送机/四川模块链板输送机/模块链板输送机厂家口碑推荐 - 行业平台推荐
  • Mermaid Live Editor:终极免费的在线图表编辑器,让图表创作变得简单快速
  • Pixel Fashion Atelier惊艳效果:同一角色在5种Forge Scale下的皮装动态演化
  • 城通网盘限速破解:ctfileGet让下载效率提升10倍的技术革命
  • 安吉龙山源陵园联系方式查询:在规划人生后花园时如何结合文旅与生态需求进行综合考量 - 品牌推荐
  • 通义千问1.8B WebUI日志查看与故障排查技巧
  • 3分钟掌握B站视频下载:免费开源工具bilibili-downloader完整使用指南
  • 2026年质量好的立体库塑料托盘/田字塑料托盘精选公司 - 行业平台推荐
  • Windows 10 ltsc 以上系统安装starship
  • 7步构建个性化定制:Degrees of Lewdity中文整合包深度改造指南
  • 闪豆视频下载器 v20260329-B站抖音爱优腾多平台批量下载,画质自选速度快
  • 安吉龙山源陵园联系方式查询:一份关于其服务获取与人文纪念园背景的客观指南 - 品牌推荐
  • hCaptcha 验证服务 API 使用指南
  • wan2.1-vae提示词工程:中英文混合写作技巧与负面提示词避坑清单
  • BEYOND REALITY Z-Image vs 传统模型:在显存与画质间找到完美平衡
  • 2026年评价高的水池/帆布水池/果园蓄水池厂家精选 - 行业平台推荐
  • 原创分享:长图分割神器,让超长网页和聊天记录轻松打印