From d566bd431b1e387a9bab7151aebfad4b910312be Mon Sep 17 00:00:00 2001 From: morris Date: Thu, 26 Dec 2024 11:35:09 +0800 Subject: [PATCH] fix(rmt): channel resolution divider rounding issue Closes https://github.com/espressif/esp-idf/issues/15092 --- components/esp_driver_rmt/src/rmt_rx.c | 4 ++-- components/esp_driver_rmt/src/rmt_tx.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/components/esp_driver_rmt/src/rmt_rx.c b/components/esp_driver_rmt/src/rmt_rx.c index 9c5c525e6d..6c435c9748 100644 --- a/components/esp_driver_rmt/src/rmt_rx.c +++ b/components/esp_driver_rmt/src/rmt_rx.c @@ -278,8 +278,8 @@ esp_err_t rmt_new_rx_channel(const rmt_rx_channel_config_t *config, rmt_channel_ // select the clock source ESP_GOTO_ON_ERROR(rmt_select_periph_clock(&rx_channel->base, config->clk_src), err, TAG, "set group clock failed"); - // set channel clock resolution - uint32_t real_div = group->resolution_hz / config->resolution_hz; + // set channel clock resolution, find the divider to get the closest resolution + uint32_t real_div = (group->resolution_hz + config->resolution_hz / 2) / config->resolution_hz; rmt_ll_rx_set_channel_clock_div(hal->regs, channel_id, real_div); // resolution loss due to division, calculate the real resolution rx_channel->base.resolution_hz = group->resolution_hz / real_div; diff --git a/components/esp_driver_rmt/src/rmt_tx.c b/components/esp_driver_rmt/src/rmt_tx.c index 6ad1b0a3e8..75dc021560 100644 --- a/components/esp_driver_rmt/src/rmt_tx.c +++ b/components/esp_driver_rmt/src/rmt_tx.c @@ -333,8 +333,8 @@ esp_err_t rmt_new_tx_channel(const rmt_tx_channel_config_t *config, rmt_channel_ #endif // select the clock source ESP_GOTO_ON_ERROR(rmt_select_periph_clock(&tx_channel->base, config->clk_src), err, TAG, "set group clock failed"); - // set channel clock resolution - uint32_t real_div = group->resolution_hz / config->resolution_hz; + // set channel clock resolution, find the divider to get the closest resolution + uint32_t real_div = (group->resolution_hz + config->resolution_hz / 2) / config->resolution_hz; rmt_ll_tx_set_channel_clock_div(hal->regs, channel_id, real_div); // resolution lost due to division, calculate the real resolution tx_channel->base.resolution_hz = group->resolution_hz / real_div;