讲师中心 微信公众号
AI工具推荐 视频效率加速

C++在单片机上怎么通过模拟EEPROM在内置Flash中保存断电配置

云强君_2949

云强君_2949

发布时间:2026-10-20 14:31:30

|

403人浏览过

|

来源于php中文网

原创

应采用带状态标记与CRC校验的多槽位模拟EEPROM结构:在单扇区中划分多个固定大小槽位,每槽含状态标志、CRC32及配置数据;写入时查找空闲槽写新副本并作废旧槽,读取时遍历选取最新有效且校验通过者。

c++在单片机上怎么通过模拟eeprom在内置flash中保存断电配置

为什么不能直接用Flash地址写配置

单片机内置Flash擦写有硬性限制:必须按扇区擦除(比如STM32F1是1KB/扇区),而写入只能按字(32位)或半字(16位)进行,且写前必须确保目标地址已擦除为0xFF。直接把struct config memcpy到Flash地址会触发硬件异常或静默失败——因为没擦就写,或者跨了扇区边界。

更关键的是:Flash寿命通常只有1万~10万次擦写,而配置可能每分钟保存一次。必须避免频繁擦除同一扇区。

  • 每次保存前先判断值是否真有变化,跳过无意义写入
  • 用“页轮转”或“地址偏移+状态标记”实现多份副本,分散擦写压力
  • 禁止在中断上下文调用Flash写函数,必须关中断或确保调度安全

怎么设计一个带校验的模拟EEPROM结构

典型做法是在一个Flash扇区(如1KB)里划分多个固定长度的“槽位”,每个槽位存:1字节状态标志 + 4字节CRC32 + N字节配置数据。状态标志用0xAA表示有效、0x55表示已废弃、0xFF表示未使用。

写入时不是覆盖旧数据,而是找下一个空闲槽位写入新副本,并把旧槽位状态刷成0x55。读取时遍历所有槽位,选状态为0xAA且CRC校验通过的最新一份(靠地址递增顺序隐含时间戳)。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
// 示例槽位布局(每个槽位32字节)
struct eeprom_slot {
    uint8_t  flag;      // 0xAA = valid, 0x55 = invalid
    uint32_t crc;      // CRC32 of data[0..27]
    uint8_t  data[27]; // your config struct padded to 27 bytes
};
  • 槽位大小必须是Flash编程粒度的整数倍(如STM32F1要求32位对齐,即4字节)
  • CRC必须在写入前计算,且不能包含flag和crc自身字段
  • 首次初始化时,整个扇区需预先擦除,否则残留数据可能被误判为有效

STM32 HAL库下怎么安全擦除并写入Flash

HAL_FLASH_Unlock()之后必须立刻调用HAL_FLASHEx_Erase(),不能穿插其他操作;擦除完成前调用HAL_FLASH_Program()会失败。而且擦除是阻塞操作,F1系列1KB扇区约耗时20~40ms,必须预留足够时间窗口。

写入时务必检查返回值:HAL_OK不等于成功——要再用FLASH_WaitForLastOperation()确认,否则可能写到一半被中断打断导致数据错乱。

  • 擦除前用HAL_FLASHEx_EraseIsBusy()确认无后台操作
  • 写入每个字(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data))后都应检查返回值,非HAL_OK立即中止
  • 写完必须执行__DSB()和__ISB()指令,防止指令预取缓存读到旧值

掉电瞬间怎么避免配置写到一半变砖

没有超级电容或后备电源时,唯一可靠办法是:只在确定系统即将长期运行(比如开机自检完成、网络连通、用户点击“保存”)后再触发写入;绝不响应按键长按、串口指令等不可控事件的实时保存请求。

若必须支持断电保护,需配合电压监测(如STM32的VREFINT通道+比较器):当检测到VDD跌至某阈值(如2.8V),立刻置位“紧急保存标志”,然后在主循环中尽快完成当前写入并进入低功耗停机——但注意,此时Flash写操作本身耗电可能加速掉电,反而得不偿失。

  • 所有Flash操作前后加__disable_irq()/__enable_irq(),防中断打断擦写序列
  • 写入前把配置数据memcpy到RAM静态缓冲区,避免写过程中原结构被修改
  • 实际产品中建议保留至少2个完整扇区:一个主区,一个备份区,主区损坏时可从备份恢复

真正的难点不在代码怎么写,而在如何定义“配置变更”的语义边界——比如Wi-Fi密码改了必须存,但信号强度这种动态值绝不能存。这个逻辑漏掉,再健壮的Flash模拟层也救不回反复擦坏的扇区。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2248

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1019

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

406

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1409

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1217

2024.03.22

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

80

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
linux嵌入式开发+驱动开发视频教程
linux嵌入式开发+驱动开发视频教程

共39课时 | 9.5万人学习

JavaScript OOP调试技巧视频教程
JavaScript OOP调试技巧视频教程

共5课时 | 1.1万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn