Hi,
I need to store few variables values(long a = 4568;) to RAM (might be some other place) when the system went to sytem off mode .
How I can achieve in the nRF 51822 version 3.1 controller with SDK 6 and SD S110 .
Regards, Anand
Hi,
I need to store few variables values(long a = 4568;) to RAM (might be some other place) when the system went to sytem off mode .
How I can achieve in the nRF 51822 version 3.1 controller with SDK 6 and SD S110 .
Regards, Anand
Hi Anand,
I am assuming that you are asking on how to put RAM in retention mode just before system off.
// Switch on both RAM banks when in System OFF mode.
NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) |
(POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
// Enter System OFF and wait for wake up from GPIO detect signal.
NRF_POWER->SYSTEMOFF = 0x1;
This will put both the RAM banks into retention and your stored values in ram will retain their values after the system wakes up from OFF mode.
I would also recommend you to use latest SDK available for your projects. developer.nordicsemi.com/.../
Also do not initialize RAM at every system restart
static void display_failure(void) { while (true) { LEDS_INVERT(LEDS_MASK); nrf_delay_ms(1000); } }
void HardFault_Handler()
{
display_failure();
LEDS_ON(LEDS_MASK);
// Loop forever.
while (true)
{
}
}
int main(void)
{
uint8_t ManufacturerData[30] ;
uint32_t count = 0;
uint8_t * p_ram_test;
p_ram_test = (uint8_t *)&ManufacturerData[0];
LEDS_CONFIGURE(LEDS_MASK);
LEDS_OFF(LEDS_MASK);
// This pin is used for waking up from System OFF and is active low, enabling sense capabilities.
nrf_gpio_cfg_sense_input(PIN_GPIO_WAKEUP, BUTTON_PULL, NRF_GPIO_PIN_SENSE_LOW);
// Workaround for PAN_028 rev1.1 anomaly 22 - System: Issues with disable System OFF mechanism
nrf_delay_ms(1);
// Check if the system woke up from System OFF mode by reading the NRF_POWER->GPREGRET register which has
// retained the value written before going to System OFF. Below is the layout for usage for
// NRF_POWER->GPREGRET register.
// BITS | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
// --------------------------------------------------------------------
// | SPECIAL_SEQUENCE
// --------------------------------------------------------------------
///
if (NRF_POWER->GPREGRET == RESET_MEMORY_TEST_BYTE)
{
// We can be here only after we woken up from system off after pressing the button.
// clear GPREGRET register before exit.
NRF_POWER->GPREGRET = 0;
for(count = 0; count < sizeof(ManufacturerData); count++)
{
if(*p_ram_test++ != count)
{
display_failure(); // This means the contents of RAM were not the same that we wrote just before system off
}
}
LEDS_ON(1 << SUCCESS_PIN_NUMBER); // RAM retention worked for our variable
while (true)
{
// Do nothing.
}
}
// Write the known sequence to the GPREGRET register.
NRF_POWER->GPREGRET = RESET_MEMORY_TEST_BYTE;
// Write the known value to the known address in RAM, enable RAM retention, set System OFF, and wait
// for GPIO wakeup from external source.
LEDS_ON(1 << READY_PIN_NUMBER);
nrf_delay_ms(1000);
// Switch on both RAM banks when in System OFF mode.
NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) |
(POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
// Write a sequence of numbers to the RAM addresses to be tested
for(count = 0; count < sizeof(ManufacturerData); count++)
{
*p_ram_test++ = count;
}
// Enter System OFF and wait for wake up from GPIO detect signal.
NRF_POWER->SYSTEMOFF = 0x1;
while(1); // This is useful to debug systemoff mode
}
static void display_failure(void) { while (true) { LEDS_INVERT(LEDS_MASK); nrf_delay_ms(1000); } }
void HardFault_Handler()
{
display_failure();
LEDS_ON(LEDS_MASK);
// Loop forever.
while (true)
{
}
}
int main(void)
{
uint8_t ManufacturerData[30] ;
uint32_t count = 0;
uint8_t * p_ram_test;
p_ram_test = (uint8_t *)&ManufacturerData[0];
LEDS_CONFIGURE(LEDS_MASK);
LEDS_OFF(LEDS_MASK);
// This pin is used for waking up from System OFF and is active low, enabling sense capabilities.
nrf_gpio_cfg_sense_input(PIN_GPIO_WAKEUP, BUTTON_PULL, NRF_GPIO_PIN_SENSE_LOW);
// Workaround for PAN_028 rev1.1 anomaly 22 - System: Issues with disable System OFF mechanism
nrf_delay_ms(1);
// Check if the system woke up from System OFF mode by reading the NRF_POWER->GPREGRET register which has
// retained the value written before going to System OFF. Below is the layout for usage for
// NRF_POWER->GPREGRET register.
// BITS | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0
// --------------------------------------------------------------------
// | SPECIAL_SEQUENCE
// --------------------------------------------------------------------
///
if (NRF_POWER->GPREGRET == RESET_MEMORY_TEST_BYTE)
{
// We can be here only after we woken up from system off after pressing the button.
// clear GPREGRET register before exit.
NRF_POWER->GPREGRET = 0;
for(count = 0; count < sizeof(ManufacturerData); count++)
{
if(*p_ram_test++ != count)
{
display_failure(); // This means the contents of RAM were not the same that we wrote just before system off
}
}
LEDS_ON(1 << SUCCESS_PIN_NUMBER); // RAM retention worked for our variable
while (true)
{
// Do nothing.
}
}
// Write the known sequence to the GPREGRET register.
NRF_POWER->GPREGRET = RESET_MEMORY_TEST_BYTE;
// Write the known value to the known address in RAM, enable RAM retention, set System OFF, and wait
// for GPIO wakeup from external source.
LEDS_ON(1 << READY_PIN_NUMBER);
nrf_delay_ms(1000);
// Switch on both RAM banks when in System OFF mode.
NRF_POWER->RAMON |= (POWER_RAMON_OFFRAM0_RAM0On << POWER_RAMON_OFFRAM0_Pos) |
(POWER_RAMON_OFFRAM1_RAM1On << POWER_RAMON_OFFRAM1_Pos);
// Write a sequence of numbers to the RAM addresses to be tested
for(count = 0; count < sizeof(ManufacturerData); count++)
{
*p_ram_test++ = count;
}
// Enter System OFF and wait for wake up from GPIO detect signal.
NRF_POWER->SYSTEMOFF = 0x1;
while(1); // This is useful to debug systemoff mode
}