diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 24be38f95..66202299e 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -86,6 +86,7 @@ typedef struct { #else uint8_t dmaBuffer[MOTOR_DMA_BUFFER_SIZE]; #endif + uint32_t dmaFlag; #if defined(STM32F7) TIM_HandleTypeDef TimHandle; DMA_HandleTypeDef hdma_tim; diff --git a/src/main/drivers/pwm_output_stm32f4xx.c b/src/main/drivers/pwm_output_stm32f4xx.c index 92926adde..09b0b001b 100644 --- a/src/main/drivers/pwm_output_stm32f4xx.c +++ b/src/main/drivers/pwm_output_stm32f4xx.c @@ -82,6 +82,7 @@ void pwmWriteDigital(uint8_t index, uint16_t value) packet <<= 1; } + DMA_ClearITPendingBit(motor->timerHardware->dmaStream, motor->dmaFlag); DMA_SetCurrDataCounter(motor->timerHardware->dmaStream, MOTOR_DMA_BUFFER_SIZE); DMA_Cmd(motor->timerHardware->dmaStream, ENABLE); } @@ -100,16 +101,6 @@ void pwmCompleteDigitalMotorUpdate(uint8_t motorCount) } } -static void motor_DMA_IRQHandler(dmaChannelDescriptor_t *descriptor) -{ - if (DMA_GET_FLAG_STATUS(descriptor, DMA_IT_TCIF)) { - motorDmaOutput_t * const motor = &dmaMotors[descriptor->userParam]; - DMA_Cmd(descriptor->stream, DISABLE); - TIM_DMACmd(motor->timerHardware->tim, motor->timerDmaSource, DISABLE); - DMA_CLEAR_FLAG(descriptor, DMA_IT_TCIF); - } -} - void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t motorIndex, motorPwmProtocolTypes_e pwmProtocolType) { TIM_OCInitTypeDef TIM_OCInitStructure; @@ -176,7 +167,6 @@ 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(stream, DISABLE); DMA_DeInit(stream); @@ -200,8 +190,8 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_Init(stream, &DMA_InitStructure); - DMA_ITConfig(stream, DMA_IT_TC, ENABLE); - DMA_ClearITPendingBit(stream, dmaFlag_IT_TCIF(timerHardware->dmaStream)); + motor->dmaFlag = dmaFlag_IT_TCIF(timerHardware->dmaStream); + DMA_ClearITPendingBit(stream, motor->dmaFlag); } #endif