From 6487f995d8fe00a7ece332f970a8307f9bce05b1 Mon Sep 17 00:00:00 2001 From: blckmn Date: Thu, 16 Mar 2017 20:30:49 +1100 Subject: [PATCH 1/2] Fix for F4 broken DSHOT --- src/main/drivers/pwm_output_dshot.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/drivers/pwm_output_dshot.c b/src/main/drivers/pwm_output_dshot.c index 51397c50f0..a04e76e410 100644 --- a/src/main/drivers/pwm_output_dshot.c +++ b/src/main/drivers/pwm_output_dshot.c @@ -188,13 +188,16 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t dmaInit(timerHardware->dmaIrqHandler, OWNER_MOTOR, RESOURCE_INDEX(motorIndex)); dmaSetHandler(timerHardware->dmaIrqHandler, motor_DMA_IRQHandler, NVIC_BUILD_PRIORITY(1, 2), motorIndex); + DMA_Cmd(dmaRef, DISABLE); + DMA_DeInit(dmaRef); + DMA_StructInit(&DMA_InitStructure); #if defined(STM32F3) DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)motor->dmaBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; #elif defined(STM32F4) - DMA_InitStructure.DMA_Channel = timerHardware->channel; + DMA_InitStructure.DMA_Channel = timerHardware->dmaChannel; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)motor->dmaBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; @@ -213,6 +216,9 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_Init(dmaRef, &DMA_InitStructure); DMA_ITConfig(dmaRef, DMA_IT_TC, ENABLE); +#ifdef STM32F4 + DMA_ClearITPendingBit(dmaRef, dmaFlag_IT_TCIF(dmaRef)); +#endif } #endif From 9d15fc544154ddc56dc84757be291234e9947d24 Mon Sep 17 00:00:00 2001 From: blckmn Date: Thu, 16 Mar 2017 22:14:13 +1100 Subject: [PATCH 2/2] Removed clearing of IT_TCIF flag --- src/main/drivers/light_ws2811strip_stdperiph.c | 4 ---- src/main/drivers/pwm_output_dshot.c | 3 --- 2 files changed, 7 deletions(-) diff --git a/src/main/drivers/light_ws2811strip_stdperiph.c b/src/main/drivers/light_ws2811strip_stdperiph.c index 36cd7aaae5..bb7d149267 100644 --- a/src/main/drivers/light_ws2811strip_stdperiph.c +++ b/src/main/drivers/light_ws2811strip_stdperiph.c @@ -153,11 +153,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_Init(dmaRef, &DMA_InitStructure); TIM_DMACmd(timer, timerDmaSource(timerHardware->channel), ENABLE); - DMA_ITConfig(dmaRef, DMA_IT_TC, ENABLE); -#ifdef STM32F4 - DMA_ClearITPendingBit(dmaRef, dmaFlag_IT_TCIF(dmaRef)); -#endif ws2811Initialised = true; } diff --git a/src/main/drivers/pwm_output_dshot.c b/src/main/drivers/pwm_output_dshot.c index a04e76e410..48b0a51eae 100644 --- a/src/main/drivers/pwm_output_dshot.c +++ b/src/main/drivers/pwm_output_dshot.c @@ -216,9 +216,6 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_Init(dmaRef, &DMA_InitStructure); DMA_ITConfig(dmaRef, DMA_IT_TC, ENABLE); -#ifdef STM32F4 - DMA_ClearITPendingBit(dmaRef, dmaFlag_IT_TCIF(dmaRef)); -#endif } #endif