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.

posted on 2019-05-27 10:55  闲云潭影  阅读(200)  评论(0编辑  收藏  举报