本帖最后由 caizhiwei 于 2023-6-3 10:05 编辑
BKPSRAM(备份SRAM)应用于备份域,即使当VDD供电电源掉电时,该SRAM仍可保持其内容。 附加SRAM(ADDSRAM)只在一些特殊的GD32F4xx器件中可用。 由于采用AHB互联矩阵,上述SRAM块可以同时被不同的AHB主机访问,例如,即使CPU正在访问SRAM0,USBHS也可以访问SRAM1。
BKPSRAM 具有64kb的空间,如果您设备中使用 RTC后备电池,那么这个区域的sram可以用起来了。
不多说,直接上源码(项目级别的幼稚园码)
1.初始化:
void BSP_BkpSRAM_Init(void)
{
rcu_periph_clock_enable(RCU_BKPSRAM);
pmu_backup_ldo_config(PMU_BLDOON_ON); //使能备份域LDO
pmu_backup_write_enable();
//启用备份SRAM的低功耗稳压器,以保持它在VBAT模式的内容
pmu_lowdriver_mode_enable();
//等备份SRAM的低功耗稳压器已准备就绪
while(pmu_flag_get(PMU_FLAG_BLDORF)==RESET){};
}
然后,就是读写接口了:
/******************************************************************************
* 功能 : 写入数据到备份SRAM中
* 参数 : AddrOffset:地址偏移,0-4KB范围;pData:要写入的数据;
DataLen:要写入的数据元素的个数
* 返回 : TRUE or FALSE
* 说明 : 注意:地址偏移+写入的数据长度不能超过4KB
********************************************************************************/
bool BSP_BKPSRAM_Write_U32_Buff(uint32_t AddrOffset, uint32_t *pData, uint32_t Data_num)
{
if(pData == NULL) return false; //无效的地址
if(Data_num == 0) return false; //无效的数量
if(AddrOffset >= BACKUP_SRAM_SIZE) return false; //起始地址有误
if((AddrOffset + Data_num*4) >= BACKUP_SRAM_SIZE) return false; //空间不够
memcpy((uint32_t *)(BKPSRAM_BASE + AddrOffset), pData, Data_num*4);
return true;
}
//BKPSRAM数据读取
// 元素的个数
bool BSP_BKPSRAM_Read_U32_Buff(uint32_t addr_offset, uint32_t *buff, uint32_t num)
{
if(addr_offset >= BACKUP_SRAM_SIZE) return false; //起始地址有误
memcpy( buff, (uint32_t *)(BKPSRAM_BASE + addr_offset), num*4);
return true;
}
最后来一个测试:
BSP_BKPSRAM_Write_U32_Buff(0, (uint32_t *)Crc32Table, 10);
BSP_BKPSRAM_Read_U32_Buff(0, buffer, 10);
put_dump ( buffer, 10, 4);
如有疑问,希望大家评论留言哦~
|