From 924c891bf1f26000b60b6411882aeb74062b9706 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 2 Jul 2016 14:38:04 +1000 Subject: [PATCH 1/5] Update to LED STRIP to use new IO --- src/main/config/config.c | 4 +- src/main/drivers/light_ws2811strip.c | 16 +- .../drivers/light_ws2811strip_stm32f10x.c | 52 +++--- .../drivers/light_ws2811strip_stm32f30x.c | 61 +++---- .../drivers/light_ws2811strip_stm32f4xx.c | 150 ++++++++++++------ src/main/drivers/pwm_mapping.c | 18 +-- src/main/drivers/timer.c | 12 ++ src/main/drivers/timer.h | 12 +- src/main/drivers/timer_stm32f30x.c | 20 +-- src/main/drivers/timer_stm32f4xx.c | 28 ++-- src/main/io/ledstrip.c | 8 +- src/main/io/ledstrip.h | 2 +- src/main/io/serial_msp.c | 2 +- src/main/scheduler/scheduler_tasks.c | 4 +- src/main/target/ALIENFLIGHTF4/target.h | 8 +- src/main/target/BLUEJAYF4/target.h | 13 ++ src/main/target/BLUEJAYF4/target.mk | 4 +- src/main/target/CC3D/target.h | 9 +- src/main/target/COLIBRI_RACE/i2c_bst.c | 2 +- src/main/target/COLIBRI_RACE/target.h | 9 +- src/main/target/DOGE/target.h | 8 +- src/main/target/EUSTM32F103RC/target.h | 3 - src/main/target/FURYF3/target.h | 8 +- src/main/target/LUX_RACE/target.h | 9 +- src/main/target/MOTOLAB/target.h | 8 +- src/main/target/NAZE/target.h | 3 +- src/main/target/OLIMEXINO/target.h | 6 - src/main/target/OMNIBUS/target.h | 8 +- src/main/target/PIKOBLX/target.h | 8 +- src/main/target/PORT103R/target.h | 3 - src/main/target/REVO/target.h | 2 - src/main/target/REVONANO/target.h | 6 - src/main/target/RMDO/target.h | 8 +- src/main/target/SINGULARITY/target.h | 8 +- src/main/target/SPARKY/target.h | 9 +- src/main/target/SPRACINGF3/target.h | 8 +- src/main/target/SPRACINGF3EVO/target.h | 9 +- src/main/target/SPRACINGF3MINI/target.h | 9 +- src/main/target/STM32F3DISCOVERY/target.h | 8 +- src/main/target/X_RACERSPI/target.h | 8 +- 40 files changed, 277 insertions(+), 296 deletions(-) diff --git a/src/main/config/config.c b/src/main/config/config.c index 5bcd1e923..43820350d 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -848,10 +848,10 @@ void validateAndFixConfig(void) if (featureConfigured(FEATURE_SOFTSERIAL) && ( 0 #ifdef USE_SOFTSERIAL1 - || (LED_STRIP_TIMER == SOFTSERIAL_1_TIMER) + || (WS2811_TIMER == SOFTSERIAL_1_TIMER) #endif #ifdef USE_SOFTSERIAL2 - || (LED_STRIP_TIMER == SOFTSERIAL_2_TIMER) + || (WS2811_TIMER == SOFTSERIAL_2_TIMER) #endif )) { // led strip needs the same timer as softserial diff --git a/src/main/drivers/light_ws2811strip.c b/src/main/drivers/light_ws2811strip.c index 3821350f5..5bd5857b5 100644 --- a/src/main/drivers/light_ws2811strip.c +++ b/src/main/drivers/light_ws2811strip.c @@ -80,18 +80,9 @@ void setStripColors(const hsvColor_t *colors) } } -void ws2811DMAHandler(DMA_Channel_TypeDef *channel) { - if (DMA_GetFlagStatus(WS2811_DMA_TC_FLAG)) { - ws2811LedDataTransferInProgress = 0; - DMA_Cmd(channel, DISABLE); - DMA_ClearFlag(WS2811_DMA_TC_FLAG); - } -} - void ws2811LedStripInit(void) { memset(&ledStripDMABuffer, 0, WS2811_DMA_BUFFER_SIZE); - dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler); ws2811LedStripHardwareInit(); ws2811UpdateStrip(); } @@ -141,12 +132,11 @@ STATIC_UNIT_TESTED void updateLEDDMABuffer(uint8_t componentValue) */ void ws2811UpdateStrip(void) { - static uint32_t waitCounter = 0; static rgbColor24bpp_t *rgb24; - // wait until previous transfer completes - while(ws2811LedDataTransferInProgress) { - waitCounter++; + // don't wait - risk of infinite block, just get an update next time round + if (ws2811LedDataTransferInProgress) { + return; } dmaBufferOffset = 0; // reset buffer memory index diff --git a/src/main/drivers/light_ws2811strip_stm32f10x.c b/src/main/drivers/light_ws2811strip_stm32f10x.c index b7f1bd413..40003663d 100644 --- a/src/main/drivers/light_ws2811strip_stm32f10x.c +++ b/src/main/drivers/light_ws2811strip_stm32f10x.c @@ -23,35 +23,41 @@ #include "common/color.h" #include "drivers/light_ws2811strip.h" #include "nvic.h" +#include "io.h" +#include "dma.h" +#include "timer.h" + +#ifdef LED_STRIP + +static IO_t ws2811IO = IO_NONE; +bool ws2811Initialised = false; + +void ws2811DMAHandler(DMA_Channel_TypeDef *channel) +{ + if (DMA_GetFlagStatus(WS2811_DMA_TC_FLAG)) { + ws2811LedDataTransferInProgress = 0; + DMA_Cmd(channel, DISABLE); + DMA_ClearFlag(WS2811_DMA_TC_FLAG); + } +} void ws2811LedStripHardwareInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; - GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; uint16_t prescalerValue; -#ifdef CC3D - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOB, &GPIO_InitStructure); -#else - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); - - /* GPIOA Configuration: TIM3 Channel 1 as alternate function push-pull */ - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); -#endif - - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); + dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler); + + ws2811IO = IOGetByTag(IO_TAG(WS2811_PIN)); +/* GPIOA Configuration: TIM5 Channel 1 as alternate function push-pull */ + IOInit(ws2811IO, OWNER_SYSTEM, RESOURCE_OUTPUT); + IOConfigGPIO(ws2811IO, IO_CONFIG(GPIO_Speed_50MHz, GPIO_Mode_AF_PP)); + + RCC_ClockCmd(timerRCC(WS2811_TIMER), ENABLE); + /* Compute the prescaler value */ prescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; /* Time base configuration */ @@ -108,16 +114,20 @@ void ws2811LedStripHardwareInit(void) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); + ws2811Initialised = true; setStripColor(&hsv_white); ws2811UpdateStrip(); } void ws2811LedStripDMAEnable(void) { + if (!ws2811Initialised) + return; + DMA_SetCurrDataCounter(DMA1_Channel6, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred TIM_SetCounter(TIM3, 0); TIM_Cmd(TIM3, ENABLE); DMA_Cmd(DMA1_Channel6, ENABLE); } - +#endif \ No newline at end of file diff --git a/src/main/drivers/light_ws2811strip_stm32f30x.c b/src/main/drivers/light_ws2811strip_stm32f30x.c index fbcc8d3fb..567fd0b8e 100644 --- a/src/main/drivers/light_ws2811strip_stm32f30x.c +++ b/src/main/drivers/light_ws2811strip_stm32f30x.c @@ -20,51 +20,54 @@ #include -#include "gpio.h" +#include "io.h" #include "nvic.h" #include "common/color.h" #include "drivers/light_ws2811strip.h" +#include "dma.h" +#include "rcc.h" +#include "timer.h" -#ifndef WS2811_GPIO -#define WS2811_GPIO GPIOB -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_8 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#ifdef LED_STRIP + +#ifndef WS2811_PIN +#define WS2811_PIN PB8 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 #define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH3_HANDLER - #endif +static IO_t ws2811IO = IO_NONE; +bool ws2811Initialised = false; + +void ws2811DMAHandler(DMA_Channel_TypeDef *channel) +{ + if (DMA_GetFlagStatus(WS2811_DMA_TC_FLAG)) { + ws2811LedDataTransferInProgress = 0; + DMA_Cmd(channel, DISABLE); + DMA_ClearFlag(WS2811_DMA_TC_FLAG); + } +} + void ws2811LedStripHardwareInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; - GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; uint16_t prescalerValue; - - RCC_AHBPeriphClockCmd(WS2811_GPIO_AHB_PERIPHERAL, ENABLE); - - GPIO_PinAFConfig(WS2811_GPIO, WS2811_PIN_SOURCE, WS2811_GPIO_AF); - - /* Configuration alternate function push-pull */ - GPIO_StructInit(&GPIO_InitStructure); - GPIO_InitStructure.GPIO_Pin = WS2811_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - GPIO_Init(WS2811_GPIO, &GPIO_InitStructure); - - - RCC_APB2PeriphClockCmd(WS2811_TIMER_APB2_PERIPHERAL, ENABLE); + + dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler); + + ws2811IO = IOGetByTag(IO_TAG(WS2811_PIN)); + /* GPIOA Configuration: TIM5 Channel 1 as alternate function push-pull */ + IOInit(ws2811IO, OWNER_SYSTEM, RESOURCE_OUTPUT); + IOConfigGPIOAF(ws2811IO, IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP), timerGPIOAF(WS2811_TIMER)); + + RCC_ClockCmd(timerRCC(WS2811_TIMER), ENABLE); /* Compute the prescaler value */ prescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1; @@ -122,16 +125,20 @@ void ws2811LedStripHardwareInit(void) NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); + ws2811Initialised = true; setStripColor(&hsv_white); ws2811UpdateStrip(); } void ws2811LedStripDMAEnable(void) { + if (!ws2811Initialised) + return; + DMA_SetCurrDataCounter(WS2811_DMA_CHANNEL, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred TIM_SetCounter(WS2811_TIMER, 0); TIM_Cmd(WS2811_TIMER, ENABLE); DMA_Cmd(WS2811_DMA_CHANNEL, ENABLE); } - +#endif \ No newline at end of file diff --git a/src/main/drivers/light_ws2811strip_stm32f4xx.c b/src/main/drivers/light_ws2811strip_stm32f4xx.c index d85f1c575..7bc139c32 100644 --- a/src/main/drivers/light_ws2811strip_stm32f4xx.c +++ b/src/main/drivers/light_ws2811strip_stm32f4xx.c @@ -22,64 +22,122 @@ #include "common/color.h" #include "light_ws2811strip.h" +#include "dma.h" #include "nvic.h" +#include "io.h" +#include "system.h" +#include "rcc.h" +#include "timer.h" #ifdef LED_STRIP + +#if !defined(WS2811_PIN) +#define WS2811_PIN PA0 +#define WS2811_TIMER TIM5 +#define WS2811_DMA_HANDLER_IDENTIFER DMA1_ST2_HANDLER +#define WS2811_DMA_STREAM DMA1_Stream2 +#define WS2811_DMA_FLAG DMA_FLAG_TCIF2 +#define WS2811_DMA_IT DMA_IT_TCIF2 +#define WS2811_DMA_CHANNEL DMA_Channel_6 +#define WS2811_DMA_IRQ DMA1_Stream2_IRQn +#define WS2811_TIMER_CHANNEL TIM_Channel_1 +#endif + +static IO_t ws2811IO = IO_NONE; +static uint16_t timDMASource = 0; +bool ws2811Initialised = false; + +void ws2811DMAHandler(DMA_Stream_TypeDef *stream) +{ + if (DMA_GetFlagStatus(stream, WS2811_DMA_FLAG)) { + ws2811LedDataTransferInProgress = 0; + DMA_ClearITPendingBit(stream, WS2811_DMA_IT); + DMA_Cmd(stream, DISABLE); + TIM_DMACmd(WS2811_TIMER, timDMASource, DISABLE); + } +} + void ws2811LedStripHardwareInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; - GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; uint16_t prescalerValue; - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); - RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); - + RCC_ClockCmd(timerRCC(WS2811_TIMER), ENABLE); + ws2811IO = IOGetByTag(IO_TAG(WS2811_PIN)); /* GPIOA Configuration: TIM5 Channel 1 as alternate function push-pull */ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; - GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; - GPIO_Init(GPIOA, &GPIO_InitStructure); - - GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM5); - - + IOInit(ws2811IO, OWNER_SYSTEM, RESOURCE_OUTPUT); + IOConfigGPIOAF(ws2811IO, IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP), timerGPIOAF(WS2811_TIMER)); + // Stop timer - TIM_Cmd(TIM5, DISABLE); + TIM_Cmd(WS2811_TIMER, DISABLE); /* Compute the prescaler value */ - prescalerValue = (uint16_t) (SystemCoreClock / 2 / 84000000) - 1; + prescalerValue = (uint16_t)(SystemCoreClock / 2 / 84000000) - 1; + /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 104; // 800kHz TIM_TimeBaseStructure.TIM_Prescaler = prescalerValue; - TIM_TimeBaseStructure.TIM_ClockDivision = 0; + TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; - TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); + TIM_TimeBaseInit(WS2811_TIMER, &TIM_TimeBaseStructure); /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; + TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; + TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set; + TIM_OCInitStructure.TIM_OCPolarity = TIM_OCNPolarity_High; + TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; + TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = 0; - TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; - TIM_OC1Init(TIM5, &TIM_OCInitStructure); - TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); + + uint32_t channelAddress = 0; + switch (WS2811_TIMER_CHANNEL) + { + case TIM_Channel_1: + TIM_OC1Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC1; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR1); + TIM_OC1PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_2: + TIM_OC2Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC2; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR2); + TIM_OC2PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_3: + TIM_OC3Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC3; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR3); + TIM_OC3PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_4: + TIM_OC4Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC4; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR4); + TIM_OC4PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + } + + TIM_CtrlPWMOutputs(WS2811_TIMER, ENABLE); + TIM_ARRPreloadConfig(WS2811_TIMER, ENABLE); - TIM_Cmd(TIM5, ENABLE); + TIM_CCxCmd(WS2811_TIMER, WS2811_TIMER_CHANNEL, TIM_CCx_Enable); + TIM_Cmd(WS2811_TIMER, ENABLE); + dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler); /* configure DMA */ - /* DMA1 Channel Config */ - DMA_Cmd(DMA1_Stream2, DISABLE); // disable DMA channel 6 - DMA_DeInit(DMA1_Stream2); + DMA_Cmd(WS2811_DMA_STREAM, DISABLE); + DMA_DeInit(WS2811_DMA_STREAM); DMA_StructInit(&DMA_InitStructure); - DMA_InitStructure.DMA_Channel = DMA_Channel_6; - DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(TIM5->CCR1); + DMA_InitStructure.DMA_Channel = WS2811_DMA_CHANNEL; + DMA_InitStructure.DMA_PeripheralBaseAddr = channelAddress; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ledStripDMABuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; DMA_InitStructure.DMA_BufferSize = WS2811_DMA_BUFFER_SIZE; @@ -93,38 +151,36 @@ void ws2811LedStripHardwareInit(void) DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; - DMA_Init(DMA1_Stream2, &DMA_InitStructure); - DMA_ITConfig(DMA1_Stream2, DMA_IT_TC, ENABLE); - DMA_ClearITPendingBit(DMA1_Stream2, DMA_IT_TCIF2); // clear DMA1 Channel 6 transfer complete flag + + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE); + DMA_Init(WS2811_DMA_STREAM, &DMA_InitStructure); + DMA_ITConfig(WS2811_DMA_STREAM, DMA_IT_TC, ENABLE); + DMA_ClearITPendingBit(WS2811_DMA_STREAM, WS2811_DMA_IT); + NVIC_InitTypeDef NVIC_InitStructure; - NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream2_IRQn; + NVIC_InitStructure.NVIC_IRQChannel = WS2811_DMA_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_WS2811_DMA); NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_WS2811_DMA); NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); + ws2811Initialised = true; setStripColor(&hsv_white); ws2811UpdateStrip(); } -void DMA1_Stream2_IRQHandler(void) -{ - if (DMA_GetFlagStatus(DMA1_Stream2, DMA_FLAG_TCIF2)) { - ws2811LedDataTransferInProgress = 0; - DMA_Cmd(DMA1_Stream2, DISABLE); - TIM_DMACmd(TIM5, TIM_DMA_CC1, DISABLE); - DMA_ClearITPendingBit(DMA1_Stream2, DMA_IT_TCIF2); - } -} - void ws2811LedStripDMAEnable(void) { - DMA_SetCurrDataCounter(DMA1_Stream2, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred - TIM_SetCounter(TIM5, 0); - DMA_Cmd(DMA1_Stream2, ENABLE); - TIM_DMACmd(TIM5, TIM_DMA_CC1, ENABLE); + if (!ws2811Initialised) + return; + + DMA_SetCurrDataCounter(WS2811_DMA_STREAM, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred + TIM_SetCounter(WS2811_TIMER, 0); + DMA_Cmd(WS2811_DMA_STREAM, ENABLE); + TIM_DMACmd(WS2811_TIMER, timDMASource, ENABLE); } -#endif + +#endif \ No newline at end of file diff --git a/src/main/drivers/pwm_mapping.c b/src/main/drivers/pwm_mapping.c index 8d332ba56..5e797ea2f 100755 --- a/src/main/drivers/pwm_mapping.c +++ b/src/main/drivers/pwm_mapping.c @@ -157,33 +157,33 @@ pwmOutputConfiguration_t *pwmInit(drv_pwm_config_t *init) continue; #endif -#ifdef LED_STRIP_TIMER +#ifdef WS2811_TIMER // skip LED Strip output if (init->useLEDStrip) { - if (timerHardwarePtr->tim == LED_STRIP_TIMER) + if (timerHardwarePtr->tim == WS2811_TIMER) continue; -#if defined(STM32F303xC) && defined(WS2811_GPIO) && defined(WS2811_PIN_SOURCE) - if (CheckGPIOPinSource(timerHardwarePtr->tag, WS2811_GPIO, WS2811_PIN_SOURCE)) +#if defined(STM32F303xC) && defined(WS2811_PIN) + if (timerHardwarePtr->tag == IO_TAG(WS2811_PIN)) continue; #endif } #endif -#ifdef VBAT_ADC_GPIO - if (init->useVbat && CheckGPIOPin(timerHardwarePtr->tag, VBAT_ADC_GPIO, VBAT_ADC_GPIO_PIN)) { +#ifdef VBAT_ADC_PIN + if (init->useVbat && timerHardwarePtr->tag == IO_TAG(VBAT_ADC_PIN)) { continue; } #endif #ifdef RSSI_ADC_GPIO - if (init->useRSSIADC && CheckGPIOPin(timerHardwarePtr->tag, RSSI_ADC_GPIO, RSSI_ADC_GPIO_PIN)) { + if (init->useRSSIADC && timerHardwarePtr->tag == IO_TAG(RSSI_ADC_PIN)) { continue; } #endif #ifdef CURRENT_METER_ADC_GPIO - if (init->useCurrentMeterADC && CheckGPIOPin(timerHardwarePtr->tag, CURRENT_METER_ADC_GPIO, CURRENT_METER_ADC_GPIO_PIN)) { + if (init->useCurrentMeterADC && timerHardwarePtr->tag == IO_TAG(CURRENT_METER_ADC_PIN)) { continue; } #endif @@ -274,7 +274,7 @@ pwmOutputConfiguration_t *pwmInit(drv_pwm_config_t *init) } if (init->useChannelForwarding && !init->airplane) { -#if defined(NAZE) && defined(LED_STRIP_TIMER) +#if defined(NAZE) && defined(WS2811_TIMER) // if LED strip is active, PWM5-8 are unavailable, so map AUX1+AUX2 to PWM13+PWM14 if (init->useLEDStrip) { if (timerIndex >= PWM13 && timerIndex <= PWM14) { diff --git a/src/main/drivers/timer.c b/src/main/drivers/timer.c index 37067ae25..e168a46df 100755 --- a/src/main/drivers/timer.c +++ b/src/main/drivers/timer.c @@ -151,6 +151,18 @@ rccPeriphTag_t timerRCC(TIM_TypeDef *tim) return 0; } +#if defined(STM32F3) || defined(STM32F4) +uint8_t timerGPIOAF(TIM_TypeDef *tim) +{ + for (uint8_t i = 0; i < HARDWARE_TIMER_DEFINITION_COUNT; i++) { + if (timerDefinitions[i].TIMx == tim) { + return timerDefinitions[i].alternateFunction; + } + } + return 0; +} +#endif + void timerNVICConfigure(uint8_t irq) { NVIC_InitTypeDef NVIC_InitStructure; diff --git a/src/main/drivers/timer.h b/src/main/drivers/timer.h index cdc461c69..26078d451 100644 --- a/src/main/drivers/timer.h +++ b/src/main/drivers/timer.h @@ -69,6 +69,9 @@ typedef struct timerOvrHandlerRec_s { typedef struct timerDef_s { TIM_TypeDef *TIMx; rccPeriphTag_t rcc; +#if defined(STM32F3) || defined(STM32F4) + uint8_t alternateFunction; +#endif } timerDef_t; typedef struct timerHardware_s { @@ -82,8 +85,11 @@ typedef struct timerHardware_s { uint8_t alternateFunction; #endif } timerHardware_t; -enum {TIMER_OUTPUT_ENABLED = 0x01, TIMER_OUTPUT_INVERTED = 0x02}; +enum { + TIMER_OUTPUT_ENABLED = 0x01, + TIMER_OUTPUT_INVERTED = 0x02 +}; #ifdef STM32F1 #if defined(STM32F10X_XL) || defined(STM32F10X_HD_VL) @@ -149,3 +155,7 @@ void timerForceOverflow(TIM_TypeDef *tim); void configTimeBase(TIM_TypeDef *tim, uint16_t period, uint8_t mhz); // TODO - just for migration rccPeriphTag_t timerRCC(TIM_TypeDef *tim); + +#if defined(STM32F3) || defined(STM32F4) +uint8_t timerGPIOAF(TIM_TypeDef *tim); +#endif diff --git a/src/main/drivers/timer_stm32f30x.c b/src/main/drivers/timer_stm32f30x.c index 4bce8a70f..baad75634 100644 --- a/src/main/drivers/timer_stm32f30x.c +++ b/src/main/drivers/timer_stm32f30x.c @@ -10,16 +10,16 @@ #include "timer.h" const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { - { .TIMx = TIM1, .rcc = RCC_APB2(TIM1) }, - { .TIMx = TIM2, .rcc = RCC_APB1(TIM2) }, - { .TIMx = TIM3, .rcc = RCC_APB1(TIM3) }, - { .TIMx = TIM4, .rcc = RCC_APB1(TIM4) }, - { .TIMx = TIM6, .rcc = RCC_APB1(TIM6) }, - { .TIMx = TIM7, .rcc = RCC_APB1(TIM7) }, - { .TIMx = TIM8, .rcc = RCC_APB2(TIM8) }, - { .TIMx = TIM15, .rcc = RCC_APB2(TIM15) }, - { .TIMx = TIM16, .rcc = RCC_APB2(TIM16) }, - { .TIMx = TIM17, .rcc = RCC_APB2(TIM17) }, + { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_6 }, + { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_1 }, + { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_2 }, + { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_10 }, + { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, + { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, + { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_5 }, + { .TIMx = TIM15, .rcc = RCC_APB2(TIM15), GPIO_AF_9 }, + { .TIMx = TIM16, .rcc = RCC_APB2(TIM16), GPIO_AF_1 }, + { .TIMx = TIM17, .rcc = RCC_APB2(TIM17), GPIO_AF_1 }, }; diff --git a/src/main/drivers/timer_stm32f4xx.c b/src/main/drivers/timer_stm32f4xx.c index 8916a526c..374e9164b 100644 --- a/src/main/drivers/timer_stm32f4xx.c +++ b/src/main/drivers/timer_stm32f4xx.c @@ -35,20 +35,20 @@ #define CCMR_Offset ((uint16_t)0x0018) const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { - { .TIMx = TIM1, .rcc = RCC_APB2(TIM1) }, - { .TIMx = TIM2, .rcc = RCC_APB1(TIM2) }, - { .TIMx = TIM3, .rcc = RCC_APB1(TIM3) }, - { .TIMx = TIM4, .rcc = RCC_APB1(TIM4) }, - { .TIMx = TIM5, .rcc = RCC_APB1(TIM5) }, - { .TIMx = TIM6, .rcc = RCC_APB1(TIM6) }, - { .TIMx = TIM7, .rcc = RCC_APB1(TIM7) }, - { .TIMx = TIM8, .rcc = RCC_APB2(TIM8) }, - { .TIMx = TIM9, .rcc = RCC_APB2(TIM9) }, - { .TIMx = TIM10, .rcc = RCC_APB2(TIM10) }, - { .TIMx = TIM11, .rcc = RCC_APB2(TIM11) }, - { .TIMx = TIM12, .rcc = RCC_APB1(TIM12) }, - { .TIMx = TIM13, .rcc = RCC_APB1(TIM13) }, - { .TIMx = TIM14, .rcc = RCC_APB1(TIM14) }, + { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_TIM1 }, + { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_TIM2 }, + { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_TIM3 }, + { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_TIM4 }, + { .TIMx = TIM5, .rcc = RCC_APB1(TIM5), GPIO_AF_TIM5 }, + { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, + { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, + { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_TIM8 }, + { .TIMx = TIM9, .rcc = RCC_APB2(TIM9), GPIO_AF_TIM9 }, + { .TIMx = TIM10, .rcc = RCC_APB2(TIM10), GPIO_AF_TIM10 }, + { .TIMx = TIM11, .rcc = RCC_APB2(TIM11), GPIO_AF_TIM11 }, + { .TIMx = TIM12, .rcc = RCC_APB1(TIM12), GPIO_AF_TIM12 }, + { .TIMx = TIM13, .rcc = RCC_APB1(TIM13), GPIO_AF_TIM13 }, + { .TIMx = TIM14, .rcc = RCC_APB1(TIM14), GPIO_AF_TIM14 }, }; void TIM_SelectOCxM_NoDisable(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) diff --git a/src/main/io/ledstrip.c b/src/main/io/ledstrip.c index 061f0d798..863f3a8b6 100644 --- a/src/main/io/ledstrip.c +++ b/src/main/io/ledstrip.c @@ -440,7 +440,7 @@ void updateLedCount(void) } } -void reevalulateLedConfig(void) +void reevaluateLedConfig(void) { updateLedCount(); determineLedStripDimensions(); @@ -534,7 +534,7 @@ bool parseLedStripConfig(uint8_t ledIndex, const char *config) memset(ledConfig, 0, sizeof(ledConfig_t)); } - reevalulateLedConfig(); + reevaluateLedConfig(); return ok; } @@ -1095,7 +1095,7 @@ void applyDefaultLedStripConfig(ledConfig_t *ledConfigs) memset(ledConfigs, 0, MAX_LED_STRIP_LENGTH * sizeof(ledConfig_t)); memcpy(ledConfigs, &defaultLedStripConfig, sizeof(defaultLedStripConfig)); - reevalulateLedConfig(); + reevaluateLedConfig(); } void ledStripInit(ledConfig_t *ledConfigsToUse, hsvColor_t *colorsToUse) @@ -1107,7 +1107,7 @@ void ledStripInit(ledConfig_t *ledConfigsToUse, hsvColor_t *colorsToUse) void ledStripEnable(void) { - reevalulateLedConfig(); + reevaluateLedConfig(); ledStripInitialised = true; ws2811LedStripInit(); diff --git a/src/main/io/ledstrip.h b/src/main/io/ledstrip.h index 5f901e46c..18915229b 100644 --- a/src/main/io/ledstrip.h +++ b/src/main/io/ledstrip.h @@ -94,4 +94,4 @@ bool parseColor(uint8_t index, const char *colorConfig); void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount); void ledStripEnable(void); -void reevalulateLedConfig(void); +void reevaluateLedConfig(void); diff --git a/src/main/io/serial_msp.c b/src/main/io/serial_msp.c index 9f2609c0a..b616605ac 100644 --- a/src/main/io/serial_msp.c +++ b/src/main/io/serial_msp.c @@ -1807,7 +1807,7 @@ static bool processInCommand(void) ledConfig->color = read8(); - reevalulateLedConfig(); + reevaluateLedConfig(); } break; #endif diff --git a/src/main/scheduler/scheduler_tasks.c b/src/main/scheduler/scheduler_tasks.c index 721ad27eb..18299e490 100644 --- a/src/main/scheduler/scheduler_tasks.c +++ b/src/main/scheduler/scheduler_tasks.c @@ -168,8 +168,8 @@ cfTask_t cfTasks[TASK_COUNT] = { [TASK_LEDSTRIP] = { .taskName = "LEDSTRIP", .taskFunc = taskLedStrip, - .desiredPeriod = 1000000 / 100, // 100 Hz - .staticPriority = TASK_PRIORITY_IDLE, + .desiredPeriod = 1000000 / 10, // 10 Hz + .staticPriority = TASK_PRIORITY_LOW, }, #endif diff --git a/src/main/target/ALIENFLIGHTF4/target.h b/src/main/target/ALIENFLIGHTF4/target.h index d5122a486..5c5e7795f 100644 --- a/src/main/target/ALIENFLIGHTF4/target.h +++ b/src/main/target/ALIENFLIGHTF4/target.h @@ -146,16 +146,10 @@ // LED strip configuration using RC5 pin. //#define LED_STRIP -//#define LED_STRIP_TIMER TIM8 //#define USE_LED_STRIP_ON_DMA1_CHANNEL3 -//#define WS2811_GPIO GPIOB -//#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB -//#define WS2811_GPIO_AF GPIO_AF_3 -//#define WS2811_PIN GPIO_Pin_15 // TIM8_CH3 -//#define WS2811_PIN_SOURCE GPIO_PinSource15 +//#define WS2811_PIN PB15 // TIM8_CH3 //#define WS2811_TIMER TIM8 -//#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM8 //#define WS2811_DMA_CHANNEL DMA1_Channel3 //#define WS2811_IRQ DMA1_Channel3_IRQn diff --git a/src/main/target/BLUEJAYF4/target.h b/src/main/target/BLUEJAYF4/target.h index 7160da98f..8d9d1c633 100644 --- a/src/main/target/BLUEJAYF4/target.h +++ b/src/main/target/BLUEJAYF4/target.h @@ -134,6 +134,19 @@ #define USE_ADC #define VBAT_ADC_PIN PC3 +#define LED_STRIP +// LED Strip can run off Pin 6 (PB1) of the ESC outputs. +#define WS2811_PIN PB1 +#define WS2811_TIMER TIM3 +#define WS2811_TIMER_CHANNEL TIM_Channel_4 +#define WS2811_DMA_HANDLER_IDENTIFER DMA1_ST2_HANDLER +#define WS2811_DMA_STREAM DMA1_Stream2 +#define WS2811_DMA_FLAG DMA_FLAG_TCIF2 +#define WS2811_DMA_IT DMA_IT_TCIF2 +#define WS2811_DMA_CHANNEL DMA_Channel_5 +#define WS2811_DMA_IRQ DMA1_Stream2_IRQn + + #define ENABLE_BLACKBOX_LOGGING_ON_SDCARD_BY_DEFAULT #define DEFAULT_RX_FEATURE FEATURE_RX_PPM diff --git a/src/main/target/BLUEJAYF4/target.mk b/src/main/target/BLUEJAYF4/target.mk index 9f2308666..f52396562 100644 --- a/src/main/target/BLUEJAYF4/target.mk +++ b/src/main/target/BLUEJAYF4/target.mk @@ -4,5 +4,7 @@ FEATURES += SDCARD VCP TARGET_SRC = \ drivers/accgyro_spi_mpu6500.c \ drivers/accgyro_mpu6500.c \ - drivers/barometer_ms5611.c + drivers/barometer_ms5611.c \ + drivers/light_ws2811strip.c \ + drivers/light_ws2811strip_stm32f4xx.c diff --git a/src/main/target/CC3D/target.h b/src/main/target/CC3D/target.h index a0415670d..8d6e6afbc 100644 --- a/src/main/target/CC3D/target.h +++ b/src/main/target/CC3D/target.h @@ -92,12 +92,13 @@ #define I2C_DEVICE (I2CDEV_2) // Flex port - SCL/PB10, SDA/PB11 #define USE_ADC -#define CURRENT_METER_ADC_PIN PB1 -#define VBAT_ADC_PIN PA0 -#define RSSI_ADC_PIN PB0 +#define CURRENT_METER_ADC_PIN PB1 +#define VBAT_ADC_PIN PA0 +#define RSSI_ADC_PIN PB0 #define LED_STRIP -#define LED_STRIP_TIMER TIM3 +#define WS2811_PIN PB4 +#define WS2811_TIMER TIM3 #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC6 #define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH6_HANDLER diff --git a/src/main/target/COLIBRI_RACE/i2c_bst.c b/src/main/target/COLIBRI_RACE/i2c_bst.c index 10c99ccc0..be0764a03 100644 --- a/src/main/target/COLIBRI_RACE/i2c_bst.c +++ b/src/main/target/COLIBRI_RACE/i2c_bst.c @@ -1403,7 +1403,7 @@ static bool bstSlaveProcessWriteCommand(uint8_t bstWriteCommand) ledConfig->color = bstRead8(); - reevalulateLedConfig(); + reevaluateLedConfig(); } break; #endif diff --git a/src/main/target/COLIBRI_RACE/target.h b/src/main/target/COLIBRI_RACE/target.h index 976b287a0..2822227df 100755 --- a/src/main/target/COLIBRI_RACE/target.h +++ b/src/main/target/COLIBRI_RACE/target.h @@ -122,15 +122,8 @@ #define LED_STRIP #define USE_COLIBTI_RACE_LED_DEFAULT_CONFIG -#define LED_STRIP_TIMER TIM16 - -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_6 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource6 +#define WS2811_PIN PA6 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/DOGE/target.h b/src/main/target/DOGE/target.h index 44a16782b..7ca509ea2 100644 --- a/src/main/target/DOGE/target.h +++ b/src/main/target/DOGE/target.h @@ -140,15 +140,9 @@ #define LED_STRIP // tqfp48 pin 16 -#define LED_STRIP_TIMER TIM16 #define USE_LED_STRIP_ON_DMA1_CHANNEL3 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_6 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource6 +#define WS2811_PIN PA6 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/EUSTM32F103RC/target.h b/src/main/target/EUSTM32F103RC/target.h index d6d916bb2..0869dd46b 100644 --- a/src/main/target/EUSTM32F103RC/target.h +++ b/src/main/target/EUSTM32F103RC/target.h @@ -102,9 +102,6 @@ #define RSSI_ADC_PIN PA1 #define EXTERNAL1_ADC_PIN PA5 -//#define LED_STRIP -#define LED_STRIP_TIMER TIM3 - #define SPEKTRUM_BIND // USART2, PA3 #define BIND_PIN PA3 diff --git a/src/main/target/FURYF3/target.h b/src/main/target/FURYF3/target.h index 9075271c1..db4ddd745 100644 --- a/src/main/target/FURYF3/target.h +++ b/src/main/target/FURYF3/target.h @@ -156,16 +156,10 @@ #define CURRENT_METER_ADC_PIN PA2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/LUX_RACE/target.h b/src/main/target/LUX_RACE/target.h index 6292d2435..cef9b31b0 100644 --- a/src/main/target/LUX_RACE/target.h +++ b/src/main/target/LUX_RACE/target.h @@ -95,15 +95,8 @@ #define EXTERNAL1_ADC_PIN PC3 #define LED_STRIP -#define LED_STRIP_TIMER TIM16 - -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_6 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource6 +#define WS2811_PIN PA6 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/MOTOLAB/target.h b/src/main/target/MOTOLAB/target.h index 27bf98691..183e1326d 100644 --- a/src/main/target/MOTOLAB/target.h +++ b/src/main/target/MOTOLAB/target.h @@ -126,16 +126,10 @@ #define LED_STRIP #if 1 -#define LED_STRIP_TIMER TIM16 #define USE_LED_STRIP_ON_DMA1_CHANNEL3 -#define WS2811_GPIO GPIOB -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_8 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PB8 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/NAZE/target.h b/src/main/target/NAZE/target.h index df73f8e4f..6de152cb8 100644 --- a/src/main/target/NAZE/target.h +++ b/src/main/target/NAZE/target.h @@ -155,7 +155,8 @@ #define LED_STRIP -#define LED_STRIP_TIMER TIM3 +#define WS2811_TIMER TIM3 +#define WS2811_PIN PA6 #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC6 #define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH6_HANDLER diff --git a/src/main/target/OLIMEXINO/target.h b/src/main/target/OLIMEXINO/target.h index b7972ad77..3ff23fd8d 100644 --- a/src/main/target/OLIMEXINO/target.h +++ b/src/main/target/OLIMEXINO/target.h @@ -78,18 +78,12 @@ #define USE_I2C #define I2C_DEVICE (I2CDEV_2) -// #define SOFT_I2C // enable to test software i2c -// #define SOFT_I2C_PB1011 // If SOFT_I2C is enabled above, need to define pinout as well (I2C1 = PB67, I2C2 = PB1011) -// #define SOFT_I2C_PB67 - #define USE_ADC #define CURRENT_METER_ADC_PIN PB1 #define VBAT_ADC_PIN PA4 #define RSSI_ADC_PIN PA1 #define EXTERNAL1_ADC_PIN PA5 -//#define LED_STRIP -//#define LED_STRIP_TIMER TIM3 // IO - assuming all IOs on smt32f103rb LQFP64 package #define TARGET_IO_PORTA 0xffff diff --git a/src/main/target/OMNIBUS/target.h b/src/main/target/OMNIBUS/target.h index c9eb4a59d..76d995fce 100644 --- a/src/main/target/OMNIBUS/target.h +++ b/src/main/target/OMNIBUS/target.h @@ -166,15 +166,9 @@ #define LED_STRIP -#define LED_STRIP_TIMER TIM1 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/PIKOBLX/target.h b/src/main/target/PIKOBLX/target.h index 8b14570c9..36ee21772 100644 --- a/src/main/target/PIKOBLX/target.h +++ b/src/main/target/PIKOBLX/target.h @@ -94,16 +94,10 @@ #define LED_STRIP #if 1 -#define LED_STRIP_TIMER TIM16 #define USE_LED_STRIP_ON_DMA1_CHANNEL3 -#define WS2811_GPIO GPIOB -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_8 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PB8 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/PORT103R/target.h b/src/main/target/PORT103R/target.h index 64e0b6455..d5d0850d9 100644 --- a/src/main/target/PORT103R/target.h +++ b/src/main/target/PORT103R/target.h @@ -115,9 +115,6 @@ #define RSSI_ADC_PIN PA1 #define EXTERNAL1_ADC_PIN PA5 -//#define LED_STRIP -//#define LED_STRIP_TIMER TIM3 - #define USE_SERIAL_4WAY_BLHELI_INTERFACE // IO - stm32f103RCT6 in 64pin package diff --git a/src/main/target/REVO/target.h b/src/main/target/REVO/target.h index d2124e5b2..3a67944b9 100644 --- a/src/main/target/REVO/target.h +++ b/src/main/target/REVO/target.h @@ -110,8 +110,6 @@ #define SENSORS_SET (SENSOR_ACC) -//#define LED_STRIP -//#define LED_STRIP_TIMER TIM5 #define DEFAULT_RX_FEATURE FEATURE_RX_PPM #define DEFAULT_FEATURES (FEATURE_BLACKBOX | FEATURE_ONESHOT125 | FEATURE_RX_SERIAL) diff --git a/src/main/target/REVONANO/target.h b/src/main/target/REVONANO/target.h index 6f4a2c431..14912fffc 100644 --- a/src/main/target/REVONANO/target.h +++ b/src/main/target/REVONANO/target.h @@ -85,12 +85,6 @@ #define VBAT_ADC_PIN PA6 #define RSSI_ADC_PIN PA5 - -//#define SENSORS_SET (SENSOR_ACC|SENSOR_MAG) - -//#define LED_STRIP -//#define LED_STRIP_TIMER TIM5 - #define GPS #define BLACKBOX #define TELEMETRY diff --git a/src/main/target/RMDO/target.h b/src/main/target/RMDO/target.h index 779b8ab6c..602609862 100644 --- a/src/main/target/RMDO/target.h +++ b/src/main/target/RMDO/target.h @@ -112,16 +112,10 @@ #define RSSI_ADC_PIN PB2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/SINGULARITY/target.h b/src/main/target/SINGULARITY/target.h index f58dcbe96..4d047843e 100644 --- a/src/main/target/SINGULARITY/target.h +++ b/src/main/target/SINGULARITY/target.h @@ -98,16 +98,10 @@ #define VBAT_SCALE_DEFAULT 77 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/SPARKY/target.h b/src/main/target/SPARKY/target.h index 58101f0b8..0913d0ec1 100644 --- a/src/main/target/SPARKY/target.h +++ b/src/main/target/SPARKY/target.h @@ -97,16 +97,9 @@ #define LED_STRIP #if 1 // LED strip configuration using PWM motor output pin 5. -#define LED_STRIP_TIMER TIM16 - #define USE_LED_STRIP_ON_DMA1_CHANNEL3 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_6 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource6 +#define WS2811_PIN PA6 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/SPRACINGF3/target.h b/src/main/target/SPRACINGF3/target.h index 7b2a365a5..840dda225 100644 --- a/src/main/target/SPRACINGF3/target.h +++ b/src/main/target/SPRACINGF3/target.h @@ -121,16 +121,10 @@ #define RSSI_ADC_PIN PB2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/SPRACINGF3EVO/target.h b/src/main/target/SPRACINGF3EVO/target.h index c4a9a0484..4adbe0d56 100755 --- a/src/main/target/SPRACINGF3EVO/target.h +++ b/src/main/target/SPRACINGF3EVO/target.h @@ -142,16 +142,9 @@ #define RSSI_ADC_PIN PB2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 - #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/SPRACINGF3MINI/target.h b/src/main/target/SPRACINGF3MINI/target.h index 93e220420..61b4bd9b5 100644 --- a/src/main/target/SPRACINGF3MINI/target.h +++ b/src/main/target/SPRACINGF3MINI/target.h @@ -150,15 +150,8 @@ #define RSSI_ADC_PIN PB2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 - -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 diff --git a/src/main/target/STM32F3DISCOVERY/target.h b/src/main/target/STM32F3DISCOVERY/target.h index 947ad4913..7664b47e0 100644 --- a/src/main/target/STM32F3DISCOVERY/target.h +++ b/src/main/target/STM32F3DISCOVERY/target.h @@ -146,14 +146,8 @@ #define EXTERNAL1_ADC_PIN PC3 #define LED_STRIP -#define LED_STRIP_TIMER TIM16 -#define WS2811_GPIO GPIOB -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB -#define WS2811_GPIO_AF GPIO_AF_1 -#define WS2811_PIN GPIO_Pin_8 // TIM16_CH1 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PB8 // TIM16_CH1 #define WS2811_TIMER TIM16 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16 #define WS2811_DMA_CHANNEL DMA1_Channel3 #define WS2811_IRQ DMA1_Channel3_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3 diff --git a/src/main/target/X_RACERSPI/target.h b/src/main/target/X_RACERSPI/target.h index 39c2e6c20..217765adc 100644 --- a/src/main/target/X_RACERSPI/target.h +++ b/src/main/target/X_RACERSPI/target.h @@ -124,16 +124,10 @@ #define RSSI_ADC_PIN PB2 #define LED_STRIP -#define LED_STRIP_TIMER TIM1 #define USE_LED_STRIP_ON_DMA1_CHANNEL2 -#define WS2811_GPIO GPIOA -#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOA -#define WS2811_GPIO_AF GPIO_AF_6 -#define WS2811_PIN GPIO_Pin_8 -#define WS2811_PIN_SOURCE GPIO_PinSource8 +#define WS2811_PIN PA8 #define WS2811_TIMER TIM1 -#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM1 #define WS2811_DMA_CHANNEL DMA1_Channel2 #define WS2811_IRQ DMA1_Channel2_IRQn #define WS2811_DMA_TC_FLAG DMA1_FLAG_TC2 From 9ed87c0d9acbe3556460516999fc4c10ee121b41 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 2 Jul 2016 14:38:46 +1000 Subject: [PATCH 2/5] FuryF3 target.c extra item in initialise --- src/main/target/FURYF3/target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/target/FURYF3/target.c b/src/main/target/FURYF3/target.c index 4dc593bb3..cfbced9c1 100644 --- a/src/main/target/FURYF3/target.c +++ b/src/main/target/FURYF3/target.c @@ -58,7 +58,7 @@ const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = { { TIM4, IO_TAG(PB7), TIM_Channel_2, TIM4_IRQn, 1, IOCFG_AF_PP, GPIO_AF_2 }, // PWM4 - S1 { TIM4, IO_TAG(PB6), TIM_Channel_1, TIM4_IRQn, 1, IOCFG_AF_PP, GPIO_AF_2 }, // PWM5 - S2 - { TIM17, IO_TAG(PB5), TIM_Channel_1, TIM1_TRG_COM_TIM17_IRQn, 1, IOCFG_AF_PP, GPIO_AF_10, 0}, // PWM6 - S3 + { TIM17, IO_TAG(PB5), TIM_Channel_1, TIM1_TRG_COM_TIM17_IRQn, 1, IOCFG_AF_PP, GPIO_AF_10}, // PWM6 - S3 { TIM16, IO_TAG(PB4), TIM_Channel_1, TIM1_UP_TIM16_IRQn, 1, IOCFG_AF_PP, GPIO_AF_1 }, // PWM7 - S4 { TIM1, IO_TAG(PA8), TIM_Channel_1, TIM1_CC_IRQn, 1, IOCFG_AF_PP, GPIO_AF_6 }, // GPIO TIMER - LED_STRIP From 7d38b510a4929efff1d380569431caccc04dff59 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 2 Jul 2016 17:30:05 +1000 Subject: [PATCH 3/5] Tabs to spaces --- src/main/drivers/timer_stm32f4xx.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/drivers/timer_stm32f4xx.c b/src/main/drivers/timer_stm32f4xx.c index 374e9164b..9b81d936a 100644 --- a/src/main/drivers/timer_stm32f4xx.c +++ b/src/main/drivers/timer_stm32f4xx.c @@ -35,20 +35,20 @@ #define CCMR_Offset ((uint16_t)0x0018) const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { - { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_TIM1 }, - { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_TIM2 }, - { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_TIM3 }, - { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_TIM4 }, - { .TIMx = TIM5, .rcc = RCC_APB1(TIM5), GPIO_AF_TIM5 }, - { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, - { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, - { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_TIM8 }, - { .TIMx = TIM9, .rcc = RCC_APB2(TIM9), GPIO_AF_TIM9 }, - { .TIMx = TIM10, .rcc = RCC_APB2(TIM10), GPIO_AF_TIM10 }, - { .TIMx = TIM11, .rcc = RCC_APB2(TIM11), GPIO_AF_TIM11 }, - { .TIMx = TIM12, .rcc = RCC_APB1(TIM12), GPIO_AF_TIM12 }, - { .TIMx = TIM13, .rcc = RCC_APB1(TIM13), GPIO_AF_TIM13 }, - { .TIMx = TIM14, .rcc = RCC_APB1(TIM14), GPIO_AF_TIM14 }, + { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_TIM1 }, + { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_TIM2 }, + { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_TIM3 }, + { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_TIM4 }, + { .TIMx = TIM5, .rcc = RCC_APB1(TIM5), GPIO_AF_TIM5 }, + { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, + { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, + { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_TIM8 }, + { .TIMx = TIM9, .rcc = RCC_APB2(TIM9), GPIO_AF_TIM9 }, + { .TIMx = TIM10, .rcc = RCC_APB2(TIM10), GPIO_AF_TIM10 }, + { .TIMx = TIM11, .rcc = RCC_APB2(TIM11), GPIO_AF_TIM11 }, + { .TIMx = TIM12, .rcc = RCC_APB1(TIM12), GPIO_AF_TIM12 }, + { .TIMx = TIM13, .rcc = RCC_APB1(TIM13), GPIO_AF_TIM13 }, + { .TIMx = TIM14, .rcc = RCC_APB1(TIM14), GPIO_AF_TIM14 }, }; void TIM_SelectOCxM_NoDisable(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) From afea1d6123f087b8cb87dc69010144e12abad66d Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 2 Jul 2016 19:37:39 +1000 Subject: [PATCH 4/5] Formatting based on feedback --- .../drivers/light_ws2811strip_stm32f4xx.c | 51 ++++++++-------- src/main/drivers/timer_stm32f4xx.c | 61 +++++++++---------- 2 files changed, 54 insertions(+), 58 deletions(-) diff --git a/src/main/drivers/light_ws2811strip_stm32f4xx.c b/src/main/drivers/light_ws2811strip_stm32f4xx.c index 7bc139c32..f1d04dfbe 100644 --- a/src/main/drivers/light_ws2811strip_stm32f4xx.c +++ b/src/main/drivers/light_ws2811strip_stm32f4xx.c @@ -96,32 +96,31 @@ void ws2811LedStripHardwareInit(void) TIM_OCInitStructure.TIM_Pulse = 0; uint32_t channelAddress = 0; - switch (WS2811_TIMER_CHANNEL) - { - case TIM_Channel_1: - TIM_OC1Init(WS2811_TIMER, &TIM_OCInitStructure); - timDMASource = TIM_DMA_CC1; - channelAddress = (uint32_t)(&WS2811_TIMER->CCR1); - TIM_OC1PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); - break; - case TIM_Channel_2: - TIM_OC2Init(WS2811_TIMER, &TIM_OCInitStructure); - timDMASource = TIM_DMA_CC2; - channelAddress = (uint32_t)(&WS2811_TIMER->CCR2); - TIM_OC2PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); - break; - case TIM_Channel_3: - TIM_OC3Init(WS2811_TIMER, &TIM_OCInitStructure); - timDMASource = TIM_DMA_CC3; - channelAddress = (uint32_t)(&WS2811_TIMER->CCR3); - TIM_OC3PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); - break; - case TIM_Channel_4: - TIM_OC4Init(WS2811_TIMER, &TIM_OCInitStructure); - timDMASource = TIM_DMA_CC4; - channelAddress = (uint32_t)(&WS2811_TIMER->CCR4); - TIM_OC4PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); - break; + switch (WS2811_TIMER_CHANNEL) { + case TIM_Channel_1: + TIM_OC1Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC1; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR1); + TIM_OC1PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_2: + TIM_OC2Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC2; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR2); + TIM_OC2PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_3: + TIM_OC3Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC3; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR3); + TIM_OC3PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; + case TIM_Channel_4: + TIM_OC4Init(WS2811_TIMER, &TIM_OCInitStructure); + timDMASource = TIM_DMA_CC4; + channelAddress = (uint32_t)(&WS2811_TIMER->CCR4); + TIM_OC4PreloadConfig(WS2811_TIMER, TIM_OCPreload_Enable); + break; } TIM_CtrlPWMOutputs(WS2811_TIMER, ENABLE); diff --git a/src/main/drivers/timer_stm32f4xx.c b/src/main/drivers/timer_stm32f4xx.c index 9b81d936a..af09f85e1 100644 --- a/src/main/drivers/timer_stm32f4xx.c +++ b/src/main/drivers/timer_stm32f4xx.c @@ -35,15 +35,15 @@ #define CCMR_Offset ((uint16_t)0x0018) const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { - { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_TIM1 }, - { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_TIM2 }, - { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_TIM3 }, - { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_TIM4 }, - { .TIMx = TIM5, .rcc = RCC_APB1(TIM5), GPIO_AF_TIM5 }, - { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, - { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, - { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_TIM8 }, - { .TIMx = TIM9, .rcc = RCC_APB2(TIM9), GPIO_AF_TIM9 }, + { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_TIM1 }, + { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_TIM2 }, + { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_TIM3 }, + { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_TIM4 }, + { .TIMx = TIM5, .rcc = RCC_APB1(TIM5), GPIO_AF_TIM5 }, + { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, + { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, + { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_TIM8 }, + { .TIMx = TIM9, .rcc = RCC_APB2(TIM9), GPIO_AF_TIM9 }, { .TIMx = TIM10, .rcc = RCC_APB2(TIM10), GPIO_AF_TIM10 }, { .TIMx = TIM11, .rcc = RCC_APB2(TIM11), GPIO_AF_TIM11 }, { .TIMx = TIM12, .rcc = RCC_APB1(TIM12), GPIO_AF_TIM12 }, @@ -53,35 +53,32 @@ const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { void TIM_SelectOCxM_NoDisable(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) { - uint32_t tmp = 0; + uint32_t tmp = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST8_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_OCM(TIM_OCMode)); + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_OCM(TIM_OCMode)); - tmp = (uint32_t) TIMx; - tmp += CCMR_Offset; + tmp = (uint32_t) TIMx; + tmp += CCMR_Offset; - if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) - { - tmp += (TIM_Channel>>1); + if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) { + tmp += (TIM_Channel>>1); - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } - else - { - tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } else { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); - } + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); + } } From a66820382c7f9a6238de3a4a2993813d306bfb6c Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 2 Jul 2016 19:47:37 +1000 Subject: [PATCH 5/5] More formatting (minor cleanup) --- src/main/drivers/timer_stm32f10x.c | 43 ++++++++++----------- src/main/drivers/timer_stm32f30x.c | 60 +++++++++++++++--------------- 2 files changed, 50 insertions(+), 53 deletions(-) diff --git a/src/main/drivers/timer_stm32f10x.c b/src/main/drivers/timer_stm32f10x.c index 27e9df381..09ef0efc8 100644 --- a/src/main/drivers/timer_stm32f10x.c +++ b/src/main/drivers/timer_stm32f10x.c @@ -57,34 +57,31 @@ const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { void TIM_SelectOCxM_NoDisable(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode) { - uint32_t tmp = 0; + uint32_t tmp = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST8_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_OCM(TIM_OCMode)); + /* Check the parameters */ + assert_param(IS_TIM_LIST8_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_OCM(TIM_OCMode)); - tmp = (uint32_t) TIMx; - tmp += CCMR_Offset; + tmp = (uint32_t) TIMx; + tmp += CCMR_Offset; - if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) - { - tmp += (TIM_Channel>>1); + if((TIM_Channel == TIM_Channel_1) ||(TIM_Channel == TIM_Channel_3)) { + tmp += (TIM_Channel>>1); - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC1M); - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } - else - { - tmp += (uint16_t)(TIM_Channel - (uint16_t)4)>> (uint16_t)1; + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } else { + tmp += (uint16_t)(TIM_Channel - (uint16_t)4) >> (uint16_t)1; - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= (uint32_t)~((uint32_t)TIM_CCMR1_OC2M); - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); - } + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint16_t)(TIM_OCMode << 8); + } } diff --git a/src/main/drivers/timer_stm32f30x.c b/src/main/drivers/timer_stm32f30x.c index baad75634..033aa316c 100644 --- a/src/main/drivers/timer_stm32f30x.c +++ b/src/main/drivers/timer_stm32f30x.c @@ -10,16 +10,16 @@ #include "timer.h" const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { - { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_6 }, - { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_1 }, - { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_2 }, - { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_10 }, - { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, - { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, - { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_5 }, - { .TIMx = TIM15, .rcc = RCC_APB2(TIM15), GPIO_AF_9 }, - { .TIMx = TIM16, .rcc = RCC_APB2(TIM16), GPIO_AF_1 }, - { .TIMx = TIM17, .rcc = RCC_APB2(TIM17), GPIO_AF_1 }, + { .TIMx = TIM1, .rcc = RCC_APB2(TIM1), GPIO_AF_6 }, + { .TIMx = TIM2, .rcc = RCC_APB1(TIM2), GPIO_AF_1 }, + { .TIMx = TIM3, .rcc = RCC_APB1(TIM3), GPIO_AF_2 }, + { .TIMx = TIM4, .rcc = RCC_APB1(TIM4), GPIO_AF_10 }, + { .TIMx = TIM6, .rcc = RCC_APB1(TIM6), 0 }, + { .TIMx = TIM7, .rcc = RCC_APB1(TIM7), 0 }, + { .TIMx = TIM8, .rcc = RCC_APB2(TIM8), GPIO_AF_5 }, + { .TIMx = TIM15, .rcc = RCC_APB2(TIM15), GPIO_AF_9 }, + { .TIMx = TIM16, .rcc = RCC_APB2(TIM16), GPIO_AF_1 }, + { .TIMx = TIM17, .rcc = RCC_APB2(TIM17), GPIO_AF_1 }, }; @@ -58,31 +58,31 @@ const timerDef_t timerDefinitions[HARDWARE_TIMER_DEFINITION_COUNT] = { void TIM_SelectOCxM_NoDisable(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint32_t TIM_OCMode) { - uint32_t tmp = 0; + uint32_t tmp = 0; - /* Check the parameters */ - assert_param(IS_TIM_LIST1_PERIPH(TIMx)); - assert_param(IS_TIM_CHANNEL(TIM_Channel)); - assert_param(IS_TIM_OCM(TIM_OCMode)); + /* Check the parameters */ + assert_param(IS_TIM_LIST1_PERIPH(TIMx)); + assert_param(IS_TIM_CHANNEL(TIM_Channel)); + assert_param(IS_TIM_OCM(TIM_OCMode)); - tmp = (uint32_t) TIMx; - tmp += CCMR_OFFSET; + tmp = (uint32_t) TIMx; + tmp += CCMR_OFFSET; - if ((TIM_Channel == TIM_Channel_1) || (TIM_Channel == TIM_Channel_3)) { - tmp += (TIM_Channel>>1); + if ((TIM_Channel == TIM_Channel_1) || (TIM_Channel == TIM_Channel_3)) { + tmp += (TIM_Channel>>1); - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC13M_MASK; + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= CCMR_OC13M_MASK; - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= TIM_OCMode; - } else { - tmp += (uint32_t)(TIM_Channel - (uint32_t)4)>> (uint32_t)1; + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= TIM_OCMode; + } else { + tmp += (uint32_t)(TIM_Channel - (uint32_t)4) >> (uint32_t)1; - /* Reset the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp &= CCMR_OC24M_MASK; + /* Reset the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp &= CCMR_OC24M_MASK; - /* Configure the OCxM bits in the CCMRx register */ - *(__IO uint32_t *) tmp |= (uint32_t)(TIM_OCMode << 8); - } + /* Configure the OCxM bits in the CCMRx register */ + *(__IO uint32_t *) tmp |= (uint32_t)(TIM_OCMode << 8); + } }