diff --git a/src/main/drivers/dma.c b/src/main/drivers/dma.c index 672e73a20b..f2efc67f66 100644 --- a/src/main/drivers/dma.c +++ b/src/main/drivers/dma.c @@ -104,14 +104,4 @@ dmaIdentifier_e dmaGetIdentifier(const DMA_Channel_TypeDef* channel) } } return 0; -} - -dmaChannelDescriptor_t* getDmaDescriptor(const DMA_Channel_TypeDef* channel) -{ - for (int i = 0; i < DMA_MAX_DESCRIPTORS; i++) { - if (dmaDescriptors[i].channel == channel) { - return &dmaDescriptors[i]; - } - } - return NULL; } \ No newline at end of file diff --git a/src/main/drivers/dma.h b/src/main/drivers/dma.h index 771aa58567..85e6cfe3a7 100644 --- a/src/main/drivers/dma.h +++ b/src/main/drivers/dma.h @@ -129,7 +129,7 @@ typedef enum { #define DMA_IT_TEIF ((uint32_t)0x00000008) dmaIdentifier_e dmaGetIdentifier(const DMA_Channel_TypeDef* channel); -dmaChannelDescriptor_t* getDmaDescriptor(const DMA_Channel_TypeDef* channel); + #endif void dmaInit(dmaIdentifier_e identifier, resourceOwner_e owner, uint8_t resourceIndex); diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 7102e7e351..3a6b871195 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -20,7 +20,6 @@ #include "io/motors.h" #include "io/servos.h" #include "drivers/timer.h" -#include "drivers/dma.h" typedef enum { PWM_TYPE_STANDARD = 0, @@ -87,7 +86,6 @@ typedef struct { #else uint8_t dmaBuffer[MOTOR_DMA_BUFFER_SIZE]; #endif - dmaChannelDescriptor_t* dmaDescriptor; #if defined(STM32F7) TIM_HandleTypeDef TimHandle; DMA_HandleTypeDef hdma_tim; diff --git a/src/main/drivers/pwm_output_stm32f3xx.c b/src/main/drivers/pwm_output_stm32f3xx.c index 5ae299dcf0..65a2ba6066 100644 --- a/src/main/drivers/pwm_output_stm32f3xx.c +++ b/src/main/drivers/pwm_output_stm32f3xx.c @@ -84,10 +84,7 @@ void pwmWriteDigital(uint8_t index, uint16_t value) packet <<= 1; } - DMA_Cmd(motor->timerHardware->dmaChannel, DISABLE); - TIM_DMACmd(motor->timerHardware->tim, motor->timerDmaSource, DISABLE); DMA_SetCurrDataCounter(motor->timerHardware->dmaChannel, MOTOR_DMA_BUFFER_SIZE); - DMA_CLEAR_FLAG(motor->dmaDescriptor, DMA_IT_TCIF); DMA_Cmd(motor->timerHardware->dmaChannel, ENABLE); } @@ -105,6 +102,16 @@ 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->channel, 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; @@ -171,7 +178,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t } dmaInit(timerHardware->dmaIrqHandler, OWNER_MOTOR, RESOURCE_INDEX(motorIndex)); - motor->dmaDescriptor = getDmaDescriptor(channel); + dmaSetHandler(timerHardware->dmaIrqHandler, motor_DMA_IRQHandler, NVIC_BUILD_PRIORITY(1, 2), motorIndex); DMA_DeInit(channel); DMA_StructInit(&DMA_InitStructure); @@ -188,6 +195,8 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(channel, &DMA_InitStructure); + + DMA_ITConfig(channel, DMA_IT_TC, ENABLE); } #endif diff --git a/src/main/drivers/pwm_output_stm32f4xx.c b/src/main/drivers/pwm_output_stm32f4xx.c index 25f753c0e2..f81b5aaedc 100644 --- a/src/main/drivers/pwm_output_stm32f4xx.c +++ b/src/main/drivers/pwm_output_stm32f4xx.c @@ -82,9 +82,7 @@ void pwmWriteDigital(uint8_t index, uint16_t value) packet <<= 1; } - TIM_DMACmd(motor->timerHardware->tim, motor->timerDmaSource, DISABLE); DMA_SetCurrDataCounter(motor->timerHardware->dmaStream, MOTOR_DMA_BUFFER_SIZE); - DMA_CLEAR_FLAG(motor->dmaDescriptor, DMA_IT_TCIF); DMA_Cmd(motor->timerHardware->dmaStream, ENABLE); } @@ -102,6 +100,16 @@ 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; @@ -168,7 +176,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t } dmaInit(timerHardware->dmaIrqHandler, OWNER_MOTOR, RESOURCE_INDEX(motorIndex)); - motor->dmaDescriptor = getDmaDescriptor(stream); + dmaSetHandler(timerHardware->dmaIrqHandler, motor_DMA_IRQHandler, NVIC_BUILD_PRIORITY(1, 2), motorIndex); DMA_Cmd(stream, DISABLE); DMA_DeInit(stream); @@ -191,6 +199,9 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(stream, &DMA_InitStructure); + + DMA_ITConfig(stream, DMA_IT_TC, ENABLE); + DMA_ClearITPendingBit(stream, dmaFlag_IT_TCIF(timerHardware->dmaStream)); } #endif diff --git a/src/main/drivers/pwm_output_stm32f7xx.c b/src/main/drivers/pwm_output_stm32f7xx.c index b898493250..daf4ada754 100644 --- a/src/main/drivers/pwm_output_stm32f7xx.c +++ b/src/main/drivers/pwm_output_stm32f7xx.c @@ -52,6 +52,7 @@ uint8_t getTimerIndex(TIM_TypeDef *timer) void pwmWriteDigital(uint8_t index, uint16_t value) { + if (!pwmMotorsEnabled) { return; } @@ -81,9 +82,6 @@ void pwmWriteDigital(uint8_t index, uint16_t value) packet <<= 1; } - /* may not be required */ - HAL_DMA_IRQHandler(motor->TimHandle.hdma[motor->timerDmaSource]); - if(HAL_TIM_PWM_Start_DMA(&motor->TimHandle, motor->timerHardware->channel, motor->dmaBuffer, MOTOR_DMA_BUFFER_SIZE) != HAL_OK) { /* Starting PWM generation Error */ @@ -94,8 +92,34 @@ void pwmWriteDigital(uint8_t index, uint16_t value) void pwmCompleteDigitalMotorUpdate(uint8_t motorCount) { UNUSED(motorCount); + + if (!pwmMotorsEnabled) { + return; + } + + for (uint8_t i = 0; i < dmaMotorTimerCount; i++) { + //TIM_SetCounter(dmaMotorTimers[i].timer, 0); + //TIM_DMACmd(dmaMotorTimers[i].timer, dmaMotorTimers[i].timerDmaSources, ENABLE); + } } + +static void motor_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor) +{ + motorDmaOutput_t * const motor = &dmaMotors[descriptor->userParam]; + HAL_DMA_IRQHandler(motor->TimHandle.hdma[motor->timerDmaSource]); +} + +/*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) { motorDmaOutput_t * const motor = &dmaMotors[motorIndex]; @@ -162,6 +186,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t __HAL_LINKDMA(&motor->TimHandle, hdma[motor->timerDmaSource], motor->hdma_tim); dmaInit(timerHardware->dmaIrqHandler, OWNER_MOTOR, RESOURCE_INDEX(motorIndex)); + dmaSetHandler(timerHardware->dmaIrqHandler, motor_DMA_IRQHandler, NVIC_BUILD_PRIORITY(1, 2), motorIndex); /* Initialize TIMx DMA handle */ if(HAL_DMA_Init(motor->TimHandle.hdma[motor->timerDmaSource]) != HAL_OK)