SYSTEM ON mode: RAM retention RTC VS NO RAM retention RTC

void func_ram_power_off(void)
{
uint8_t i = 0;

for(i = 0; i < 8; i++)
{
NRF_POWER->RAM[i].POWERCLR = (POWER_RAM_POWER_S0POWER_Off << POWER_RAM_POWER_S0POWER_Pos) |
(POWER_RAM_POWER_S1POWER_Off << POWER_RAM_POWER_S1POWER_Pos) |
(POWER_RAM_POWER_S0RETENTION_Off << POWER_RAM_POWER_S0RETENTION_Pos) |
(POWER_RAM_POWER_S1RETENTION_Off << POWER_RAM_POWER_S1RETENTION_Pos);
}


}

/**
* @brief Function for application main entry.
*/
int main(void)
{
leds_config();
lfclk_config();
rtc_config();

//func_ram_power_off();
#if 0
NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) |
(POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
#endif
__DSB();
__NOP();

while (true)
{
__WFE();

}
}

when my code func_ram_power_off() enable is NO RAM retention,func_ram_power_off() disable is  RAM retention,but the power same is 1.6uA,

why? 

thanks you!

Parents Reply Children
  • NRF_POWER->RAM[i].POWERCLR = (POWER_RAM_POWER_S0POWER_Off << POWER_RAM_POWER_S0POWER_Pos) |
    (POWER_RAM_POWER_S1POWER_Off << POWER_RAM_POWER_S1POWER_Pos) |
    (POWER_RAM_POWER_S0RETENTION_Off << POWER_RAM_POWER_S0RETENTION_Pos) |
    (POWER_RAM_POWER_S1RETENTION_Off << POWER_RAM_POWER_S1RETENTION_Pos);

    or 

    NRF_POWER->RAM[i].POWERCLR = 0x03FF;

    the result  NRF_POWER->RAM[i].POWERCLR is 0x0000;my chip is nrf52832,i  want to kown my code is ok?? 

    or how to do it(RAM ON/OFF)?

    thanks you!

  • Hi,

    RAM retention is by default OFF.  

    826896167 said:
    NRF_POWER->RAM[i].POWERCLR = (POWER_RAM_POWER_S0POWER_Off << POWER_RAM_POWER_S0POWER_Pos) |
    (POWER_RAM_POWER_S1POWER_Off << POWER_RAM_POWER_S1POWER_Pos) |
    (POWER_RAM_POWER_S0RETENTION_Off << POWER_RAM_POWER_S0RETENTION_Pos) |
    (POWER_RAM_POWER_S1RETENTION_Off << POWER_RAM_POWER_S1RETENTION_Pos);

    You're mixing the correct bitfields, the ones that you're using is for the POWER register not the POWERCLR register. The correct code for testing retention off versus retention on:

    #include <stdbool.h>
    #include <stdint.h>
    #include "nrf_delay.h"
    #include "boards.h"
    
    //#define POWER_OFF_RETENTION_OFF
    #define POWER_ON_RETENTION_ON
    //#define POWER_ON_RETENTION_OFF
    
    
    
      int main(void)
    
      {
    
        for(int i = 0; i <= 8; i++)
    
        {
          #ifdef POWER_OFF_RETENTION_OFF
          NRF_POWER->RAM[i].POWERCLR = (POWER_RAM_POWERCLR_S0POWER_Off << POWER_RAM_POWERCLR_S0POWER_Pos) |
          (POWER_RAM_POWERCLR_S1POWER_Off << POWER_RAM_POWERCLR_S1POWER_Pos) |
          (POWER_RAM_POWERCLR_S0RETENTION_Off << POWER_RAM_POWERCLR_S0RETENTION_Pos) |
          (POWER_RAM_POWERCLR_S1RETENTION_Off << POWER_RAM_POWERCLR_S1RETENTION_Pos);
    
          #endif
    
          #ifdef POWER_ON_RETENTION_ON
          
          NRF_POWER->RAM[i].POWER = (POWER_RAM_POWER_S0POWER_On << POWER_RAM_POWER_S0POWER_Pos) |
          (POWER_RAM_POWER_S1POWER_On << POWER_RAM_POWER_S1POWER_Pos) |
          (POWER_RAM_POWER_S0RETENTION_On << POWER_RAM_POWER_S0RETENTION_Pos) |
          (POWER_RAM_POWER_S1RETENTION_On << POWER_RAM_POWER_S1RETENTION_Pos);
    
          #endif
    
          #ifdef POWER_ON_RETENTION_OFF
          
          NRF_POWER->RAM[i].POWER = (POWER_RAM_POWER_S0POWER_On << POWER_RAM_POWER_S0POWER_Pos) |
          (POWER_RAM_POWER_S1POWER_On << POWER_RAM_POWER_S1POWER_Pos) |
          (POWER_RAM_POWER_S0RETENTION_Off << POWER_RAM_POWER_S0RETENTION_Pos) |
          (POWER_RAM_POWER_S1RETENTION_Off << POWER_RAM_POWER_S1RETENTION_Pos);
          #endif
    
    
    
        }
         //Go to System Off sleep
         NRF_POWER->SYSTEMOFF = 1;
    
        while(true)
        {}
    
      }
    

    best regards
    Jared

Related