发布时间:2026/9/6 8:32:23
单片机基础核心知识点汇总(三十) 目录前言一、Flash 基础核心特性二、Flash 分区规划IAP 必备三、Flash 基础读写代码四、参数掉电存储工程方案五、IAP 固件升级 Flash 操作逻辑六、Flash 开发高频坑点七、Flash 寿命优化策略小结前言本篇我们攻克嵌入式量产开发核心存储能力 —— 片内 Flash 操作。几乎所有量产设备都离不开 Flash 应用设备参数掉电保存、校准数据存储、日志记录、OTA 固件升级、开机配置固化。很多新手对 Flash 认知只有简单读写实际项目中频繁遇到各种疑难问题 直接写 Flash 不擦除导致写入失败频繁擦写损耗 Flash 寿命跨扇区存储数据异常IAP 分区规划不合理引发固件覆盖程序运行时擦 Flash 造成卡死。Flash 有一条铁则只能将 bit1 改成 bit0不能直接把 bit0 改成 bit1想要恢复 bit1必须执行扇区擦除。一、Flash 基础核心特性存储单元最小操作按半字 / 字 / 双字写入按扇区擦除擦除后扇区所有数据为 0xFF擦写次数有上限STM32 片内 Flash 一般万次级别程序运行时可读写同芯片 Flash但擦写期间禁止访问被操作扇区代码掉电瞬间操作 Flash极易造成存储数据损坏二、Flash 分区规划IAP 必备以 512KB Flash 芯片举例0x08000000 ~ 0x08002FFFBootloader 分区IAP 升级引导程序0x08003000 ~ 0x0800BFFFApp 分区设备业务主程序0x0800C000 ~ 0x0800CFFF参数存储分区保存配置、校准参数业务代码和参数分区物理隔离升级固件不会覆盖设备配置三、Flash 基础读写代码#include stm32f10x.h //Flash擦除单个扇区 uint32_t Flash_EraseSector(uint32_t addr) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); uint32_t ret FLASH_ErasePage(addr); FLASH_Lock(); return ret; } //写入半字2字节 uint32_t Flash_WriteHalfWord(uint32_t addr, uint16_t data) { FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); uint32_t ret FLASH_ProgramHalfWord(addr, data); FLASH_Lock(); return ret; } //批量写入多字节数据 uint32_t Flash_WriteBuf(uint32_t start_addr, uint8_t *buf, uint16_t len) { uint16_t i 0; uint32_t res; if(len % 2 ! 0) return 1; while(i len) { uint16_t temp (buf[i1] 8) | buf[i]; res Flash_WriteHalfWord(start_addr i, temp); if(res ! FLASH_COMPLETE) return res; i 2; } return FLASH_COMPLETE; } //读取Flash数据直接指针访问 uint8_t Flash_ReadByte(uint32_t addr) { return *(volatile uint8_t*)addr; }四、参数掉电存储工程方案不要每次修改参数就擦写 Flash频繁擦写快速损耗寿命。方案内存缓存参数定时保存 / 修改确认后再写入 Flash。#define PARAM_ADDR 0x0800C000 typedef struct { uint16_t para1; uint16_t para2; uint32_t crc; }param_t; param_t g_param_cache; //保存参数到Flash void Param_Save(void) { Flash_EraseSector(PARAM_ADDR); g_param_cache.crc crc16_calc((uint8_t*)g_param_cache, sizeof(param_t)-4); Flash_WriteBuf(PARAM_ADDR, (uint8_t*)g_param_cache, sizeof(param_t)); } //开机加载参数 void Param_Load(void) { param_t *p (param_t *)PARAM_ADDR; uint16_t crc_check crc16_calc((uint8_t*)p, sizeof(param_t)-4); if(crc_check p-crc) { memcpy(g_param_cache, p, sizeof(param_t)); } else { //校验失败加载默认参数 g_param_cache.para1 100; g_param_cache.para2 200; } }增加 CRC 校验防止掉电半写导致参数损坏。五、IAP 固件升级 Flash 操作逻辑Bootloader 运行检测是否存在新固件将收到的固件包写入 App 备份 Flash 分区固件全部接收完成校验整个固件 CRC校验通过擦除原 App 分区将备份固件拷贝到 App 区域跳转 App 程序校验失败保留旧程序不执行覆盖六、Flash 开发高频坑点忘记解锁 Flash直接擦写操作全部失败不做 CRC 校验掉电中断写入参数变成乱码循环频繁擦写同一扇区Flash 提前磨损失效擦写 Flash 时代码在当前扇区运行程序直接 HardFault地址没有对齐写入半字 / 字时报错分区规划重叠升级时误擦除 Bootloader设备变砖七、Flash 寿命优化策略减少擦除次数参数改动批量一次性写入循环轮换多个备份扇区分散擦写压力重要参数做双备份A 扇区主存B 扇区备用禁止在循环内反复执行 Flash 擦写小结片内 Flash 操作核心就三点遵守硬件读写规则、合理分区、增加校验与备份机制。单纯读写只是基础量产项目重点在于保护数据安全、控制擦写损耗避免设备变砖与参数丢失。

相关新闻

2026/9/6 8:27:23

别让Agent空转:从常驻VM到按需算力的成本优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 8:27:23

从零落地反向代购站点:0代码轻量化建站技术方案复盘

很多零基础开发者、跨境创业者想要入局反向海淘赛道,却被传统建站模式劝退。在固有认知里,搭建一套功能完整的跨境独立站,需要前端页面开发、后端逻辑部署、服务器配置、功能迭代开发等一系列专业技术操作,不仅门槛高,…

2026/9/6 11:02:33

ARM可信固件ATF深度拆解:源码架构、安全审计与移植实战

聊ATF(Arm Trusted Firmware,现在更多叫 TF-A)之前,我先说个事。最近在帮客户做新平台 bring-up,一位做内核的老手问我:我们的 U-Boot 都从存储介质里跑起来了,为什么还非要先跑一段什么 BL31&a…

2026/9/6 11:02:33

板厚如何在线监控?解析Bamtone L系列非接触式激光测量黑科技

在CCL覆铜板生产和PCB压合环节,板材的板厚一致性直接影响后面工序。作为国内领先的PCB测控仪器专业解决方案供应商,班通科技推出的Bamtone L系列板厚测量设备(自动板厚测试机Bamtone L750A、长臂板厚测量仪Bamtone L550/L550P)&am…

2026/9/6 11:02:33

CATIA参数化设计核心配置与工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:02:33

MATLAB实现SNN-LSTM组合模型的时间序列预测实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/6 11:02:33

STM32选型指南:八大系列对比与实战决策方法

做嵌入式这行,总有人问我:“STM32那么多型号,到底该用哪颗?”问这话的既有刚入门的在校学生,也有要定方案的硬件工程师。说实话,打开ST官网的选型页面,光是STM32的型号就有上千个,从…

2026/9/6 10:57:33

低功耗AI宠物摄像头设计:从电池续航一天到三十天的实战

开头把AI摄像头塞进宠物喂食器、智能猫砂盆或者独立的小夜灯里,听起来不算难,但真正动手做之后我才发现,难点根本不在“能不能识别猫”,而在“不插电的情况下能撑几天”。宠物硬件和手机、家用摄像头不一样,猫窝周围不…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/5 2:45:13

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…