STM32F4提供4KB的備份SRAM,在開發(fā)程序時可以用于存儲掉電不丟失的數(shù)據(jù)(需要RTC紐扣電池支持),特別是一些實時修改的,掉電不能丟失的數(shù)據(jù),比如我用于存儲雨量累計流量等實時變化的數(shù)據(jù),定時存儲到flash,實時存儲到備份區(qū)(不能頻繁的寫flash),當(dāng)備份區(qū)數(shù)據(jù)丟失了再從flash加載,否則每次都從備份區(qū)加載。
/*************************************************************************************************************
?*?文件名 : BackupSRAM.c
?*?功能 : STM32F4?備份域SRAM驅(qū)動
?*?作者 : cp1300@139.com
?*?創(chuàng)建時間 : 2018-03-09
?*?最后修改時間 : 2018-03-09
?*?詳細(xì):
*************************************************************************************************************/
#include?"BackupSRAM.h"
#include?"system.h"?
#include?"string.h"?
#define?BACKUP_SRAM_SIZE (4*1024) //備份SRAM大小
/*************************************************************************************************************************
*?函數(shù) : bool?BackupSRAM_Init(void)
*?功能 : 備份域SRAM初始化
*?參數(shù) : 無
*?返回 : TRUE:成功,FALSE:失敗
*?依賴 : 底層宏定義
*?作者 : cp1300@139.com
*?時間 : 2018-03-09
*?最后修改時間? :? 2018-03-09
*?說明 :?
*************************************************************************************************************************/
bool?BackupSRAM_Init(void)
{?
RCC->APB1ENR|=1<CR|=1<AHB1LPENR?|=?BIT18; //睡眠模式期間的備份?SRAM?接口時鐘使能
PWR->CSR?|=?BIT9; //使能備份調(diào)壓器,不開啟會導(dǎo)致備份SRAM掉電丟失-必須先使能時鐘
return?TRUE;
}
/*************************************************************************************************************************
*?函數(shù) : u16?BackupSRAM_WriteData(u16?AddrOffset,?u8?*pData,?u16?DataLen)
*?功能 : 寫入數(shù)據(jù)到備份SRAM中
*?參數(shù) : AddrOffset:地址偏移,0-4KB范圍;pData:要寫入的數(shù)據(jù);DataLen:要寫入的數(shù)據(jù)長度
*?返回 : 寫入的數(shù)據(jù)長度
*?依賴 : 底層宏定義
*?作者 : cp1300@139.com
*?時間 : 2018-03-09
*?最后修改時間? :? 2018-03-09
*?說明 :? 注意:地址偏移+寫入的數(shù)據(jù)長度不能超過4KB
*************************************************************************************************************************/
u16?BackupSRAM_WriteData(u16?AddrOffset,?u8?*pData,?u16?DataLen)
{?
u32?len;
if(pData==NULL)?return?0; //無效的地址
if(DataLen==0)?return?0; //無效的數(shù)量
if(AddrOffset?>=?BACKUP_SRAM_SIZE)?return?0; //起始地址有誤
len?=?AddrOffset?+?DataLen;
if(len?>?BACKUP_SRAM_SIZE)?len?=?BACKUP_SRAM_SIZE; //限制范圍,只有4KB
len?-=?AddrOffset; //計算要寫入的數(shù)據(jù)長度
memcpy((u8?*)BKPSRAM_BASE+AddrOffset,?pData,?DataLen);
return?len;
}
/*************************************************************************************************************************
*?函數(shù) : u16?BackupSRAM_ReadData(u16?AddrOffset,?u8?*pData,?u16?DataLen)
*?功能 : 從備份SRAM中讀取數(shù)據(jù)
*?參數(shù) : AddrOffset:地址偏移,0-4KB范圍;pData:要讀取的數(shù)據(jù)緩沖區(qū);DataLen:要讀取的數(shù)據(jù)長度
*?返回 : 讀取的數(shù)據(jù)長度
*?依賴 : 底層宏定義
*?作者 : cp1300@139.com
*?時間 : 2018-03-09
*?最后修改時間? :? 2018-03-09
*?說明 :? 注意:地址偏移+寫入的數(shù)據(jù)長度不能超過4KB
*************************************************************************************************************************/
u16?BackupSRAM_ReadData(u16?AddrOffset,?u8?*pData,?u16?DataLen)
{?
u32?len;
if(pData==NULL)?return?0; //無效的地址
if(DataLen==0)?return?0; //無效的數(shù)量
if(AddrOffset?>=?BACKUP_SRAM_SIZE)?return?0; //起始地址有誤
len?=?AddrOffset?+?DataLen;
if(len?>?BACKUP_SRAM_SIZE)?len?=?BACKUP_SRAM_SIZE; //限制范圍,只有4KB
len?-=?AddrOffset; //計算要寫入的數(shù)據(jù)長度
memcpy(pData,?(u8?*)BKPSRAM_BASE+AddrOffset,?DataLen);
return?len;
}/************************************************************************************************************* ?*?文件名 : BackupSRAM.h ?*?功能 : STM32F4?備份域SRAM驅(qū)動 ?*?作者 : cp1300@139.com ?*?創(chuàng)建時間 : 2018-03-09 ?*?最后修改時間 : 2018-03-09 ?*?詳細(xì): *************************************************************************************************************/ #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); //寫入數(shù)據(jù)到備份SRAM中 u16?BackupSRAM_ReadData(u16?AddrOffset,?u8?*pData,?u16?DataLen); //從備份SRAM中讀取數(shù)據(jù) #endif?//__BACKUP_SRAM_H_





