Deep Sleep mode in nRF54l15

Hello, 
I am using nRF Connect SDK v2.9.0. While working on the nRF52840 board, I used sys_poweroff() to put the board in deep sleep mode. But before calling it, I called

nrf_power_rampower_mask_on(NRF_POWER, 0, NRF_POWER_RAMPOWER_S0POWER_MASK);
nrf_power_rampower_mask_on(NRF_POWER, 1, NRF_POWER_RAMPOWER_S1POWER_MASK);
if I wanted to keep the RAM content in Deep Sleep and I called 

nrf_power_rampower_mask_off(NRF_POWER, 0, NRF_POWER_RAMPOWER_S0POWER_MASK);
nrf_power_rampower_mask_off(NRF_POWER, 1, NRF_POWER_RAMPOWER_S1POWER_MASK);
if I want to not keep the RAM content in Deep Sleep.
Now, I want to do migration and use the board nRF54L15 rather than nRF52840. When I replaced the board and tried to build the code, I got errors as these functions are undefined for the board nRF54L15.
Also, I got errors in 
uint32_t reset_reason = nrf_power_resetreas_get(NRF_POWER);
 nrf_power_resetreas_clear(NRF_POWER, reset_reason);
if (reset_reason & NRF_POWER_RESETREAS_RESETPIN_MASK)
{
   *penu_wakeup_reason = WAKEUP_FROM_EXT_PIN_RESET;
}
As, the functions nrf_power_resetreas_get, nrf_power_resetreas_clear, and NRF_POWER_RESETREAS_RESETPIN_MASK macro are not defined for the nRF54L15 board while they were working with the nRF52840 board
Parents Reply
  • Hi,

    The nrf_power_rampower_mask_on() function is more low level and is used under the hood. The method demonstrated in the System OFF sample is using the Zephyr APIs. The retained region is specified in the devicetree (see the overlay file for the board under "boards", where yuo have this for the nRF54L15 DK:

    / {
    	cpuapp_sram@2002e000 {
    		compatible = "zephyr,memory-region", "mmio-sram";
    		reg = <0x2002e000 DT_SIZE_K(4)>;
    		zephyr,memory-region = "RetainedMem";
    		status = "okay";
    
    		retainedmem0: retainedmem {
    			compatible = "zephyr,retained-ram";
    			status = "okay";
    		};
    	};
    
    	aliases {
    		retainedmemdevice = &retainedmem0;
    	};
    };
    
    &cpuapp_sram {
    	/* Shrink SRAM size to avoid overlap with retained memory region */
    	reg = <0x20000000 DT_SIZE_K(184)>;
    	ranges = <0x0 0x20000000 0x2e000>;
    };
    

    This is the recommende approach.

    If you are interested, you can follow this further down by inspecting code or debugging, and then you should see that then the implementation for nrf for the Zephyr retained mem driver in zephyr/drivers/retained_mem/retained_mem_nrf_ram_ctrl.c is used, and this calls nrfx_ram_ctrl_retention_enable_set(). In there, you can see that a function pointer to  ram_ctrl_block_section_retention_enable_set() is passed to ram_ctrl_block_section_iterate(), and within nrfx_ram_ctrl_section_retention_mask_enable_set(), nrf_power_rampower_mask_on() is called.

Children
Related