说明:该方法为固定大小的数据包方式进行记录,写满一页后再擦除设定页从新记录,增加Flash使用寿命。
环境需求:Flash需要 可程序读写。
以STM32,中容量为例(HAL库方式)。
注意事项:避开程序空间,注意页的大小有的为1K,有的为2K按需分配。
简单说明:
以下表为例,主存储块 的 页255,0x0807 F800为地址的开始,0x0807 FFFF为地址的结束,大小为2K,2K的地址为0x800(0x0808 0000-0x0807 F800 = 0x800)区间。
程序流程图:
flash.h 文件内容:
#ifndef __FLASH_H
#define __FLASH_H
#include "main.h"
//flash存储地址
#define StartFlashAddress ((u32)0x0801f000) //读写起始地址
#define FLASH_DATA_GROUP_SIZE 28 //所有需要FLASH的数据字节大小,尽量凑双,
//地址结构体
typedef struct{
uint32_t Current_Write_Address;
uint32_t AddressTail_Sta;
}Flash_Def;
//Flash记录集
typedef struct{
uint16_t Set_Place_Point;
uint16_t Set_function;
uint16_t Set_Distance_Left;
uint16_t Set_Distance_Right;
uint16_t Set_BackLimit;
uint16_t Set_TurnLimit;
uint32_t WorkdayAlarmStartPoint;
uint32_t WorkdayAlarmStopPoint;
uint32_t DayOffAlarmStartPoint;
uint32_t DayOffAlarmStopPoint;
}Flash_Data;
//初始化 执行函数
void First_Launches_Flash_Process(void);
//大循环执行函数
uint16_t Auto_Write_Flash(void);
#endif /* __FLASH_H */
flash.c 文件内容:
#include "flash.h"
//用于传递所需的全局变量,用户自行更改
#include "main_combine.h"
#include "bsp_rtc.h"
//地址头
#define MEMORY_FLASH_START_ADDRESS 0x0803F800
//获取未地址 FLASH_PAGE_SIZE 库文件带有,如果没有就按照文章开头的计算公式计算
//FLASH_PAGE_SIZE / FLASH_DATA_GROUP_SIZE * FLASH_DATA_GROUP_SIZE取整运算计算,不能消消乐
#define MEMORY_FLASH_STOP_ADDRESS 0x0803F800 + FLASH_PAGE_SIZE / FLASH_DATA_GROUP_SIZE * FLASH_DATA_GROUP_SIZE
//Flash用户地址变量
Flash_Def Flash_SoftWare_REG;
//擦除出错地址记录
uint32_t ErasePageError_Addr;
//数据结构体,和用户数据一样大小
Flash_Data OldFlashData;
/**
* @功能 上电初始化数据记录。刷新所有事件
* @输入变量
* @输出变量
* @参数
*/
void OldFlashData_Init(void){
//我个人需要Flash的数据,用户按照自己的添加
OldFlashData.Set_Place_Point = Set_Place_Point;
OldFlashData.Set_function = Set_function;
OldFlashData.Set_Distance_Left = Set_Distance_Left;
OldFlashData.Set_Dista
标签:Set,FLASH,Flash,单片机,uint16,动态,uint32,SIZE
From: https://blog.csdn.net/bogu1992/article/details/140295959