单片机片上Flash数据存储以及数据跨平台存储代码

本存储代码占用Ram资源极少,不占用Flash用于存储数据的空间,采用存储空间循环使用方法达到延长flash使用寿命,还可用于E2PROM,外扩Flash等平台,不受数据结构类型限制。注意需要不掉电后备寄存器来保存当前正使用的存储数据地址和当前页数据存储个数的未使用量,大家也可根据自己需要稍作修改以适应不同的平台。

一、源代码:

//头文件,根据需要修改
#define FlashDAT_StarDress 0X08050000//Flash用于存储数据起始地址
#define FlashDAT_Count 5//存储区占用多少页
#define FlashPagesize  2048//页大小(具体平台)  檫除单位 2K
#define Flash_SmalSize_W  2//flash最小写入单位(具体平台)
#define Flash_SmalSize_R  2//flash最小读单位

 //第1个Size_Write--本页是否使用 数据从第2个Size_Write开始存储

/*

本函数用于对某个数据源的存储空间进行初始化,不需要初始化的成员就不用初始化,这些成员将在初始化函数中进行初始化,函数指针成员指向的函数需要根据具体存储平台来实现。

*/

typedef struct s_FlashSave //支持8位或16位数据读写 跨存储平台 
{
    my_u8  *pName;//数据名
    my_u8  *pDat;//要存储的数据源 数据结构类型不限
    my_u8  BkUpDatStar;//后备区数据起始寄存器
    my_u8  DatSize;//不初始化  数据大小(以最小写入字节数为单位) (存储数据结构大小/Flash_SmalSize_W  如果取余不为0则再+ Flash_SmalSize_W)//一个数据占用存储空间大小    
    my_u16 DatPageCount;//本数据源占用了几页 单位
    my_u16 pDatPage;//不初始化 当前运行占用页(上电推算)
    my_u16 pDatCcount;//不初始化 当前运行页数据剩余保存量(后备区保存)
    my_u32 DatSavStar;//保存本数据源的起始地址(防掉电 手动指定) 第一个字节=1,表示本页被占用 =2坏页,=3存储有数据
  my_u32 pDatDress;//数据保存的当前运行地址    (后备区保存)
--------------以下函数需要根据具体平台来实现---------------------
    void (*pFunFlash_W)(my_u32 Dress,my_u8 *pDate);//写数据 可给16位数据
    my_u16 (*pFunFlash_R)(my_u32 Dress);//读数据
    my_u8 (*pFunFlash_Erase)(my_u32 PageDress);//檫除整页 檫除成功返回1 失败返回0
    void (*pFunBkUpDat_W)(my_u8 BkUp_DRx,my_u16 Dat);//写数据到后备寄存器
    my_u16 (*pFunBkUpDat_R)(my_u8 BkUp_DRx);//读后备寄存器
    void (*pFunDatOut)(my_u16*);//数据输出函数
}sFlashSave;

/*

初始化函数,DatSize数据源数据结构大小,可用sizeo计算

*/

void Flash_DATSave_Init(sFlashSave *psFlashSave,my_u8 DatSize)//上电初始化 分配存储空间 DatSize数据源数据结构大小
{
    my_u32 pDress = psFlashSave->DatSavStar;//
    my_u16 n = 0;
    my_u16 date = 3;
    
    psFlashSave->DatSize = DatSize/Flash_SmalSize_W;//一次写入Flash_SmalSize_W字节
    if(DatSize%Flash_SmalSize_W) psFlashSave->DatSize ++;
    psFlashSave->pDatCcount = (FlashPagesize -Flash_SmalSize_W)/(psFlashSave->DatSize *Flash_SmalSize_W);
    psFlashSave->pDatPage = 1;
    
    if(psFlashSave->pFunBkUpDat_R(psFlashSave->BkUpDatStar)||
         psFlashSave->pFunBkUpDat_R(psFlashSave->BkUpDatStar +1))//上电从后备寄存器恢复写地址
    {
        psFlashSave->pDatDress  = psFlashSave->pFunBkUpDat_R(psFlashSave->BkUpDatStar);
        psFlashSave->pDatDress |= psFlashSave->pFunBkUpDat_R(psFlashSave->BkUpDatStar +1) <<16;
        psFlashSave->pDatCcount = psFlashSave->pFunBkUpDat_R(psFlashSave->BkUpDatStar +2);
        
        psFlashSave->pDatPage = (psFlashSave->pDatDress -psFlashSave->DatSavStar)/FlashPagesize +1;
        return;
    }
        
    //第一次上电
    if((pDress +psFlashSave->DatPageCount*FlashPagesize) >=(FlashDAT_StarDress +FlashDAT_Count*FlashPagesize))//超出数据存储空间
    {
        psFlashSave

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值