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

STM32F103的Flash读写,你踩过这几个坑吗?从解锁失败到数据错乱的避坑实录

STM32F103的Flash读写你踩过这几个坑吗从解锁失败到数据错乱的避坑实录第一次在STM32F103上操作Flash时我天真地以为这不过是几个寄存器配置和地址访问的问题。直到深夜调试时遇到第一个HardFault我才意识到自己掉进了开发者们前赴后继踩过的那些坑。本文将带你直击五个最典型的Flash操作陷阱每个问题都配有真实调试场景还原和解决方案。1. 解锁序列的隐藏陷阱很多开发者拿到参考代码后会直接复制那段经典的解锁序列FLASH-KEYR 0x45670123; // KEY1 FLASH-KEYR 0xCDEF89AB; // KEY2但在实际项目中我遇到过三种解锁失败的情况时序问题在72MHz主频下两次写入间隔小于2个时钟周期会导致解锁无效中断打断如果在两次写KEYR之间发生了中断可能破坏解锁流程寄存器保护未先清除FLASH_SR寄存器的错误标志位直接解锁可靠的解锁方案应该这样实现// 先清除所有错误标志 FLASH-SR FLASH_SR_PGERR | FLASH_SR_WRPRTERR | FLASH_SR_EOP; // 确保总线空闲 while(FLASH-SR FLASH_SR_BSY); // 严格时序的解锁序列 __disable_irq(); FLASH-KEYR 0x45670123; __DSB(); // 数据同步屏障 FLASH-KEYR 0xCDEF89AB; __enable_irq();提示使用__DSB()指令确保写入顺序这在Cortex-M3内核上是必要的内存屏障2. 跨页写入的数据丢失之谜当我们需要写入跨越Flash页边界的数据时常见的错误做法是// 错误示例假设数据跨越了0x08007FFF-0x08008000边界 uint32_t data[128]; Internal_WriteFlash(0x08007F00, data, 128);这种操作会导致两个严重问题后半个数据会覆盖下一页起始位置的内容若目标页未提前擦除部分数据会写入失败正确的跨页写入流程步骤操作注意事项1计算数据起始页和结束页使用FLASH_PAGE_SIZE宏2检查并擦除所有相关页必须按页顺序擦除3分页写入数据每页写入前检查剩余空间对应的代码实现void Safe_WriteMultiPage(uint32_t addr, uint32_t* data, uint32_t len) { uint32_t first_page addr / FLASH_PAGE_SIZE; uint32_t last_page (addr len*4 - 1) / FLASH_PAGE_SIZE; FLASH_Unlock(); for(uint32_t pagefirst_page; pagelast_page; page) { FLASH_ErasePage(FLASH_BASE page*FLASH_PAGE_SIZE); while(FLASH-SR FLASH_SR_BSY); } uint32_t offset 0; for(uint32_t i0; ilen; i) { if((addr offset) (FLASH_BASE (first_page1)*FLASH_PAGE_SIZE)) { first_page; } FLASH_ProgramWord(addr offset, data[i]); offset 4; while(FLASH-SR FLASH_SR_BSY); } FLASH_Lock(); }3. 中断打断Flash操作的灾难现场Flash操作期间如果发生中断可能导致两种严重后果操作失败编程或擦除过程被中断Flash进入错误状态死机某些情况下会直接触发HardFault通过示波器捕捉到的典型异常时序|-- Flash操作开始 --|-- 中断触发 --|-- 操作异常终止 --| |------- 72MHz时钟 -------|----- 中断服务 -----|解决方案的三种实现方式全局关闭中断简单粗暴__disable_irq(); // Flash操作 __enable_irq();优先级控制推荐NVIC_SetPriority(SysTick_IRQn, 0); // 设置关键中断为最高优先级 NVIC_SetPriority(EXTI0_IRQn, 1); // 设置其他中断优先级状态机管理复杂系统适用typedef enum { FLASH_IDLE, FLASH_BUSY } FlashState; FlashState flash_state FLASH_IDLE; void TIM2_IRQHandler() { if(flash_state FLASH_BUSY) { // 延迟处理 return; } // 正常中断处理 }注意USB、CAN等外设中断特别容易打断Flash操作需要特别关注4. 程序空间与数据空间的边界战争很多开发者会忽略.map文件的重要性导致意外覆盖程序代码。我曾遇到一个案例开发者将数据存储在0x08003000位置结果随机出现程序跑飞原因就是这个地址实际上存储了部分代码。正确的空间规划方法查看生成的.map文件定位程序占用的实际空间Memory Map of the image Execution Region ROM_LOAD (Base: 0x08000000, Size: 0x00004a00) Execution Region ROM_EXEC (Base: 0x08000000, Size: 0x00004920)计算安全的数据存储地址#define APP_END_ADDR 0x08004920 // 来自.map文件 #define FLASH_DATA_START ((APP_END_ADDR FLASH_PAGE_SIZE - 1) ~(FLASH_PAGE_SIZE-1))使用编译器特性指定存储位置IAR示例#pragma locationFLASH_DATA const uint32_t config_data[128];不同容量STM32的Flash分布对比型号类别页大小总页数典型型号小容量1KB16-32STM32F103C8中容量1KB64-128STM32F103RE大容量2KB128-256STM32F103ZE5. 数据错乱的元凶未检查状态标志一个容易被忽视的细节是Flash操作后的状态检查。以下是常见的错误模式FLASH_ProgramWord(addr, data); // 直接继续后续操作正确的做法应该包含完整的状态检查FLASH_Status status FLASH_ProgramWord(addr, data); if(status ! FLASH_COMPLETE) { // 错误处理流程 FLASH_ClearFlag(FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); return false; }Flash状态标志的完整处理指南PGERR编程错误通常因电压不稳WRPRTERR写保护错误尝试写入保护区域EOP操作完成可用于触发DMA请求BSY忙状态任何操作前必须检查典型的错误处理流程读取FLASH_SR寄存器记录错误类型可用于故障诊断清除错误标志否则后续操作会失败根据错误类型采取恢复措施void Handle_FlashError(void) { uint32_t sr FLASH-SR; if(sr FLASH_SR_PGERR) { log_error(Programming error detected); } if(sr FLASH_SR_WRPRTERR) { log_error(Write protection error); } FLASH-SR FLASH_SR_PGERR | FLASH_SR_WRPRTERR | FLASH_SR_EOP; // 必要时执行系统复位 if(sr (FLASH_SR_PGERR | FLASH_SR_WRPRTERR)) { NVIC_SystemReset(); } }在真实项目中我发现最稳妥的做法是在每次Flash操作后都加入状态检查虽然增加了代码量但可以避免许多难以调试的随机性错误。特别是在电池供电设备中电压波动导致的Flash错误更需要严格检测。

