S7G2 writing to internal data flash during power off

I am just curious to know if there is a way on S7G2 to detect Power OFF condition to write couple of variables to internal data flash, and if there is a way to do that, the next question is would it have enough time to write 8 bytes before quitting.

If there is way then I don't have to worry about designing a super cap board/Circuitry that can hold the charge for 3-5 secs on power OFF.

I have a requirement to keep track some variables every 0.1 changes, and I don't want to write to memory every 0.1 change as I would hit the upper limit of 100,000 erase/write cycles in a couple of months.

Any input on this is much appreciated.

 

Thanks,

Sam

Parents
  • Hello Sam,

    there is the Low Voltage Detection (LVD) HAL module available in the SSP. It could be used to execute user's code when the VCC crosses the detection threshold.

    Best regards,
    anper

  • Hello Anper,
    Tried the LVD Module. I guess the module itself works just fine.
    But when I tested a power OFF condition by just unplugging the 5V power source on the DK-S7G2, the processor shuts down instantly. The sink to 0V is fast enough to not trigger the LVD callback interrupt below 2.85V threshold. I just followed the settings and procedure explained in Module Guide.

    I started with the other option of accessing RTC's alarm register to store a sample data 0x55 as shown below:

    *((uint32_t*)0x4004401A)=0x55; //0x4004401A is the address of RTC.RMONAR Month Alarm Register (Page 700 on S7G2 USER MANUAL Rev 1.20)

    Tried to debug the above and monitor in Memory window - not able to see a value 0x55 in that location, its showing 0x00.
    Not sure if this is the right way to use alarm registers for user variables.

    Any help on this is greatly appreciated.

    Thanks,
    Sam
  • Using an "ideal diode" in front of a beefy-enough bulk capacitor could let you monitor incoming 5V side without taking a big diode drop penalty on your processor supply rail. That might be all you need.
  • Thanks for you response. At this point I will not be able to make any hardware changes to fix this, so i am thinking I will have use the RTC registers to save my 8 bytes of application data. Any light on how to use RTC alarm registers for saving application data might be helpful. (All I need is to store 8 bytes of data into battery backedup RTC RAM location)
    I tried the below and I am not able to write to that location.
    *((uint32_t*)0x4004401A)=0x55; //0x4004401A is the address of RTC.RMONAR Month Alarm Register (Page 700 on S7G2 USER MANUAL Rev 1.20)
    Tried to debug the above and monitor in Memory window - not able to see a value 0x55 in that location, its showing 0x00.
    Not sure if this is the right way to use alarm registers for user variables.
Reply
  • Thanks for you response. At this point I will not be able to make any hardware changes to fix this, so i am thinking I will have use the RTC registers to save my 8 bytes of application data. Any light on how to use RTC alarm registers for saving application data might be helpful. (All I need is to store 8 bytes of data into battery backedup RTC RAM location)
    I tried the below and I am not able to write to that location.
    *((uint32_t*)0x4004401A)=0x55; //0x4004401A is the address of RTC.RMONAR Month Alarm Register (Page 700 on S7G2 USER MANUAL Rev 1.20)
    Tried to debug the above and monitor in Memory window - not able to see a value 0x55 in that location, its showing 0x00.
    Not sure if this is the right way to use alarm registers for user variables.
Children
  • How can I access the below mentioned VBAT Backup Register Area using Synergy API's for storing application data:

     

     

     

     

  • Sam,

    I do not think that there are any API that you can use to access the VBATT backup registers.

    But they are easily accessed.

    Below is an example.

    Regards,

    Richard

     

     

    /* HAL-only entry function */

    #include "hal_data.h"

    void hal_entry(void)

    {

       /* TODO: add your own code here */

       /*

        * VBATT registers are Write Protected

        * Enable access

        * Refer to section 13 of S7G2 Hardware User's Manual for more info

        */

       R_BSP_RegisterProtectDisable(BSP_REG_PROTECT_OM_LPC_BATT);

       /* Zero out VBATT Backup Registers */

       for( uint16_t count=0; count<512;count++ )

       {

           R_SYSTEM->VBTBKRn[count] = 0;

       }

       /* Write some test data */

       for( uint16_t count=0; count<512;count++ )

       {

           R_SYSTEM->VBTBKRn[count] = (uint8_t)count;

       }

       /* Enable Write Protection */

       R_BSP_RegisterProtectEnable(BSP_REG_PROTECT_OM_LPC_BATT);

       while(1);

    }