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

目录

一、前言

二、实现步骤

1.STM32CUBEMX配置

2.导入Flash库

3.分析地址范围

4.找到可用的地址

5.写入读取普通数据

6.写入读取字符串

[6.1 存储相关信息](#6.1 存储相关信息)

[6.2 存取多个参数](#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类型数据。

cs 复制代码
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"并读取出来。

cs 复制代码
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读取字符串,并进行数据分割,即可实现去除数据的效果(这段代码就是头文件最后的数据分割代码)。

cs 复制代码
//存取多个参数
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工程

相关推荐
FreakStudio2 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
EVERSPIN5 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh5 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
芯橦8 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
Evand J11 小时前
物联网智能设备:未来生活的变革者
人工智能·物联网·智能手机·智能家居·智能手表
夜间去看海12 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu12 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白12 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_13 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人13 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc