Skip to content

Commit

Permalink
Initial cut on timer cleanup and refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
digitalentity committed May 5, 2018
1 parent 9f35335 commit 5b8e89b
Show file tree
Hide file tree
Showing 16 changed files with 801 additions and 1,803 deletions.
1 change: 1 addition & 0 deletions make/mcu/STM32F3.mk
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ MCU_COMMON_SRC = \
drivers/dma.c \
drivers/serial_uart_stm32f30x.c \
drivers/system_stm32f30x.c \
drivers/timer_impl_stdperiph.c \
drivers/timer_stm32f30x.c

DSP_LIB := $(ROOT)/lib/main/CMSIS/DSP
Expand Down
2 changes: 2 additions & 0 deletions make/mcu/STM32F4.mk
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,8 @@ MCU_COMMON_SRC = \
drivers/serial_softserial.c \
drivers/serial_uart_stm32f4xx.c \
drivers/system_stm32f4xx.c \
drivers/timer.c \
drivers/timer_impl_stdperiph.c \
drivers/timer_stm32f4xx.c \
drivers/dma_stm32f4xx.c

Expand Down
4 changes: 2 additions & 2 deletions make/mcu/STM32F7.mk
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ MCU_COMMON_SRC = \
drivers/dma_stm32f7xx.c \
drivers/inverter.c \
drivers/bus_spi_hal.c \
drivers/timer_hal.c \
drivers/timer.c \
drivers/timer_impl_hal.c \
drivers/timer_stm32f7xx.c \
drivers/system_stm32f7xx.c \
drivers/serial_uart_stm32f7xx.c \
Expand All @@ -158,7 +159,6 @@ MCU_COMMON_SRC = \
MCU_EXCLUDES = \
drivers/bus_spi.c \
drivers/bus_i2c.c \
drivers/timer.c \
drivers/serial_uart.c

DSP_LIB := $(ROOT)/lib/main/CMSIS/DSP
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/light_ws2811strip_hal.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ void ws2811LedStripHardwareInit(void)

/* Compute the prescaler value */
uint16_t prescaler = timerGetPrescalerByDesiredMhz(timer, WS2811_TIMER_MHZ);
uint16_t period = timerGetPeriodByPrescaler(timer, prescaler, WS2811_CARRIER_HZ);
uint16_t period = 1000000 * WS2811_TIMER_MHZ / WS2811_CARRIER_HZ;

BIT_COMPARE_1 = period / 3 * 2;
BIT_COMPARE_0 = period / 3;
Expand Down
31 changes: 3 additions & 28 deletions src/main/drivers/light_ws2811strip_stdperiph.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,6 @@ static void WS2811_DMA_IRQHandler(dmaChannelDescriptor_t *descriptor)

void ws2811LedStripHardwareInit(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
DMA_InitTypeDef DMA_InitStructure;

const timerHardware_t *timerHardware = timerGetByTag(IO_TAG(WS2811_PIN), TIM_USE_ANY);
Expand All @@ -84,41 +82,18 @@ void ws2811LedStripHardwareInit(void)
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);

RCC_ClockCmd(timerRCC(timer), ENABLE);

// Stop timer
TIM_Cmd(timer, DISABLE);

/* Compute the prescaler value */
uint16_t prescaler = timerGetPrescalerByDesiredMhz(timer, WS2811_TIMER_MHZ);
uint16_t period = timerGetPeriodByPrescaler(timer, prescaler, WS2811_CARRIER_HZ);
uint16_t period = 1000000 * WS2811_TIMER_MHZ / WS2811_CARRIER_HZ;

BIT_COMPARE_1 = period / 3 * 2;
BIT_COMPARE_0 = period / 3;

/* Time base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = period; // 800kHz
TIM_TimeBaseStructure.TIM_Prescaler = prescaler;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(timer, &TIM_TimeBaseStructure);

/* PWM1 Mode configuration */
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
if (timerHardware->output & TIMER_OUTPUT_N_CHANNEL) {
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
} else {
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
}
TIM_OCInitStructure.TIM_OCPolarity = (timerHardware->output & TIMER_OUTPUT_INVERTED) ? TIM_OCPolarity_Low : TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_Pulse = 0;

