STM32F4提供4KB的備份SRAM,在開發(fā)程序時可以用于存儲掉電不丟失的數據(需要RTC紐扣電池支持),特別是一些實時修改的,掉電不能丟失的數據,比如我用于存儲雨量累計流量等實時變化的數據,定時存儲到flash,實時存儲到備份區(qū)(不能頻繁的寫flash),當備份區(qū)數據丟失了再從flash加載,否則每次都從備份區(qū)加載。
/************************************************************************************************************* ?*?文件名 : BackupSRAM.c ?*?功能 : STM32F4?備份域SRAM驅動 ?*?作者 : cp1300@139.com ?*?創(chuàng)建時間 : 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<CR|=1<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:要讀取的數據緩沖區(qū);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; }
/************************************************************************************************************* ?*?文件名 : BackupSRAM.h ?*?功能 : STM32F4?備份域SRAM驅動 ?*?作者 : cp1300@139.com ?*?創(chuàng)建時間 : 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_