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;
}
|