打印
[STM32F4]

STM32F4 备份SRAM使用

[复制链接]
747|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
观海|  楼主 | 2021-8-2 13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F4提供4KB的备份SRAM,在开发程序时可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持),特别是一些实时修改的,掉电不能丢失的数据,比如我用于存储雨量累计流量等实时变化的数据,定时存储到flash,实时存储到备份区(不能频繁的写flash),当备份区数据丢失了再从flash加载,否则每次都从备份区加载。

/*************************************************************************************************************
* 文件名                :        BackupSRAM.c
* 功能                        :        STM32F4 备份域SRAM驱动
* 作者                        :        cp1300@139.com
* 创建时间                :        2018-03-09
* 最后修改时间        :        2018-03-09
* 详细:                       
*************************************************************************************************************/       
#include "BackupSRAM.h"
#include "system.h"
#include "string.h"

#define BACKUP_SRAM_SIZE                (4*1024)                //备份SRAM大小

/*************************************************************************************************************************
* 函数                        :        bool BackupSRAM_Init(void)
* 功能                        :        备份域SRAM初始化
* 参数                        :        无
* 返回                        :        TRUE:成功,FALSE:失败
* 依赖                        :        底层宏定义
* 作者                        :        cp1300@139.com
* 时间                        :        2018-03-09
* 最后修改时间         :         2018-03-09
* 说明                        :        
*************************************************************************************************************************/
bool BackupSRAM_Init(void)
{
       
        RCC->APB1ENR|=1<<28;                                        //使能电源接口时钟
        PWR->CR|=1<<8;                                                        //后备区域访问使能(RTC+SRAM)
        SYS_DeviceClockEnable(DEV_BKP,TRUE);        //备份区SRAM使能
        RCC->AHB1LPENR |= BIT18;                                //睡眠模式期间的备份 SRAM 接口时钟使能
        PWR->CSR |= BIT9;                                                //使能备份调压器,不开启会导致备份SRAM掉电丢失-必须先使能时钟
       
        return TRUE;
}


/*************************************************************************************************************************
* 函数                        :        u16 BackupSRAM_WriteData(u16 AddrOffset, u8 *pData, u16 DataLen)
* 功能                        :        写入数据到备份SRAM中
* 参数                        :        AddrOffset:地址偏移,0-4KB范围;pData:要写入的数据;DataLen:要写入的数据长度
* 返回                        :        写入的数据长度
* 依赖                        :        底层宏定义
* 作者                        :        cp1300@139.com
* 时间                        :        2018-03-09
* 最后修改时间         :         2018-03-09
* 说明                        :         注意:地址偏移+写入的数据长度不能超过4KB
*************************************************************************************************************************/
u16 BackupSRAM_WriteData(u16 AddrOffset, u8 *pData, u16 DataLen)
{
        u32 len;
       
        if(pData==NULL) return 0;                                                                                        //无效的地址
        if(DataLen==0) return 0;                                                                                        //无效的数量
        if(AddrOffset >= BACKUP_SRAM_SIZE) return 0;                                                //起始地址有误
        len = AddrOffset + DataLen;       
        if(len > BACKUP_SRAM_SIZE) len = BACKUP_SRAM_SIZE;                                        //限制范围,只有4KB
        len -= AddrOffset;                                                                                                        //计算要写入的数据长度
        memcpy((u8 *)BKPSRAM_BASE+AddrOffset, pData, DataLen);
       
        return len;
}




/*************************************************************************************************************************
* 函数                        :        u16 BackupSRAM_ReadData(u16 AddrOffset, u8 *pData, u16 DataLen)
* 功能                        :        从备份SRAM中读取数据
* 参数                        :        AddrOffset:地址偏移,0-4KB范围;pData:要读取的数据缓冲区;DataLen:要读取的数据长度
* 返回                        :        读取的数据长度
* 依赖                        :        底层宏定义
* 作者                        :        cp1300@139.com
* 时间                        :        2018-03-09
* 最后修改时间         :         2018-03-09
* 说明                        :         注意:地址偏移+写入的数据长度不能超过4KB
*************************************************************************************************************************/
u16 BackupSRAM_ReadData(u16 AddrOffset, u8 *pData, u16 DataLen)
{
        u32 len;
       
        if(pData==NULL) return 0;                                                                                        //无效的地址
        if(DataLen==0) return 0;                                                                                        //无效的数量
        if(AddrOffset >= BACKUP_SRAM_SIZE) return 0;                                                //起始地址有误
        len = AddrOffset + DataLen;       
        if(len > BACKUP_SRAM_SIZE) len = BACKUP_SRAM_SIZE;                                        //限制范围,只有4KB
        len -= AddrOffset;                                                                                                        //计算要写入的数据长度
        memcpy(pData, (u8 *)BKPSRAM_BASE+AddrOffset, DataLen);
       
        return len;
}



使用特权

评论回复
沙发
观海|  楼主 | 2021-8-2 13:07 | 只看该作者
/*************************************************************************************************************
* 文件名                :        BackupSRAM.h
* 功能                        :        STM32F4 备份域SRAM驱动
* 作者                        :        cp1300@139.com
* 创建时间                :        2018-03-09
* 最后修改时间        :        2018-03-09
* 详细:                       
*************************************************************************************************************/       
#ifndef __BACKUP_SRAM_H_
#define __BACKUP_SRAM_H_
#include "system.h"


bool BackupSRAM_Init(void);                                                                                                //备份域SRAM初始化
u16 BackupSRAM_WriteData(u16 AddrOffset, u8 *pData, u16 DataLen);                //写入数据到备份SRAM中
u16 BackupSRAM_ReadData(u16 AddrOffset, u8 *pData, u16 DataLen);                //从备份SRAM中读取数据



#endif //__BACKUP_SRAM_H_



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

4103

帖子

1

粉丝