The only thing needs to be paid attention, is that the address needs to be added 2, after data writing inside.
here is the sample code of backup Sram.
void Backup_Register_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //enable the power clock
PWR_BackupAccessCmd(ENABLE); //enable access back up domain
RTC_WriteProtectionCmd(DISABLE); //disable the write protection
RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_BKPSRAMEN, ENABLE); //enable back up sram clock
//PWR_BackupRegulatorCmd(ENABLE); //for sram //enable back up regulator
PWR->CSR = (1<<9); //it is very important!! the back up sram is still available in Vbat mode
while(PWR_GetFlagStatus(PWR_FLAG_BRR) == RESET); //waiting for the BRR bits sets to one
}
void RTC_TANKORFLOW_Write(uint8_t Deltapercentage, uint8_t TankPercentage, uint8_t DTE, uint32_t FlowCount, uint16_t TankOrFlowFlag)
{
PWR_BackupAccessCmd(ENABLE);
RTC_WriteProtectionCmd(DISABLE);
if(TankOrFlowFlag<BKSRAM_FLOW_ADDR_OFFSET)
{
*(uint32_t*)(BKPSRAM_BASE + TANKORFLOW*8) = Deltapercentage;
*(uint32_t*)(BKPSRAM_BASE + TankOrFlowFlag*8+1)= TankPercentage;
*(uint32_t*)(BKPSRAM_BASE+ TankOrFlowFlag*8+2) = DTE;
}
else
{
*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8) = (uint8_t)(FlowCount>>24);
*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8 +1) = (uint8_t)(FlowCount>>16);
*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8 +2) = (uint8_t)(FlowCount>>8);
*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8 +3) = (uint8_t)FlowCount;
}
RTC_WriteProtectionCmd(ENABLE);
PWR_BackupAccessCmd(DISABLE);
}
void RTC_TANKORFLOW_Read(uint8_t* Deltapercentage, uint8_t* TankPercentage, uint8_t* DTE, uint32_t* FlowCount,uint16_t TankOrFlowFlag)
{
// PWR_BackupAccessCmd(ENABLE);
// RTC_WriteProtectionCmd(DISABLE);
*Deltapercentage = 0;
*TankPercentage = 0;
*DTE = 0;
*FlowCount = 0;
if(TankOrFlowFlag<BKSRAM_FLOW_ADDR_OFFSET)
{
*Deltapercentage = *(uint32_t*)(BKPSRAM_BASE + TankOrFlowFlag*8);
*TankPercentage = *(uint32_t*)(BKPSRAM_BASE + (TankOrFlowFlag*8)+1);
*DTE = *(uint32_t*)(BKPSRAM_BASE + (TankOrFlowFlag*8)+2);
}
else
{
uint32_t B24,B16,B8,B;
*FlowCount = 0;
B24 = (uint8_t)(*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8 ));
B16 = (uint8_t)(*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8+1 ));
B8 = (uint8_t)(*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8+2));
B = (uint8_t)(*(uint32_t*)(BKPSRAM_BASE + BKSRAM_FLOW_ADDR_OFFSET +(TankOrFlowFlag-FLOW_1)*8+3 ));
*FlowCount = B24<<24;
*FlowCount += B16<<16;
*FlowCount += B8 <<8;
*FlowCount += B;
}
// RTC_WriteProtectionCmd(ENABLE);
// PWR_BackupAccessCmd(DISABLE);
}
in the code (TankOrFlowFlag-FLOW_1)*8 is try to add address by 2.