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

发布时间:2026/7/30 17:26:22

[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工程

相关新闻