STM32F4 备份SRAM使用

STM32F4提供4KB的备份SRAM,在开发程序时可以用于存储掉电不丢失的数据(需要RTC纽扣电池支持),特别是一些实时修改的,掉电不能丢失的数据,比如我用于存储雨量累计流量等实时变化的数据,定时存储到flash,实时存储到备份区(不能频繁的写flash),当备份区数据丢失了再从flash加载,否则每次都从备份区加载。

/*************************************************************************************************************
 * 文件名		:	BackupSRAM.c
 * 功能			:	STM32F4 备份域SRAM驱动
 * 作者			:	[email protected]
 * 创建时间		:	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:失败
* 依赖			:	底层宏定义
* 作者			:	[email protected]
* 时间			:	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:要写入的数据长度
* 返回			:	写入的数据长度
* 依赖			:	底层宏定义
* 作者			:	[email protected]
* 时间			:	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:要读取的数据长度
* 返回			:	读取的数据长度
* 依赖			:	底层宏定义
* 作者			:	[email protected]
* 时间			:	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;
}



/*************************************************************************************************************
 * 文件名		:	BackupSRAM.h
 * 功能			:	STM32F4 备份域SRAM驱动
 * 作者			:	[email protected]
 * 创建时间		:	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_



















猜你喜欢

转载自blog.csdn.net/cp1300/article/details/80539676