Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs

PWM sequence2 fails to repeat when NRF_PWM_LOAD_WAVE_FORM is set

Hi there,

I've encountered a strange PWM behavior and have investigated a bit. When setting load_mode to NRF_PWM_LOAD_WAVE_FORM, creating two sequence, and the latter sequence length is sizeof(nrf_pwm_values_wave_form_t)/sizeof(uint16_t), the latter sequence will only be executed once no matter how much repeats is set. I'll paste my code below

#define PWM_WAVE_LEN  4
#define PWM_WAVE_LEN2 1
static nrf_pwm_values_wave_form_t pwm_wave_form_values[PWM_WAVE_LEN];
static nrf_pwm_values_wave_form_t pwm_wave_form_values2[PWM_WAVE_LEN2];
uint16_t counter_top = 100;
uint16_t counter_bottom = 1600;

for(int i=0; i<PWM_WAVE_LEN; i++)
{
    pwm_wave_form_values[i].counter_top = counter_top;
    pwm_wave_form_values[i].channel_0 = counter_top / 2;
    counter_top = counter_top * 2;
}
for(int i=0; i<PWM_WAVE_LEN2; i++)
{
    pwm_wave_form_values2[i].counter_top = counter_bottom;
    pwm_wave_form_values2[i].channel_0 = counter_bottom / 2;
    counter_bottom = counter_bottom / 2;
}
static nrf_pwm_sequence_t pwm_sequence =
{
    .values.p_wave_form = pwm_wave_form_values,
    .length          = (sizeof(pwm_wave_form_values) / sizeof(uint16_t)),
    .repeats         = 4,
    .end_delay       = 0
};
static nrf_pwm_sequence_t pwm_sequence2 =
{
    .values.p_wave_form = pwm_wave_form_values2,
    .length          = (sizeof(pwm_wave_form_values2) / sizeof(uint16_t)),
    .repeats         = 4,
    .end_delay       = 0
};
nrfx_pwm_complex_playback(&m_pwm, &pwm_sequence, &pwm_sequence2, 1, NRFX_PWM_FLAG_LOOP|NRFX_PWM_FLAG_NO_EVT_FINISHED);

If PWM_WAVE_LEN2 is 1, repeats in pwm_wave_form_values2 does not take effect. See logic analyzer results below.

PWM_WAVE_LEN2=1

If increase PWM_WAVE_LEN2 to 2, everything seems fine. See logic analyzer results below.

PWM_WAVE_LEN2=2

I need to confirm whether this is a designed feature or I made a misconfigure.

Related