diff --git a/src/main/drivers/dma.h b/src/main/drivers/dma.h index 4274486a00..3bdf7a8b79 100644 --- a/src/main/drivers/dma.h +++ b/src/main/drivers/dma.h @@ -88,6 +88,7 @@ typedef enum { #define DMA_IT_FEIF ((uint32_t)0x00000001) dmaIdentifier_e dmaGetIdentifier(const DMA_Stream_TypeDef* stream); +dmaChannelDescriptor_t* getDmaDescriptor(const DMA_Stream_TypeDef* stream); #else diff --git a/src/main/drivers/dma_stm32f4xx.c b/src/main/drivers/dma_stm32f4xx.c index 12bf982643..24258e820a 100644 --- a/src/main/drivers/dma_stm32f4xx.c +++ b/src/main/drivers/dma_stm32f4xx.c @@ -123,4 +123,14 @@ dmaIdentifier_e dmaGetIdentifier(const DMA_Stream_TypeDef* stream) } } return 0; -} \ No newline at end of file +} + +dmaChannelDescriptor_t* getDmaDescriptor(const DMA_Stream_TypeDef* stream) +{ + for (int i = 0; i < DMA_MAX_DESCRIPTORS; i++) { + if (dmaDescriptors[i].stream == stream) { + return &dmaDescriptors[i]; + } + } + return NULL; +} diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 8ae0ae1948..fae54bb157 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -87,11 +87,7 @@ typedef struct { #else uint8_t dmaBuffer[MOTOR_DMA_BUFFER_SIZE]; #endif -#ifdef STM32F3 dmaChannelDescriptor_t* dmaDescriptor; -#else - uint32_t dmaFlag; -#endif #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 dc76fbb08b..55a48bcbaf 100644 --- a/src/main/drivers/pwm_output_stm32f4xx.c +++ b/src/main/drivers/pwm_output_stm32f4xx.c @@ -82,11 +82,10 @@ void pwmWriteDigital(uint8_t index, uint16_t value) packet <<= 1; } - DMA_Stream_TypeDef *stream = motor->timerHardware->dmaStream; TIM_DMACmd(motor->timerHardware->tim, motor->timerDmaSource, DISABLE); - DMA_SetCurrDataCounter(stream, MOTOR_DMA_BUFFER_SIZE); - DMA_ClearITPendingBit(stream, motor->dmaFlag); - DMA_Cmd(stream, ENABLE); + DMA_SetCurrDataCounter(motor->timerHardware->dmaStream, MOTOR_DMA_BUFFER_SIZE); + DMA_CLEAR_FLAG(motor->dmaDescriptor, DMA_IT_TCIF); + DMA_Cmd(motor->timerHardware->dmaStream, ENABLE); } void pwmCompleteDigitalMotorUpdate(uint8_t motorCount) @@ -169,6 +168,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t } dmaInit(timerHardware->dmaIrqHandler, OWNER_MOTOR, RESOURCE_INDEX(motorIndex)); + motor->dmaDescriptor = getDmaDescriptor(stream); DMA_Cmd(stream, DISABLE); DMA_DeInit(stream); @@ -191,8 +191,6 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(stream, &DMA_InitStructure); - - motor->dmaFlag = dmaFlag_IT_TCIF(stream); } #endif