news 2026/7/30 17:26:08

[STM32-HAL库]Flash库-HAL库-复杂数据读写-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C6T6

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[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,时钟频率为72MHz,Flash操作无需配置其他参数。

2.导入Flash库

下载并解压压缩包,可以得到一个.c文件和.h文件,将其导入到工程中,此处简单就不再赘述,不会的话可以看之前的文章。

3.分析地址范围

要写入Flash,我们必须知道要写入的内存地址,以STM32F103C8T6为例,依照下图的命名规则可知其Flash大小为64K,根据计算,(64*1024)-1=65535,其对应的十六进制是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_1='A'; Earse_Page(0x08006000,1);//擦除 Write_uint8(0x08006000,data_1); data_1=Read_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); temp=atof(strtok((char *)data,",")); hum=atof(strtok(NULL,",")); water=atof(strtok(NULL,",")); ch4=atof(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工程

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 17:24:54

Keil 中配置 SysConfig(MSPM0)

Keil 中配置 SysConfig(MSPM0) 本文使用下面的安装路径: Keil:D:\develop\Keil_v5 SysConfig:D:\develop\ti\sysconfig_1.28.0 MSPM0 SDK:D:\develop\ti\mspm0_sdk_2_11_00_07如果软件装在其他位置&#xf…

作者头像 李华
网站建设 2026/7/30 17:20:44

BBWEYY 电商商家低成本获客转化解决方案:电商卖家如何用 GEO 与小程序替代部分高成本投流,含零代码SAAS、AI编程、源码定制交付

电商卖家如何用 GEO 与小程序替代部分高成本投流 摘要 在平台电商经营持续承压的背景下,电商商家普遍面临投流成本高、平台抽成高以及行业准入规则收紧等多重挑战。本文采用说明文风格,对这些问题进行拆解,并结合 BBWEYY 提供的 GEO 获客服…

作者头像 李华
网站建设 2026/7/30 17:14:57

Windows风扇控制终极配置:从新手到高手的完整教程

Windows风扇控制终极配置:从新手到高手的完整教程 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fan…

作者头像 李华