2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
21 #include "drivers/io.h"
22 #include "drivers/pwm_mapping.h"
24 const uint16_t multiPPM
[] = {
25 PWM6
| (MAP_TO_PPM_INPUT
<< 8), // PPM input
26 PWM7
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
27 PWM8
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
28 PWM9
| (MAP_TO_MOTOR_OUTPUT
<< 8),
29 PWM10
| (MAP_TO_MOTOR_OUTPUT
<< 8),
30 PWM11
| (MAP_TO_MOTOR_OUTPUT
<< 8),
31 PWM12
| (MAP_TO_MOTOR_OUTPUT
<< 8),
32 PWM2
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
33 PWM3
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
34 PWM4
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
35 PWM5
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
36 PWM1
| (MAP_TO_MOTOR_OUTPUT
<< 8), // Swap to servo if needed
40 const uint16_t multiPWM
[] = {
41 PWM1
| (MAP_TO_PWM_INPUT
<< 8), // input #1
42 PWM2
| (MAP_TO_PWM_INPUT
<< 8),
43 PWM3
| (MAP_TO_PWM_INPUT
<< 8),
44 PWM4
| (MAP_TO_PWM_INPUT
<< 8),
45 PWM5
| (MAP_TO_PWM_INPUT
<< 8),
46 PWM6
| (MAP_TO_PWM_INPUT
<< 8), // input #6
47 PWM7
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #1 or servo #1 (swap to servo if needed)
48 PWM8
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #2 or servo #2 (swap to servo if needed)
49 PWM9
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #1 or #3
50 PWM10
| (MAP_TO_MOTOR_OUTPUT
<< 8),
51 PWM11
| (MAP_TO_MOTOR_OUTPUT
<< 8),
52 PWM12
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #4 or #6
56 const uint16_t airPPM
[] = {
57 PWM6
| (MAP_TO_PPM_INPUT
<< 8), // PPM input
58 PWM7
| (MAP_TO_MOTOR_OUTPUT
<< 8),
59 PWM8
| (MAP_TO_MOTOR_OUTPUT
<< 8),
60 PWM9
| (MAP_TO_SERVO_OUTPUT
<< 8),
61 PWM10
| (MAP_TO_SERVO_OUTPUT
<< 8),
62 PWM11
| (MAP_TO_SERVO_OUTPUT
<< 8),
63 PWM12
| (MAP_TO_SERVO_OUTPUT
<< 8),
64 PWM2
| (MAP_TO_SERVO_OUTPUT
<< 8),
65 PWM3
| (MAP_TO_SERVO_OUTPUT
<< 8),
66 PWM4
| (MAP_TO_SERVO_OUTPUT
<< 8),
67 PWM5
| (MAP_TO_SERVO_OUTPUT
<< 8),
68 PWM1
| (MAP_TO_SERVO_OUTPUT
<< 8),
72 const uint16_t airPWM
[] = {
73 PWM1
| (MAP_TO_PWM_INPUT
<< 8), // input #1
74 PWM2
| (MAP_TO_PWM_INPUT
<< 8),
75 PWM3
| (MAP_TO_PWM_INPUT
<< 8),
76 PWM4
| (MAP_TO_PWM_INPUT
<< 8),
77 PWM5
| (MAP_TO_PWM_INPUT
<< 8),
78 PWM6
| (MAP_TO_PWM_INPUT
<< 8), // input #6
79 PWM7
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #1
80 PWM8
| (MAP_TO_MOTOR_OUTPUT
<< 8), // motor #2
81 PWM9
| (MAP_TO_SERVO_OUTPUT
<< 8), // servo #1
82 PWM10
| (MAP_TO_SERVO_OUTPUT
<< 8), // servo #2
83 PWM11
| (MAP_TO_SERVO_OUTPUT
<< 8), // servo #3
84 PWM12
| (MAP_TO_SERVO_OUTPUT
<< 8), // servo #4
88 const timerHardware_t timerHardware
[USABLE_TIMER_CHANNEL_COUNT
] = {
89 { TIM12
, IO_TAG(PB14
), TIM_Channel_1
, TIM8_BRK_TIM12_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM12
}, // PPM (5th pin on FlexiIO port)
90 { TIM12
, IO_TAG(PB15
), TIM_Channel_2
, TIM8_BRK_TIM12_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM12
}, // S2_IN - GPIO_PartialRemap_TIM3
91 { TIM8
, IO_TAG(PC6
), TIM_Channel_1
, TIM8_CC_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM8
}, // S3_IN
92 { TIM8
, IO_TAG(PC7
), TIM_Channel_2
, TIM8_CC_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM8
}, // S4_IN
93 { TIM8
, IO_TAG(PC8
), TIM_Channel_3
, TIM8_CC_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM8
}, // S5_IN
94 { TIM8
, IO_TAG(PC9
), TIM_Channel_4
, TIM8_CC_IRQn
, 0, IOCFG_IPD
, GPIO_AF_TIM8
}, // S6_IN
95 { TIM3
, IO_TAG(PB0
), TIM_Channel_3
, TIM3_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM3
}, // S1_OUT
96 { TIM3
, IO_TAG(PB1
), TIM_Channel_4
, TIM3_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM3
}, // S2_OUT
97 { TIM9
, IO_TAG(PA3
), TIM_Channel_2
, TIM1_BRK_TIM9_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM9
}, // S3_OUT
98 { TIM2
, IO_TAG(PA2
), TIM_Channel_3
, TIM2_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM2
}, // S4_OUT
99 { TIM5
, IO_TAG(PA1
), TIM_Channel_2
, TIM5_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM5
}, // S5_OUT - GPIO_PartialRemap_TIM3
100 { TIM5
, IO_TAG(PA0
), TIM_Channel_1
, TIM5_IRQn
, 1, IOCFG_AF_PP_PD
, GPIO_AF_TIM5
}, // S6_OUT