diff --git a/src/main/common/utils.h b/src/main/common/utils.h index 3a6981b1d..23088d076 100644 --- a/src/main/common/utils.h +++ b/src/main/common/utils.h @@ -50,6 +50,7 @@ http://resnet.uoregon.edu/~gurney_j/jmpc/bitwise.html * https://groups.google.com/forum/?hl=en#!msg/comp.lang.c/attFnqwhvGk/sGBKXvIkY3AJ * Return (v ? floor(log2(v)) : 0) when 0 <= v < 1<<[8, 16, 32, 64]. * Inefficient algorithm, intended for compile-time constants. + */ #define LOG2_8BIT(v) (8 - 90/(((v)/4+14)|1) - 2/((v)/2+1)) #define LOG2_16BIT(v) (8*((v)>255) + LOG2_8BIT((v) >>8*((v)>255))) #define LOG2_32BIT(v) (16*((v)>65535L) + LOG2_16BIT((v)*1L >>16*((v)>65535L))) diff --git a/src/main/drivers/light_ws2811strip_hal.c b/src/main/drivers/light_ws2811strip_hal.c index b4bf97196..029d7d21a 100644 --- a/src/main/drivers/light_ws2811strip_hal.c +++ b/src/main/drivers/light_ws2811strip_hal.c @@ -39,26 +39,27 @@ #define WS2811_DMA_IT DMA_IT_TCIF2 #define WS2811_DMA_CHANNEL DMA_Channel_6 #define WS2811_TIMER_CHANNEL TIM_Channel_1 +#define WS2811_TIMER_GPIO_AF GPIO_AF2_TIM5 #endif static IO_t ws2811IO = IO_NONE; static uint16_t timDMASource = 0; bool ws2811Initialised = false; -TIM_HandleTypeDef TimHandle; +static TIM_HandleTypeDef TimHandle; void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance==WS2811_TIMER) { - HAL_TIM_PWM_Stop_DMA(&TimHandle,WS2811_TIMER_CHANNEL); + //HAL_TIM_PWM_Stop_DMA(&TimHandle,WS2811_TIMER_CHANNEL); + ws2811LedDataTransferInProgress = 0; } } void WS2811_DMA_IRQHandler(dmaChannelDescriptor_t* descriptor) { - ws2811LedDataTransferInProgress = 0; - HAL_DMA_IRQHandler(TimHandle.hdma[2]); + HAL_DMA_IRQHandler(TimHandle.hdma[descriptor->userParam]); } void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) @@ -68,9 +69,8 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) ws2811IO = IOGetByTag(IO_TAG(WS2811_PIN)); /* GPIOA Configuration: TIM5 Channel 1 as alternate function push-pull */ IOInit(ws2811IO, OWNER_LED_STRIP, RESOURCE_OUTPUT, 0); - //IOConfigGPIOAF(ws2811IO, IO_CONFIG(GPIO_MODE_AF_PP, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_PULLUP), timerGPIOAF(WS2811_TIMER)); + IOConfigGPIOAF(ws2811IO, IO_CONFIG(GPIO_MODE_AF_PP, GPIO_SPEED_FREQ_VERY_HIGH, GPIO_PULLUP), WS2811_TIMER_GPIO_AF); - __TIM5_CLK_ENABLE(); __DMA1_CLK_ENABLE(); @@ -111,13 +111,17 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) break; } - /* Link hdma_tim to hdma[3] (channel3) */ + /* Link hdma_tim to hdma[x] (channelx) */ __HAL_LINKDMA(htim, hdma[timDMASource], hdma_tim); - /* Initialize TIMx DMA handle */ - HAL_DMA_Init(htim->hdma[timDMASource]); - dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, WS2811_DMA_IRQHandler, NVIC_PRIO_WS2811_DMA, timDMASource); + + /* Initialize TIMx DMA handle */ + if(HAL_DMA_Init(htim->hdma[timDMASource]) != HAL_OK) + { + /* Initialization Error */ + return; + } } void ws2811LedStripHardwareInit(void) @@ -130,7 +134,8 @@ void ws2811LedStripHardwareInit(void) TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) { - /* Initialization Error */ + /* Initialization Error */ + return; } TIM_OC_InitTypeDef TIM_OCInitStructure; @@ -145,13 +150,13 @@ void ws2811LedStripHardwareInit(void) if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &TIM_OCInitStructure, WS2811_TIMER_CHANNEL) != HAL_OK) { - /* Configuration Error */ + /* Configuration Error */ + return; } const hsvColor_t hsv_white = { 0, 255, 255}; ws2811Initialised = true; setStripColor(&hsv_white); - ws2811UpdateStrip(); } @@ -163,13 +168,6 @@ void ws2811LedStripDMAEnable(void) return; } - if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) - { - /* Initialization Error */ - ws2811LedDataTransferInProgress = 0; - return; - } - if( HAL_TIM_PWM_Start_DMA(&TimHandle, WS2811_TIMER_CHANNEL, ledStripDMABuffer, WS2811_DMA_BUFFER_SIZE) != HAL_OK) { /* Starting PWM generation Error */ diff --git a/src/main/target/ANYFCF7/target.h b/src/main/target/ANYFCF7/target.h index 04877e66b..58379f08b 100644 --- a/src/main/target/ANYFCF7/target.h +++ b/src/main/target/ANYFCF7/target.h @@ -150,6 +150,7 @@ #define WS2811_DMA_IT DMA_IT_TCIF4 #define WS2811_DMA_CHANNEL DMA_CHANNEL_6 #define WS2811_DMA_IRQ DMA1_Stream4_IRQn +#define WS2811_TIMER_GPIO_AF GPIO_AF2_TIM5 #define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT