From ca831bbd6352fe144343fece0d5e01c2e011394d Mon Sep 17 00:00:00 2001 From: morris Date: Mon, 29 Aug 2022 15:18:06 +0800 Subject: [PATCH] mcpwm: fix multiplication overflow in converting us to compare ticks Closes https://github.com/espressif/esp-idf/issues/9648 --- components/driver/mcpwm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/driver/mcpwm.c b/components/driver/mcpwm.c index d4cb02cd28..04ada98b02 100644 --- a/components/driver/mcpwm.c +++ b/components/driver/mcpwm.c @@ -285,9 +285,11 @@ esp_err_t mcpwm_set_duty_in_us(mcpwm_unit_t mcpwm_num, mcpwm_timer_t timer_num, mcpwm_critical_enter(mcpwm_num); int real_group_prescale = mcpwm_ll_group_get_clock_prescale(hal->dev); - unsigned long int real_timer_clk_hz = + // to avid multiplication overflow, use uint64_t here + uint64_t real_timer_clk_hz = SOC_MCPWM_BASE_CLK_HZ / real_group_prescale / mcpwm_ll_timer_get_clock_prescale(hal->dev, timer_num); - mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, duty_in_us * real_timer_clk_hz / 1000000); + uint64_t compare_val = real_timer_clk_hz * duty_in_us / 1000000; + mcpwm_ll_operator_set_compare_value(hal->dev, op, cmp, (uint32_t)compare_val); mcpwm_ll_operator_enable_update_compare_on_tez(hal->dev, op, cmp, true); mcpwm_critical_exit(mcpwm_num); return ESP_OK;