mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-03 14:01:53 +00:00 
			
		
		
		
	ledc: Fix the usage of ledc_ls_timer_update and ledc_timer_rst
ledc_ls_timer_update is required only when CLK_DIV and DUTY_RES bits are changed. Calling ledc_timer_rst while re-configure PWM frequency through ledc_set_freq can cause glitch in the signal
This commit is contained in:
		@@ -228,7 +228,6 @@ esp_err_t ledc_timer_rst(ledc_mode_t speed_mode, ledc_timer_t timer_sel)
 | 
			
		||||
    LEDC_CHECK(p_ledc_obj[speed_mode] != NULL, LEDC_NOT_INIT, ESP_ERR_INVALID_STATE);
 | 
			
		||||
    portENTER_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    ledc_hal_timer_rst(&(p_ledc_obj[speed_mode]->ledc_hal), timer_sel);
 | 
			
		||||
    ledc_ls_timer_update(speed_mode, timer_sel);
 | 
			
		||||
    portEXIT_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    return ESP_OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -240,7 +239,6 @@ esp_err_t ledc_timer_pause(ledc_mode_t speed_mode, ledc_timer_t timer_sel)
 | 
			
		||||
    LEDC_CHECK(p_ledc_obj[speed_mode] != NULL, LEDC_NOT_INIT, ESP_ERR_INVALID_STATE);
 | 
			
		||||
    portENTER_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    ledc_hal_timer_pause(&(p_ledc_obj[speed_mode]->ledc_hal), timer_sel);
 | 
			
		||||
    ledc_ls_timer_update(speed_mode, timer_sel);
 | 
			
		||||
    portEXIT_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    return ESP_OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -252,7 +250,6 @@ esp_err_t ledc_timer_resume(ledc_mode_t speed_mode, ledc_timer_t timer_sel)
 | 
			
		||||
    LEDC_CHECK(p_ledc_obj[speed_mode] != NULL, LEDC_NOT_INIT, ESP_ERR_INVALID_STATE);
 | 
			
		||||
    portENTER_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    ledc_hal_timer_resume(&(p_ledc_obj[speed_mode]->ledc_hal), timer_sel);
 | 
			
		||||
    ledc_ls_timer_update(speed_mode, timer_sel);
 | 
			
		||||
    portEXIT_CRITICAL(&ledc_spinlock);
 | 
			
		||||
    return ESP_OK;
 | 
			
		||||
}
 | 
			
		||||
@@ -312,8 +309,6 @@ static esp_err_t ledc_set_timer_div(ledc_mode_t speed_mode, ledc_timer_t timer_n
 | 
			
		||||
    }
 | 
			
		||||
    //Set the divisor
 | 
			
		||||
    ledc_timer_set(speed_mode, timer_num, div_param, duty_resolution, timer_clk_src);
 | 
			
		||||
    // reset the timer
 | 
			
		||||
    ledc_timer_rst(speed_mode, timer_num);
 | 
			
		||||
    return ESP_OK;
 | 
			
		||||
error:
 | 
			
		||||
    ESP_LOGE(LEDC_TAG, "requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=%d",
 | 
			
		||||
@@ -348,7 +343,12 @@ esp_err_t ledc_timer_config(const ledc_timer_config_t* timer_conf)
 | 
			
		||||
        ledc_hal_init(&(p_ledc_obj[speed_mode]->ledc_hal), speed_mode);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ledc_set_timer_div(speed_mode, timer_num, timer_conf->clk_cfg, freq_hz, duty_resolution);
 | 
			
		||||
    esp_err_t ret = ledc_set_timer_div(speed_mode, timer_num, timer_conf->clk_cfg, freq_hz, duty_resolution);
 | 
			
		||||
    if (ret == ESP_OK) {
 | 
			
		||||
        /* Reset the timer. */
 | 
			
		||||
        ledc_timer_rst(speed_mode, timer_num);
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
esp_err_t ledc_set_pin(int gpio_num, ledc_mode_t speed_mode, ledc_channel_t ledc_channel)
 | 
			
		||||
 
 | 
			
		||||
@@ -548,6 +548,7 @@ TEST_CASE("LEDC timer pause and resume", "[ledc][test_env=UT_T1_LEDC]")
 | 
			
		||||
    printf("reset ledc timer\n");
 | 
			
		||||
    TEST_ESP_OK(ledc_timer_rst(test_speed_mode, LEDC_TIMER_0));
 | 
			
		||||
    vTaskDelay(100 / portTICK_RATE_MS);
 | 
			
		||||
    count = wave_count(1000);
 | 
			
		||||
    TEST_ASSERT_UINT32_WITHIN(5, count, 5000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user