Skip to content

Commit

Permalink
mcpwm: fix multiplication overflow in converting us to compare ticks
Browse files Browse the repository at this point in the history
Closes #9648
  • Loading branch information
suda-morris committed Aug 31, 2022
1 parent a0d03a6 commit 731db1c
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 5 deletions.
6 changes: 4 additions & 2 deletions components/driver/deprecated/mcpwm_legacy.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,9 +298,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 =
MCPWM_GROUP_CLK_SRC_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;
Expand Down
6 changes: 3 additions & 3 deletions components/driver/include/driver/mcpwm_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,11 @@ typedef struct {
* @brief MCPWM fault event callback function
*
* @param fault MCPWM fault handle
* @param ev_data MCPWM fault event data, fed by driver
* @param edata MCPWM fault event data, fed by driver
* @param user_ctx User data, set in `mcpwm_fault_register_event_callbacks()`
* @return whether a task switch is needed after the callback returns
*/
typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *ev_data, void *user_ctx);
typedef bool (*mcpwm_fault_event_cb_t)(mcpwm_fault_handle_t fault, const mcpwm_fault_event_data_t *edata, void *user_ctx);

/**
* @brief MCPWM compare event data
Expand Down Expand Up @@ -134,7 +134,7 @@ typedef struct {
* @brief MCPWM capture event callback function
*
* @param cap_channel MCPWM capture channel handle
* @param ev_data MCPWM capture event data, fed by driver
* @param edata MCPWM capture event data, fed by driver
* @param user_ctx User data, set in `mcpwm_capture_channel_register_event_callbacks()`
* @return Whether a high priority task has been waken up by this function
*/
Expand Down

0 comments on commit 731db1c

Please sign in to comment.