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