DPPI NRFX Support NRF54L15

DPPI is not able to build with SDK 2.8.

The issue seems to be the NRF54L15 has 4 DPPI peripherals, yet the NRFX hal version 2.8 only works with one.

// Driver for single instance DPPI
#if NRFX_CHECK(NRFX_DPPI_ENABLED) && (!defined(DPPIC_COUNT) || (DPPIC_COUNT == 1))


Would it be recommended to clone the latest release of the NRFX hal to get support for the 54L15?
Parents
  • Hi Luke, 
    If you take a look at \zephyr\modules\hal_nordic\nrfx\CMakeLists.txt  you can find this:

    So nrfx_gppi_dppi_ppib_lumos.c is used, not nrfx_dppi.c. 

  • Hmm, so it looks like I should be using the "gppi" library -  #include <helpers/nrfx_gppi.h> then correct?  

    I am trying to create multiple low-power PWM on the 54L15 with the GRTC and the GPIOTE.  I could do this on the 52 series, however this had a dedicated RTC that I could use for PWM.  With the 54L, it looks like there is just one global RTC with multiple CC channels.  is it still possible set up multiple low power PWMs using the GRTC and GPIOTE with the PPI events/tasks?   

  • uint8_t ppi_ccchan0, ppi_chan1, ppi_chan2, ppi_chan2, ppi_chan3;
    
    void ppi_init(void)
    {
        nrfx_err_t nrfx_err;
        uint32_t event_address, task_address;
    
        // Set PWM PIN on RTC compare channel0 / Duty factor channel
        nrfx_err = nrfx_gppi_channel_alloc(&ppi_ccchan0);
    
        if (nrfx_err != NRFX_SUCCESS)
        {
            LOG_ERR("nrfx_gppi_channel_alloc failed.");
        }
    
        event_address = nrfx_grtc_event_compare_address_get(ccchan0.channel);
        task_address = nrfx_gpiote_set_task_address_get(&gpiote_inst, GPIOTE_PIN);
        nrfx_gppi_channel_endpoints_setup(ppi_ccchan0, event_address, task_address);
        nrfx_gppi_channels_enable(BIT(ppi_ccchan0));
    
        // Clear PWM PIN on RTC compare channel1 / pwm base timer
        nrfx_err = nrfx_gppi_channel_alloc(&ppi_chan1);
    
        if (nrfx_err != NRFX_SUCCESS)
        {
            LOG_ERR("nrfx_gppi_channel_alloc failed.");
        }
    
        event_address = nrfx_grtc_event_compare_address_get(ccchan1.channel);
        task_address = nrfx_gpiote_clr_task_address_get(&gpiote_inst, GPIOTE_PIN);
        nrfx_gppi_channel_endpoints_setup(ppi_chan1, event_address, task_address);
    
        nrfx_gppi_fork_endpoint_setup(ppi_chan1,
                                      nrfx_grtc_task_address_get(NRF_GRTC_TASK_CLEAR));
    
        nrfx_gppi_channels_enable(BIT(ppi_chan1));
    }

    here is an attempt to use the GRTC_TASK_CLEAR.  This still only sets the led once/clears the led once.

  • Thanks Luke. I think it's more clear for me now. 
    I am now checking internally to see if there is any option. 

  • Were you ever able to find a solution to this?

    I couldn't find an answer so created a new post ( nRF54L15 GRTC -> GPPI -> GPIOTE pipeline ), but if you catch this notification and have some insight I'd appreciate it.

  • Hi Jeremy, 
    Unfortunately there is no update for a solution for this yet. I have escalated the issue again internally. 

  • Jeremy,

    Sadly, I do not think it is possible on the NRF54L like it was on the NRF52.  The problem is that all CC channels are one-shot except channel 0. 

    Also, I have not delved into the Zephyr tickless idle implementation, but it might be using channel 0 to wake the processor on a tickless idle sleep event. 

Reply Children
No Data
Related