在GD官网例程中没有给出GD32F407 BKP的示例代码,在网友提供的代码基础上重新使用了GD官网pmu库文件,按照流程重写了读和写的方法,供大家在使用中参考。。。
#include "gd32f4xx_rtc.h"
#include "gd32f4xx_pmu.h"
//初始化
void BKPSRAM_int(void)
{
//BKPSRAM_BASE
//*(__IO uint16_t *) (BKPSRAM_BASE + offset) = 0
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //启用压水堆时钟
rcu_periph_clock_enable(RCU_BKPSRAM);
// PWR_BackupAccessCmd(ENABLE); //能够访问到备份域
pmu_backup_ldo_config( PMU_BLDOON_ON);
//RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE); //启用备份SRAM时钟
pmu_backup_write_enable();
//PWR_BackupRegulatorCmd(ENABLE); //启用备份SRAM的低功耗稳压器,以保持它在VBAT模式的内容
pmu_low_driver_mode_enable(PMU_LOWDRIVER_ENABLE);
// while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET) {} //等到备份SRAM的低 功耗稳压器已准备就绪
while(pmu_flag_get(PMU_FLAG_BLDORF)==RESET){}
}
//BKPSRAM数据读取
uint16_t Rd_s16_BKPSRAM(uint16_t add)
{
uint32_t offset=0;
offset=(0x07ff&add)*2;
return *(__IO uint16_t *) (BKPSRAM_BASE + offset);
}
//BKPSRAM数据写
void Write_s16_BKPSRAM(uint16_t add,uint16_t d)
{
uint32_t offset=0;
offset=(0x07ff&add)*2;
*(__IO uint16_t *) (BKPSRAM_BASE + offset) = d ;
}
//测试:
void main(void){
uint16_t res;
BKPSRAM_int();
res=Rd_s16_BKPSRAM(RTC_BKP0);
if(res==0x0B)Write_s16_BKPSRAM(RTC_BKP0,0X0A);
printf("%x\r\n",res);
res=Rd_s16_BKPSRAM(RTC_BKP0);
printf("%x\r\n",res);
Write_s16_BKPSRAM(RTC_BKP0,0X3F);
}
在系统重启后,赋值的BKP0值不应该变化,表示配置成功.