Issues using PWM HAL Direct access on the NRF54L15

static void init_direct_pwm(void)
{
    // Get the base PWM instance (PWM20 for pwm_led0)
    pwm_hw = NRF_PWM20;

    // Configure PWM pins for direct access - use an array for pins
    uint32_t pin_array[NRF_PWM_CHANNEL_COUNT] = {
        NRF_GPIO_PIN_MAP(0, 3),  // P0.03 from overlay for first channel
        NRF_PWM_PIN_NOT_CONNECTED,  // Unused channels
        NRF_PWM_PIN_NOT_CONNECTED,
        NRF_PWM_PIN_NOT_CONNECTED
    };
    
    // Set up pins properly with array
    nrf_pwm_pins_set(pwm_hw, pin_array);
    
    // With 16MHz clock, each tick is 62.5ns (1/16MHz)
    // For a period of 5000ns (5μs), we need 80 ticks
    // Formula: period_ticks = desired_ns / 62.5
    uint32_t period_ns = 5000;  // 10μs expressed in ns
    period_ticks = period_ns / 62.5; // Convert ns to PWM ticks (160 ticks)
    
    // Configure PWM parameters - 16MHz clock, counting up mode, period in ticks
    nrf_pwm_configure(pwm_hw, 
                     NRF_PWM_CLK_16MHz,  // Use fastest clock (16MHz)
                     NRF_PWM_MODE_UP,    // Count up mode
                     period_ticks);      // Period in ticks (calculated from ns)
    
    // Set up sequence for continuous PWM output
    static nrf_pwm_sequence_t seq = {
        .values.p_common = pwm_seq_values,
        .length = 1,
        .repeats = 0,
        .end_delay = 0
    };
    
    // Configure PWM decoder for simple mode
    nrf_pwm_decoder_set(pwm_hw, 
                       NRF_PWM_LOAD_COMMON, 
                       NRF_PWM_STEP_AUTO);
    
    // Set up the sequence
    nrf_pwm_sequence_set(pwm_hw, 0, &seq);
    
    // Configure for infinite looping
    nrf_pwm_loop_set(pwm_hw, 0xFFFF);  // Loop indefinitely
    
    // Enable PWM peripheral
    nrf_pwm_enable(pwm_hw);
    
    // Start PWM generation
    nrf_pwm_task_trigger(pwm_hw, NRF_PWM_TASK_SEQSTART0);

    pwm_seq_values[0] = period_ticks / 2;
    nrf_pwm_task_trigger(pwm_hw, NRF_PWM_TASK_SEQSTART0);
    LOG_INF("PWM Test: Set initial 50%% duty cycle (%u)", pwm_seq_values[0]);
    LOG_INF("Direct PWM hardware access initialized");
}


/looping pwm code
/* Calculate PWM duty cycle */
uint16_t pwm_value = (uint16_t)(((uint64_t)period_ticks * value) / 16383U);

/* Direct hardware update */
pwm_seq_values[0] = pwm_value;
nrf_pwm_task_trigger(pwm_hw, NRF_PWM_TASK_SEQSTART0);

Hi

I am trying to port some PWM code from the NRF54L15 it uses HAL access because i have found it has faster writes which are useful for my application (testing latency and reproducing a signal) but it is building but i am not getting any outputs on the oscilloscope connected to the port 0, 03 pin. I have atteched the init code. It worked when i was using the nrf52840.

Related