From 26b05812474d83ea0bd668b5442942470ea7e857 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Tue, 19 Dec 2023 00:39:38 +0100 Subject: [PATCH] fix(soft-serial): Timer toggle mode would skip first period (#4432) --- .../common/arm/stm32/stm32_pulse_driver.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp index 341e3157c..e310c1f40 100644 --- a/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp @@ -302,12 +302,18 @@ void stm32_pulse_start_dma_req(const stm32_pulse_timer_t* tim, // Enable TC IRQ LL_DMA_EnableIT_TC(tim->DMAx, tim->DMA_Stream); - // Reset counter - LL_TIM_SetCounter(tim->TIMx, 0x00); - - // only on PWM (preloads the first period) - if (ocmode == LL_TIM_OCMODE_PWM1) + if (ocmode == LL_TIM_OCMODE_PWM1) { + // preloads first period for PWM) + LL_TIM_SetCounter(tim->TIMx, 0x00); LL_TIM_GenerateEvent_UPDATE(tim->TIMx); + } else { + // Reset counter close to overflow + if (IS_TIM_32B_COUNTER_INSTANCE(tim->TIMx)) { + LL_TIM_SetCounter(tim->TIMx, 0xFFFFFFFF); + } else { + LL_TIM_SetCounter(tim->TIMx, 0xFFFF); + } + } LL_TIM_EnableDMAReq_UPDATE(tim->TIMx); LL_DMA_EnableStream(tim->DMAx, tim->DMA_Stream);