如何使用STM32F4提供的备份SRAM
扫描二维码
随时随地手机看文章
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<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:要读取的数据缓冲区;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 * 创建时间 : 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_