[STM32-HAL库]Flash库-HAL库-复杂数据读写-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C6T6 目录一、前言二、实现步骤1.STM32CUBEMX配置2.导入Flash库3.分析地址范围4.找到可用的地址5.写入读取普通数据6.写入读取字符串6.1 存储相关信息6.2 存取多个参数三、总结及源码一、前言在面对需要持久化存储的数据时除了挂载TF卡我们能用到的最方便的方法就是将数据粗存入Flash比如存储密码、存储记录等。本文中的Flash库由我开发具有存取和写出各类型数据和字符串的功能。二、实现步骤1.STM32CUBEMX配置此处正常配置相关参数本文使用STM32F103C6T6时钟频率为72MHzFlash操作无需配置其他参数。2.导入Flash库下载并解压压缩包可以得到一个.c文件和.h文件将其导入到工程中此处简单就不再赘述不会的话可以看之前的文章。3.分析地址范围要写入Flash我们必须知道要写入的内存地址以STM32F103C8T6为例依照下图的命名规则可知其Flash大小为64K根据计算64*1024-165535其对应的十六进制是0xFFFF加上起始地址0x0800 0000可知其Flash地址范围为0x0800 0000-0x0800 FFFF在实际开发中如果我们使用了不同的芯片比如本文使用STM32F103C6T6那么其地址范围也不同其地址范围是0x0800 0000~0x0800 7FFF如果我们向0x0800 E000去写入数据那必然不会成功读取亦然。4.找到可用的地址其实即使我们分析出地址范围是0x0800 0000~0x0800 7FFF但这里边的地址并非全部可用的比如程序编译后如下图烧写进去是会占用一部分地址的因此你需要把考虑进去本文就不做论述了有兴趣可以去其他地方查一查如果有时间我也会出一篇文章说一下这个部分。5.写入读取普通数据打开flash.h可以看到我封装了很多函数。当然还有一部分数据分割代码这个稍后再介绍。从声明中我们可以知道如何存储和读取uint8、uint16类型的数据。写入并读取uint8_t类型数据。uint8_t data_1A; Earse_Page(0x08006000,1);//擦除 Write_uint8(0x08006000,data_1); data_1Read_uint8(0x08006000);6.写入读取字符串6.1 存储相关信息本库完成了对字符串的读写操作以地址0x0800 7000为例写入字符串“ABC”并读取出来。uint8_t data[50]; memset(data,\0,50); sprintf((char *)data,ABC\n); STMFLASH_Write(0x08007000,data,50); memset(data,\0,50); STMFLASH_Read(0x08007000,data,50); HAL_UART_Transmit(huart1,data,50,1000);6.2 存取多个参数通过这种办法其实我们可以一次存取多个参数信息例如我将生成四个float类型的参数将其转换成字符串其中以固定字符分割随后每次启动时从flash读取字符串并进行数据分割即可实现去除数据的效果这段代码就是头文件最后的数据分割代码。//存取多个参数 memset(data,\0,50); sprintf((char *)data,%.2f,%.2f,%.2f,%.2f,temp,hum,water,ch4); STMFLASH_Write(0x08007000,data,50); STMFLASH_Read(0x08007000,data,50); tempatof(strtok((char *)data,,)); humatof(strtok(NULL,,)); wateratof(strtok(NULL,,)); ch4atof(strtok(NULL,,)); sprintf((char *)data,%.2f,%.2f,%.2f,%.2f,temp,hum,water,ch4); HAL_UART_Transmit(huart1,data,50,1000);三、总结及源码文章至此已经完成Flash的各类操作需要注意的是存储单个类型的数据时需要先执行擦除操作不擦除无法写入。而存储字符串时不需要因为在字符串函数内我已经写了擦除函数直接调用即可。同时本文也通过字符串读写为大家提供了一种存储参数的方案。库文件Flash-HAL库文件-字符串读写本文工程Flash-HAL库-STM32CUBEMX工程

相关新闻

最新新闻

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现

SerenityOS 命令行选项解析指南:getopt 与 getopt_long 用法、返回值与底层实现 【免费下载链接】serenity The Serenity Operating System 🐞 项目地址: https://gitcode.com/GitHub_Trending/se/serenity 导读 本文以 getopt(3) 手册 为核心&a…

2026/10/6 14:10:51
轻量服务器还是ECS?大促云服务器选购与避坑实战指南

轻量服务器还是ECS?大促云服务器选购与避坑实战指南

每年大促节点,群里永远有人在问同一个问题:“38元的轻量服务器到底怎么抢?为什么我每次点进去都是已售罄?68元直购和99元的ECS我到底选哪个?”作为一个常年帮团队和自己采购云服务器的老用户,我太清楚这种纠…

2026/10/6 12:50:27
为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南

为 AI 代理的 Review 动作编写 Cedar 审批门控策略:review-agent-governance 策略编写实战指南 【免费下载链接】agents Multi-harness agentic plugin marketplace for Claude Code, Codex, Cursor, OpenCode, GitHub Copilot, and Google Antigravity 项目地址:…

2026/10/5 19:39:38
PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署

PaddleOCR 手写数学公式识别算法 CAN 实战指南:Counting-Aware Network 训练、评估与推理部署 【免费下载链接】PaddleOCR Turn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between i…

2026/10/5 16:06:34
Spring源码解析:构造器注入的类型转换与候选匹配机制

Spring源码解析:构造器注入的类型转换与候选匹配机制

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

2026/10/6 12:44:38
openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由

openai-agents-python 多模型接入指南:深入解析 AnyLLMModel 适配层与 any-llm 路由 【免费下载链接】openai-agents-python A lightweight, powerful framework for multi-agent workflows 项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-pyth…

2026/10/6 12:38:14

日新闻

周新闻

月新闻