diff --git a/src/main/drivers/pwm_output_dshot.c b/src/main/drivers/pwm_output_dshot.c index 1491ae44c..729e866fc 100644 --- a/src/main/drivers/pwm_output_dshot.c +++ b/src/main/drivers/pwm_output_dshot.c @@ -144,6 +144,10 @@ void pwmDshotMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t m TIM_TypeDef *timer = timerHardware->tim; const IO_t motorIO = IOGetByTag(timerHardware->tag); + // Boolean configureTimer is always true when different channels of the same timer are processed in sequence, + // causing the timer and the associated DMA initialized more than once. + // To fix this, getTimerIndex must be expanded to return if a new timer has been requested. + // However, since the initialization is idempotent, it is left as is in a favor of flash space (for now). const uint8_t timerIndex = getTimerIndex(timer); const bool configureTimer = (timerIndex == dmaMotorTimerCount-1); diff --git a/src/main/drivers/pwm_output_dshot_hal.c b/src/main/drivers/pwm_output_dshot_hal.c index ba3fc1af1..0506e5a63 100644 --- a/src/main/drivers/pwm_output_dshot_hal.c +++ b/src/main/drivers/pwm_output_dshot_hal.c @@ -157,6 +157,10 @@ void pwmDshotMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t m return; } + // Note that a timer and an associated DMA are initialized more than once. + // To fix it, getTimerIndex must be expanded to return if a new timer has been requested. + // However, since the initialization is idempotent, it is left as is in a favor of flash space (for now). + motor->timer = &dmaMotorTimers[getTimerIndex(timer)]; /* Set the common dma handle parameters to be configured */