相关文章:

STM32F103的Flash读写,你踩过这几个坑吗?从解锁失败到数据错乱的避坑实录

STM32F103的Flash读写,你踩过这几个坑吗?从解锁失败到数据错乱的避坑实录 第一次在STM32F103上操作Flash时,我天真地以为这不过是几个寄存器配置和地址访问的问题。直到深夜调试时遇到第一个HardFault,我才意识到自己掉进了开发者…...

终极图像分层神器:如何用Layerdivider一键生成专业PSD分层文件

终极图像分层神器:如何用Layerdivider一键生成专业PSD分层文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾经面对一张精美的插画…...

如何高效解决ComfyUI ControlNet Aux插件模型下载失败问题:完整配置指南

如何高效解决ComfyUI ControlNet Aux插件模型下载失败问题:完整配置指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux ComfyUI ControlNet A…...

别再只用Excel画图了!用GraphPad Prism处理‘性别+药物’双因素实验数据的完整攻略

GraphPad Prism双因素实验数据分析:从数据整理到科学图表 在生物医学研究中,双因素实验设计(如性别药物处理)能帮助我们探索变量间的交互作用,但这类数据的可视化常常让研究者头疼——如何在有限图表空间中清晰呈现多重比较结果?传…...

从思维链到思维图:大语言模型推理范式的跃迁与实践

1. 项目概述:从“思维链”到“思维图”的范式跃迁如果你最近在关注大语言模型(LLM)的应用前沿,特别是如何让它们更可靠、更聪明地解决复杂问题,那么“思维链”(Chain-of-Thought, CoT)这个概念你…...

