首页 > 其他分享 >单片机-Flash动态自保存

单片机-Flash动态自保存

时间:2024-07-09 15:56:45浏览次数:21  
标签:Set FLASH Flash 单片机 uint16 动态 uint32 SIZE

         说明:该方法为固定大小的数据包方式进行记录,写满一页后再擦除设定页从新记录,增加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

相关文章

  • 使用Hutool实现动态定时任务
    项目依赖首先,您需要在项目中添加Hutool库的依赖。可以在pom.xml中添加以下内容:<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>在实现动态定时任务之前,假设我们有一个名为Cron的......
  • 动态SQL
    mybatis中动态sql标签1:if标签  1)数值类型的判断不等于的判断://注意Interge类型的条件判断是否为空的时候一定不要加非空字符串判断,因为当你传的值为0的时候,mybatis会把它判断为空字符串<iftest="equipTypeId!=null">ANDt1.equip_type_id=#{equipTypeId......
  • 三星 NAND FLASH命名规范 Samsung NAND Flash Code Information
    一共有三页,介绍了前面主要的编号和横杠后面的编号,当前文档只关注前面的编号。从前面的命名规范中可以得知当前芯片的容量、技术等概要信息,对芯片有一个整体了解。详细解释SmallClassification表示存储单元的类型和应用,比如SLC1ChipXDCard表示是SLC的,包含1个Chip的XD......
  • Studying-代码随想录训练营day33| 动态规划理论基础、509.斐波那契函数、70.爬楼梯、7
    第33天,动态规划开始,新的算法......
  • 动态的线面位置关系
    前言本博文适合有一定立体几何基础的学生自学使用。典例剖析【2024高一数学必修二训练题】如图,已知正方体\(ABCD-A_1B_1C_1D_1\),点\(P\)在面对角线\(BC_1\)上运动,则下列四个结论:①三棱锥\(A-D_1PC\)的体积不变;②\(A_1P//\)平面\(ACD_1\);③\(DP\perpBC_1\);④平面......
  • 线性表——顺序表(动态分配)
    #include<bits/stdc++.h>usingnamespacestd;#defineInitSize5typedefstructSeqList{ int*data; //动态分配的数组指针 intlength; //数组当前个数 intMaxSize; //数组的最大容量}List;//动态分配的初始化voidInitList(List*L){ L->data=newint[InitSiz......
  • Quartz动态添加scheduler
    引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId><version>2.2.9.RELEASE</version></dependency>代码实现packagenet.evecom.iaplatfor......
  • 毕业设计:基于单片机的能耗分析系统
    写在前面笔者不才,过去一年中一半的时间在准备考研,博客园无心打理,显得荒芜了。到如今临近毕业,找的工作实事求是的讲也只是专业相关,并不完全对口,估计一段时间之内都没法亲自做开发了。虽然去的也是大公司,培养和各方面的保障都不错,但是对于学了四年技术(惭愧地说学的不算精深)的笔者来......
  • PE文件(八)静态与动态链接库
    本章内容为导入表和导出表的前置内容章节引入当我们需要重复使用一段代码时,我们可以将其定义成一个函数,每当使用这段代码时,直接调用函数即可但当我们进行多人大型项目时,一个人电脑上有一段代码需要另外很多人的电脑使用时,每次复制粘贴相应的代码到另外很多台电脑是很复杂的,......
  • LeetCode42(接雨水)[三种解法:理解动态规划,双指针,单调栈]
    接雨水给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。这是一道困难题,难度确实有点层次.我们先来朴素思想走一波.要求能接多少雨水,我们可以具化到每个硅谷,每个硅谷能存多少雨水,那么答案就是每个硅谷的雨水所加之和.对......