From fe0cead74d816483fd549f74c622316c66de3096 Mon Sep 17 00:00:00 2001 From: blckmn Date: Fri, 11 Nov 2016 07:02:07 +1100 Subject: [PATCH] DMA initialisation moved. Restored uint8_t buffer size, adjusted to WORD peripheral size, for TIM2, TIM8. Removed Superfluous initalisation for F4. Tested on STM32DISCOVERY and BluejayF4 --- src/main/drivers/light_ws2811strip.c | 2 +- src/main/drivers/light_ws2811strip.h | 2 +- src/main/drivers/light_ws2811strip_stm32f10x.c | 7 +++---- src/main/drivers/light_ws2811strip_stm32f30x.c | 7 +++---- src/main/drivers/light_ws2811strip_stm32f4xx.c | 10 +++------- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/main/drivers/light_ws2811strip.c b/src/main/drivers/light_ws2811strip.c index b61ea977a..ce6772f36 100644 --- a/src/main/drivers/light_ws2811strip.c +++ b/src/main/drivers/light_ws2811strip.c @@ -40,7 +40,7 @@ #include "io.h" #include "light_ws2811strip.h" -#if defined(STM32F1) +#if defined(STM32F1) || defined(STM32F3) uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE]; #else uint32_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE]; diff --git a/src/main/drivers/light_ws2811strip.h b/src/main/drivers/light_ws2811strip.h index 1f65a58d0..ac27983db 100644 --- a/src/main/drivers/light_ws2811strip.h +++ b/src/main/drivers/light_ws2811strip.h @@ -67,7 +67,7 @@ void setStripColors(const hsvColor_t *colors); bool isWS2811LedStripReady(void); -#if defined(STM32F1) +#if defined(STM32F1) || defined(STM32F3) extern uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE]; #else extern uint32_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE]; diff --git a/src/main/drivers/light_ws2811strip_stm32f10x.c b/src/main/drivers/light_ws2811strip_stm32f10x.c index f8aef69ff..3f52896fd 100644 --- a/src/main/drivers/light_ws2811strip_stm32f10x.c +++ b/src/main/drivers/light_ws2811strip_stm32f10x.c @@ -89,7 +89,9 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) TIM_CtrlPWMOutputs(timer, ENABLE); /* configure DMA */ - /* DMA1 Channel6 Config */ + dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); + dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); + dmaChannel = timerHardware->dmaChannel; DMA_DeInit(dmaChannel); @@ -113,9 +115,6 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_ITConfig(dmaChannel, DMA_IT_TC, ENABLE); - dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); - dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); - ws2811Initialised = true; } diff --git a/src/main/drivers/light_ws2811strip_stm32f30x.c b/src/main/drivers/light_ws2811strip_stm32f30x.c index 854cc171c..0db3d239e 100644 --- a/src/main/drivers/light_ws2811strip_stm32f30x.c +++ b/src/main/drivers/light_ws2811strip_stm32f30x.c @@ -66,6 +66,8 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) IOInit(ws2811IO, OWNER_LED_STRIP, RESOURCE_OUTPUT, 0); IOConfigGPIOAF(ws2811IO, IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP), timerHardware->alternateFunction); + dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); + dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); RCC_ClockCmd(timerRCC(timer), ENABLE); /* Compute the prescaler value */ @@ -109,7 +111,7 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; - DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; @@ -120,9 +122,6 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_ITConfig(dmaChannel, DMA_IT_TC, ENABLE); - dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); - dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); - ws2811Initialised = true; } diff --git a/src/main/drivers/light_ws2811strip_stm32f4xx.c b/src/main/drivers/light_ws2811strip_stm32f4xx.c index 46671ef25..378e83cbf 100644 --- a/src/main/drivers/light_ws2811strip_stm32f4xx.c +++ b/src/main/drivers/light_ws2811strip_stm32f4xx.c @@ -107,6 +107,9 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) TIM_CCxCmd(timer, timerHardware->channel, TIM_CCx_Enable); TIM_Cmd(timer, ENABLE); + dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); + dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); + stream = timerHardware->dmaStream; /* configure DMA */ DMA_Cmd(stream, DISABLE); @@ -123,10 +126,6 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; - DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; - DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; - DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; - DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(stream, &DMA_InitStructure); TIM_DMACmd(timer, timerDmaSource(timerHardware->channel), ENABLE); @@ -134,9 +133,6 @@ void ws2811LedStripHardwareInit(ioTag_t ioTag) DMA_ITConfig(stream, DMA_IT_TC, ENABLE); DMA_ClearITPendingBit(stream, dmaFlag_IT_TCIF(stream)); - dmaInit(timerHardware->dmaIrqHandler, OWNER_LED_STRIP, 0); - dmaSetHandler(timerHardware->dmaIrqHandler, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, 0); - ws2811Initialised = true; } -- 2.11.4.GIT