1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-15 12:25:20 +03:00

STM32F30x - Working parallel PWM. Timer IRQ handle was not defined for

TIM8 correctly. Software serial conficted with parallel PWM input. Fixed
crash due to incorrect timerConfig index calculation code.

The crash occurred when capture compare interrupt handlers attempted to
call an invalid callback.

Note: the crash does not affect existing baseflight code since the
formula is OK when using a 2 dimensional array with equal dimensions.

Formula details here:
https://docs.google.com/spreadsheets/d/1UuxnC0VKiprvt1wt3KXffefEWJUb_-ILFLQuP377Anw
This commit is contained in:
Dominic Clifton 2014-05-02 17:09:41 +01:00
parent fbe2f82c05
commit 92bed4a33d
10 changed files with 82 additions and 82 deletions

View file

@ -1,6 +1,8 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include "platform.h"
@ -75,48 +77,25 @@ static const TIM_TypeDef *timers[MAX_TIMERS] = {
#endif
// Parallel PWM Inputs
// RX1 TIM1_CH1 PA8
// RX2 TIM16_CH1 PB8
// RX3 TIM17_CH1 PB9
// RX4 TIM8_CH1 PC6
// RX5 TIM8_CH2 PC7
// RX6 TIM8_CH3 PC8
// RX7 TIM15_CH1 PF9
// RX8 TIM15_CH2 PF10
// Servo PWM1 TIM3_CH3 PB0
// Servo PWM2 TIM3_CH4 PB1
// Servo PWM3 TIM3_CH2 PA4
// ESC PWM1 TIM4_CH1 PD12
// ESC PWM2 TIM4_CH2 PD13
// ESC PWM3 TIM4_CH3 PD14
// ESC PWM4 TIM4_CH4 PD15
// ESC PWM5 TIM2_CH2 PA1
// ESC PWM6 TIM2_CH3 PA2
#if defined(STM32F303xC) || defined(STM32F3DISCOVERY)
const timerHardware_t timerHardware[USABLE_TIMER_CHANNEL_COUNT] = {
{ TIM1, GPIOA, Pin_8, TIM_Channel_1, TIM1_CC_IRQn, 1, Mode_AF_PP}, // PWM1
{ TIM16, GPIOB, Pin_8, TIM_Channel_1, TIM1_UP_TIM16_IRQn, 0, Mode_AF_PP}, // PWM2
{ TIM17, GPIOB, Pin_9, TIM_Channel_1, TIM1_TRG_COM_TIM17_IRQn, 0, Mode_AF_PP}, // PWM3
{ TIM8, GPIOC, Pin_6, TIM_Channel_1, TIM8_CC_IRQn, 1, Mode_AF_PP}, // PWM4
{ TIM8, GPIOC, Pin_7, TIM_Channel_2, TIM8_CC_IRQn, 1, Mode_AF_PP}, // PWM5
{ TIM8, GPIOC, Pin_8, TIM_Channel_3, TIM8_CC_IRQn, 1, Mode_AF_PP}, // PWM6
//{ TIM15, GPIOF, Pin_9, TIM_Channel_1, TIM1_BRK_TIM15_IRQn, 0, }, // PWM1 - Potential alternate, untested
//{ TIM15, GPIOF, Pin_10, TIM_Channel_2, TIM1_BRK_TIM15_IRQn, 0, }, // PWM1 - Potential alternate, untested
{ TIM3, GPIOB, Pin_1, TIM_Channel_4, TIM3_IRQn, 0, Mode_AF_PP}, // PWM7
{ TIM3, GPIOA, Pin_4, TIM_Channel_2, TIM3_IRQn, 0, Mode_AF_PP}, // PWM8
{ TIM4, GPIOD, Pin_12, TIM_Channel_1, TIM4_IRQn, 0, Mode_AF_PP}, // PWM9
{ TIM4, GPIOD, Pin_13, TIM_Channel_2, TIM4_IRQn, 0, Mode_AF_PP}, // PWM10
{ TIM4, GPIOD, Pin_14, TIM_Channel_3, TIM4_IRQn, 0, Mode_AF_PP}, // PWM11
{ TIM4, GPIOD, Pin_15, TIM_Channel_4, TIM4_IRQn, 0, Mode_AF_PP}, // PWM12
{ TIM2, GPIOA, Pin_1, TIM_Channel_2, TIM2_IRQn, 0, Mode_AF_PP}, // PWM13
{ TIM2, GPIOA, Pin_2, TIM_Channel_3, TIM2_IRQn, 0, Mode_AF_PP}, // PWM14
{ TIM1, GPIOA, Pin_8, TIM_Channel_1, TIM1_CC_IRQn, 1, Mode_AF_PP_PD}, // PWM1 - PA8
{ TIM16, GPIOB, Pin_8, TIM_Channel_1, TIM1_UP_TIM16_IRQn, 0, Mode_AF_PP_PD}, // PWM2 - PB8
{ TIM17, GPIOB, Pin_9, TIM_Channel_1, TIM1_TRG_COM_TIM17_IRQn, 0, Mode_AF_PP_PD}, // PWM3 - PB9
{ TIM8, GPIOC, Pin_6, TIM_Channel_1, TIM8_CC_IRQn, 1, Mode_AF_PP_PD}, // PWM4 - PC6
{ TIM8, GPIOC, Pin_7, TIM_Channel_2, TIM8_CC_IRQn, 1, Mode_AF_PP_PD}, // PWM5 - PC7
{ TIM8, GPIOC, Pin_8, TIM_Channel_3, TIM8_CC_IRQn, 1, Mode_AF_PP_PD}, // PWM6 - PC8
{ TIM3, GPIOB, Pin_1, TIM_Channel_4, TIM3_IRQn, 0, Mode_AF_PP_PD}, // PWM7 - PB1
{ TIM3, GPIOA, Pin_4, TIM_Channel_2, TIM3_IRQn, 0, Mode_AF_PP_PD}, // PWM8 - PA2
//{ TIM15, GPIOF, Pin_9, TIM_Channel_1, TIM1_BRK_TIM15_IRQn, 0, }, // PWMx - PF9 Potential alternate, untested
//{ TIM15, GPIOF, Pin_10, TIM_Channel_2, TIM1_BRK_TIM15_IRQn, 0, }, // PWMx - PF10 Potential alternate, untested
{ TIM4, GPIOD, Pin_12, TIM_Channel_1, TIM4_IRQn, 0, Mode_AF_PP}, // PWM9 - PD12
{ TIM4, GPIOD, Pin_13, TIM_Channel_2, TIM4_IRQn, 0, Mode_AF_PP}, // PWM10 - PD13
{ TIM4, GPIOD, Pin_14, TIM_Channel_3, TIM4_IRQn, 0, Mode_AF_PP}, // PWM11 - PD14
{ TIM4, GPIOD, Pin_15, TIM_Channel_4, TIM4_IRQn, 0, Mode_AF_PP}, // PWM12 - PD15
{ TIM2, GPIOA, Pin_1, TIM_Channel_2, TIM2_IRQn, 0, Mode_AF_PP}, // PWM13 - PA1
{ TIM2, GPIOA, Pin_2, TIM_Channel_3, TIM2_IRQn, 0, Mode_AF_PP}, // PWM14 - PA2
};
#define MAX_TIMERS 7
@ -127,7 +106,7 @@ static const TIM_TypeDef *timers[MAX_TIMERS] = {
#endif
#define CC_CHANNELS_PER_TIMER 4 // TIM_Channel_1..4
static const uint8_t channels[CC_CHANNELS_PER_TIMER] = {
static const uint16_t channels[CC_CHANNELS_PER_TIMER] = {
TIM_Channel_1, TIM_Channel_2, TIM_Channel_3, TIM_Channel_4
};
@ -149,7 +128,7 @@ static uint8_t lookupTimerIndex(const TIM_TypeDef *tim)
return timerIndex;
}
static uint8_t lookupChannelIndex(const uint8_t channel)
static uint8_t lookupChannelIndex(const uint16_t channel)
{
uint8_t channelIndex = 0;
while (channels[channelIndex] != channel) {
@ -158,11 +137,16 @@ static uint8_t lookupChannelIndex(const uint8_t channel)
return channelIndex;
}
static uint8_t lookupTimerConfigIndex(TIM_TypeDef *tim, const uint16_t channel)
{
return lookupTimerIndex(tim) + (MAX_TIMERS * lookupChannelIndex(channel));
}
void configureTimerChannelCallback(TIM_TypeDef *tim, uint8_t channel, uint8_t reference, timerCCCallbackPtr *callback)
{
assert_param(IS_TIM_CHANNEL(channel));
uint8_t timerConfigIndex = (lookupTimerIndex(tim) * MAX_TIMERS) + lookupChannelIndex(channel);
uint8_t timerConfigIndex = lookupTimerConfigIndex(tim, channel);
if (timerConfigIndex >= MAX_TIMERS * CC_CHANNELS_PER_TIMER) {
return;
@ -232,16 +216,15 @@ void timerConfigure(const timerHardware_t *timerHardwarePtr, uint16_t period, ui
timerNVICConfigure(timerHardwarePtr->irq);
}
timerConfig_t *findTimerConfig(TIM_TypeDef *tim, uint8_t channel)
timerConfig_t *findTimerConfig(TIM_TypeDef *tim, uint16_t channel)
{
uint8_t timerConfigIndex = (lookupTimerIndex(tim) * MAX_TIMERS) + lookupChannelIndex(channel);
uint8_t timerConfigIndex = lookupTimerConfigIndex(tim, channel);
return &(timerConfig[timerConfigIndex]);
}
static void timCCxHandler(TIM_TypeDef *tim)
{
uint16_t capture;
captureCompare_t capture;
timerConfig_t *timerConfig;
uint8_t channelIndex = 0;
@ -300,7 +283,7 @@ void TIM4_IRQHandler(void)
}
#if defined(STM32F303xC) || defined(STM32F3DISCOVERY)
void TIM8_IRQHandler(void)
void TIM8_CC_IRQHandler(void)
{
timCCxHandler(TIM8);
}
@ -322,3 +305,8 @@ void TIM1_TRG_COM_TIM17_IRQHandler(void)
timCCxHandler(TIM17);
}
#endif
void timerInit(void)
{
memset(timerConfig, 0, sizeof (timerConfig));
}