【2026奇点大会闭门报告】:为什么92.7%的AI服务因API契约缺陷在上线30天内降级?

更多请点击: https://intelliparadigm.com 第一章:AI原生API设计规范:2026奇点智能技术大会接口设计最佳实践 AI原生API不再是对传统REST的简单增强,而是以模型能力为第一公民、推理上下文为默认契约、语义完整性为校验基准的全新…...

ClawPanel:AI Agent统一管理面板,内置智能助手实现自动化运维

1. 项目概述与核心价值 如果你正在寻找一个能帮你统一管理 OpenClaw 和 Hermes Agent 这两个热门 AI Agent 框架的工具,并且希望这个工具本身也足够智能,能帮你解决安装、配置、排障等一系列繁琐问题,那么 ClawPanel 就是你一直在等的那个“…...

ModTheSpire终极指南:深入解析杀戮尖塔模组加载器核心架构

ModTheSpire终极指南:深入解析杀戮尖塔模组加载器核心架构 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire是一款专为《杀戮尖塔》游戏设计的专业级模组加载器&…...

告别多个客户端!用DBeaver企业版一站式管理Hive、Impala、Redis等5种数据源(附驱动下载与配置避坑)

数据工程师的效率革命:DBeaver企业版全栈数据源管理实战指南 在数据驱动的时代,工程师们每天需要面对的是散落在不同平台、不同协议下的数据孤岛。从传统的关系型数据库到新兴的NoSQL存储,从大数据分析引擎到内存数据库,每种数据源…...

2026 AI工厂基础设施展望:HVDC供电与全液冷趋势

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

【AI原生推荐系统实战白皮书】:2026奇点大会3大核心架构、5类实时特征工程陷阱与7天落地部署清单

更多请点击: https://intelliparadigm.com 第一章:AI原生推荐系统:2026奇点智能技术大会个性化推荐实战 在2026奇点智能技术大会上,主办方首次部署了端到端AI原生推荐系统(AI-Native Recommendation Engine, ANRE&…...

人工智能逻辑复兴与全球教育变革战略提案

人工智能逻辑复兴与全球教育变革战略提案摘要: 本提案基于贾子哲学,提出《人工智能逻辑复兴支持计划》,终结暴力计算与数据殖民,以“真理硬度”“语义主权”为核心,推动算力霸权降级与公理化革命。分析产业界将经历“物…...

从PIL到Tensor:用PyTorch transforms完整走一遍图像预处理流水线(附可视化对比图)

从PIL到Tensor:用PyTorch transforms完整走一遍图像预处理流水线(附可视化对比图) 当你第一次用PyTorch训练图像分类模型时,是否遇到过这样的困惑:明明代码能跑通,但模型效果总是不理想?问题很可…...

终极视频下载解决方案:Simple Video Download Helper 完全使用指南

终极视频下载解决方案:Simple Video Download Helper 完全使用指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否经常遇到…...

终极指南:3步掌握《塞尔达传说:旷野之息》存档编辑器,打造完美游戏体验

终极指南:3步掌握《塞尔达传说:旷野之息》存档编辑器,打造完美游戏体验 【免费下载链接】BOTW-Save-Editor-GUI A Work in Progress Save Editor for BOTW 项目地址: https://gitcode.com/gh_mirrors/bo/BOTW-Save-Editor-GUI 你是否曾…...

从接入到观测 Taotoken 为开发者提供的全链路体验

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从接入到观测 Taotoken 为开发者提供的全链路体验 对于开发者而言,将大模型能力集成到自己的应用或项目中,…...

3步实现企业级智能地址解析:Java开发者的终极效率提升指南

3步实现企业级智能地址解析:Java开发者的终极效率提升指南 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 在电商、物流、外卖等数字化业务高速发展的今天,地址解析已成为…...

Beyond Compare 5授权机制深度解析:如何构建一个完整的密钥生成系统

Beyond Compare 5授权机制深度解析:如何构建一个完整的密钥生成系统 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen Beyond Compare 5作为一款专业的文件对比工具,其授权…...

SITS 2026对话系统设计避坑手册:12个已上线项目踩过的“隐性状态泄漏”案例与自动检测脚本

