Skip to content

Commit bfd974d

Browse files
garywilldpgeorge
authored andcommitted
esp32/machine_pwm: Correctly stop LEDC timer.
The ESP32 PWM (LEDC) timer wasn't correctly stopped. `ledc_timer_rst()` is for resetting the timer counter to zero, not for stopping the timer. The correct way to stop a pwm timer is to pause it, then configure it with `deconfigure = true`. Signed-off-by: garywill <[email protected]>
1 parent 464121f commit bfd974d

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

ports/esp32/machine_pwm.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,13 @@ static void pwm_deinit(int channel_idx) {
156156
int timer_idx = chans[channel_idx].timer_idx;
157157
if (timer_idx != -1) {
158158
if (!is_timer_in_use(channel_idx, timer_idx)) {
159-
check_esp_err(ledc_timer_rst(TIMER_IDX_TO_MODE(timer_idx), TIMER_IDX_TO_TIMER(timer_idx)));
159+
check_esp_err(ledc_timer_pause(TIMER_IDX_TO_MODE(timer_idx), TIMER_IDX_TO_TIMER(timer_idx)));
160+
ledc_timer_config_t timer_config = {
161+
.deconfigure = true,
162+
.speed_mode = TIMER_IDX_TO_MODE(timer_idx),
163+
.timer_num = TIMER_IDX_TO_TIMER(timer_idx),
164+
};
165+
check_esp_err(ledc_timer_config(&timer_config));
160166
// Flag it unused
161167
timers[chans[channel_idx].timer_idx].freq_hz = -1;
162168
}
@@ -635,7 +641,13 @@ static void mp_machine_pwm_freq_set(machine_pwm_obj_t *self, mp_int_t freq) {
635641

636642
if (!current_in_use) {
637643
// Free the old timer
638-
check_esp_err(ledc_timer_rst(self->mode, self->timer));
644+
check_esp_err(ledc_timer_pause(self->mode, self->timer));
645+
ledc_timer_config_t timer_config = {
646+
.deconfigure = true,
647+
.speed_mode = self->mode,
648+
.timer_num = self->timer,
649+
};
650+
check_esp_err(ledc_timer_config(&timer_config));
639651
// Flag it unused
640652
timers[current_timer_idx].freq_hz = -1;
641653
}

0 commit comments

Comments
 (0)