timerOCInit(timer, timerHardware->channel, &TIM_OCInitStructure);
timerOCPreloadConfig(timer, timerHardware->channel, TIM_OCPreload_Enable);
timerConfigBase(timer, period, WS2811_TIMER_MHZ);
timerPWMConfigChannel(timer, timerHardware->channel, timerHardware->output & TIMER_OUTPUT_N_CHANNEL, timerHardware->output & TIMER_OUTPUT_INVERTED, 0);

TIM_CtrlPWMOutputs(timer, ENABLE);
TIM_ARRPreloadConfig(timer, ENABLE);
Expand Down
79 changes: 5 additions & 74 deletions src/main/drivers/pwm_output.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,87 +62,18 @@ static uint8_t allocatedOutputPortCount = 0;

static bool pwmMotorsEnabled = true;


static void pwmOCConfig(TIM_TypeDef *tim, uint8_t channel, uint16_t value, uint8_t output)
{
#if defined(USE_HAL_DRIVER)
TIM_HandleTypeDef* Handle = timerFindTimerHandle(tim);
if (Handle == NULL) return;

TIM_OC_InitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;
TIM_OCInitStructure.OCPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCPOLARITY_LOW : TIM_OCPOLARITY_HIGH;
TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_SET;
TIM_OCInitStructure.OCNPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCNPOLARITY_LOW : TIM_OCNPOLARITY_HIGH;
TIM_OCInitStructure.Pulse = value;
TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;

HAL_TIM_PWM_ConfigChannel(Handle, &TIM_OCInitStructure, channel);
#else
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
if (output & TIMER_OUTPUT_N_CHANNEL) {
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCNPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCPolarity_Low : TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
} else {
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = (output & TIMER_OUTPUT_INVERTED) ? TIM_OCPolarity_Low : TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
}
TIM_OCInitStructure.TIM_Pulse = value;

timerOCInit(tim, channel, &TIM_OCInitStructure);
timerOCPreloadConfig(tim, channel, TIM_OCPreload_Enable);
#endif
}

static void pwmOutConfigTimer(pwmOutputPort_t * p, const timerHardware_t *timerHardware, uint8_t mhz, uint16_t period, uint16_t value)
{
#if defined(USE_HAL_DRIVER)
TIM_HandleTypeDef* Handle = timerFindTimerHandle(timerHardware->tim);
if (Handle == NULL) return;
#endif
timerConfigBase(timerHardware->tim, period, mhz);
timerPWMConfigChannel(timerHardware->tim, timerHardware->channel, timerHardware->output & TIMER_OUTPUT_N_CHANNEL, timerHardware->output & TIMER_OUTPUT_INVERTED, value);

configTimeBase(timerHardware->tim, period, mhz);
pwmOCConfig(timerHardware->tim, timerHardware->channel, value, timerHardware->output);

#if defined(USE_HAL_DRIVER)
if (timerHardware->output & TIMER_OUTPUT_N_CHANNEL)
HAL_TIMEx_PWMN_Start(Handle, timerHardware->channel);
else
HAL_TIM_PWM_Start(Handle, timerHardware->channel);
HAL_TIM_Base_Start(Handle);

switch (timerHardware->channel) {
case TIM_CHANNEL_1:
p->ccr = &timerHardware->tim->CCR1;
break;
case TIM_CHANNEL_2:
p->ccr = &timerHardware->tim->CCR2;
break;
case TIM_CHANNEL_3:
p->ccr = &timerHardware->tim->CCR3;
break;
case TIM_CHANNEL_4:
p->ccr = &timerHardware->tim->CCR4;
break;
}
#else
if (timerHardware->output & TIMER_OUTPUT_ENABLED) {
TIM_CtrlPWMOutputs(timerHardware->tim, ENABLE);
timerPWMStart(timerHardware->tim, timerHardware->channel, timerHardware->output & TIMER_OUTPUT_N_CHANNEL);
}
TIM_Cmd(timerHardware->tim, ENABLE);

p->ccr = timerCCR(timerHardware->tim, timerHardware->channel);
#endif
timerEnable(timerHardware->tim);

p->ccr = timerCCR(timerHardware->tim, timerHardware->channel);
p->period = period;
p->tim = timerHardware->tim;

Expand Down
Loading

0 comments on commit 5b8e89b

Please sign in to comment.