更多请点击: https://intelliparadigm.com 第一章:AI原生对话系统设计:SITS 2026聊天机器人架构解析 SITS 2026(Semantic-Intelligent Turn-Synchronized)代表新一代AI原生对话系统范式,其核心突破在于将…...

别再让低通滤波器坑了你!PMSM滑模观测器位置估算的相位补偿实战(附Simulink模型)

永磁同步电机无感控制中的相位补偿实战:从理论到Simulink实现 在永磁同步电机(PMSM)无速度传感器控制领域,滑模观测器因其强鲁棒性成为工程实践中的热门选择。然而,当工程师们兴奋地搭建完仿真模型后,常常会遇到一个令人头疼的现象…...

Faster-Whisper-GUI终极指南:免费开源的AI语音转文字工具,轻松实现高质量音频转录

Faster-Whisper-GUI终极指南:免费开源的AI语音转文字工具,轻松实现高质量音频转录 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 还在为会议录音整理而…...

从零到一:单总线CPU硬布线控制器设计与三级时序系统实战解析(Logisim Educoder)

1. 单总线CPU硬布线控制器设计入门 第一次接触单总线CPU设计时,我完全被各种专业术语搞晕了。直到在Logisim里亲手搭建电路,才真正理解硬布线控制器的精妙之处。简单来说,硬布线控制器就像CPU的"交通警察",它通过硬件电…...

新手避坑指南:用STC89C52和L298N驱动模块搞定智能小车的第一步(附完整代码)

51单片机智能小车实战:从硬件搭建到代码调试的避坑手册 第一次尝试用STC89C52和L298N驱动模块制作智能小车时,我遇到了无数令人抓狂的问题——电机突然反转、PWM信号不稳定、电源莫名其妙发热。这些问题消耗了我整整三个周末的时间。本文将分享那些教程里…...

IMDB-WIKI人脸数据集:从数据爬取到年龄标注的完整解析

1. IMDB-WIKI数据集概览 IMDB-WIKI人脸数据集是目前最大规模的公开人脸年龄识别数据集之一,包含超过52万张名人面部图像。这个数据集最初由瑞士苏黎世联邦理工学院(ETH Zurich)计算机视觉实验室发布,主要用于年龄估计和性别识别的…...

AIMAXXING:基于Rust的Windows本地AI智能体运行时架构解析

1. 项目概述:一个为Windows而生的本地优先AI智能体运行时如果你和我一样,是个对AI技术充满热情,但又对当前市面上那些要么过于复杂、要么隐私堪忧的AI工具感到头疼的开发者或技术爱好者,那么你可能会对AIMAXXING这个项目产生兴趣。…...

SITS 2026真能替代初级工程师?——基于37个真实项目场景的代码生成质量压力测试(附GitHub可复现评测脚本)

更多请点击: https://intelliparadigm.com 第一章:AI原生代码生成工具:SITS 2026智能编程助手对比评测 SITS 2026 是一款面向企业级开发场景的 AI 原生编程助手,深度集成于 VS Code、JetBrains IDE 及云端 CI/CD 流水线中。其核心…...

如何永久保存微信聊天记录?WeChatMsg帮你实现数据自主掌控

如何永久保存微信聊天记录?WeChatMsg帮你实现数据自主掌控 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…...

SingleFile:一键保存完整网页,打造永不丢失的数字图书馆

SingleFile:一键保存完整网页,打造永不丢失的数字图书馆 【免费下载链接】SingleFile Web Extension for saving a faithful copy of a complete web page in a single HTML file 项目地址: https://gitcode.com/gh_mirrors/si/SingleFile 你是否…...

如何为你的Nextjs应用快速添加Taotoken大模型对话功能

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 如何为你的Nextjs应用快速添加Taotoken大模型对话功能 1. 项目准备与环境变量配置 在开始集成之前,你需要一个可运行的…...

QrScan:基于微信开源算法的离线二维码批量检测识别系统架构解析

QrScan:基于微信开源算法的离线二维码批量检测识别系统架构解析 【免费下载链接】QrScan 离线批量检测图片是否包含二维码以及识别二维码 项目地址: https://gitcode.com/gh_mirrors/qrs/QrScan 在数字化内容安全管理领域,二维码检测已成为企业级…...