3131/* Private Defines */
3232#define PIN_NOT_USED 0xFF
3333#define MAX_RELOAD ((1 << 16 ) - 1 ) // Currently even 32b timers are used as 16b to have generic behavior
34+ #define REGULAR_CHAN_MASK 0x0F
35+ #define COMPLEMENTARY_CHAN_MASK 0xF0
3436
3537/* Private Variables */
3638timerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL };
@@ -111,9 +113,7 @@ void HardwareTimer::setup(TIM_TypeDef *instance)
111113
112114 // Initialize channel mode and complementary
113115 for (int i = 0 ; i < TIMER_CHANNELS; i++) {
114- #if defined(TIM_CCER_CC1NE)
115- isComplementaryChannel[i] = false ;
116- #endif
116+ configuredChannels[i] = 0x00 ;
117117 _ChannelMode[i] = TIMER_DISABLED;
118118 }
119119
@@ -190,11 +190,11 @@ void HardwareTimer::pauseChannel(uint32_t channel)
190190 /* Starting from G4, new Channel state implementation prevents to restart a channel,
191191 if the channel has not been explicitly be stopped with HAL interface */
192192#if defined(TIM_CHANNEL_N_STATE_SET)
193- if (isComplementaryChannel [channel - 1 ]) {
193+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
194194 TIM_CHANNEL_N_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
195- } else
195+ }
196196#endif
197- {
197+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
198198 TIM_CHANNEL_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
199199 }
200200#endif
@@ -260,15 +260,16 @@ int HardwareTimer::getChannel(uint32_t channel)
260260}
261261
262262/* *
263- * @brief Convert arduino channel into LL channel
263+ * @brief Convert configured arduino channel into LL channels (regular and/or complementary)
264264 * @param Arduino channel [1..4]
265265 * @retval LL channel. return -1 if arduino channel is invalid
266266 */
267267int HardwareTimer::getLLChannel (uint32_t channel)
268268{
269- uint32_t return_value;
269+ int return_value = 0 ;
270+
270271#if defined(TIM_CCER_CC1NE)
271- if (isComplementaryChannel [channel - 1 ]) {
272+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
272273 // Complementary channel
273274 switch (channel) {
274275 case 1 :
@@ -288,22 +289,22 @@ int HardwareTimer::getLLChannel(uint32_t channel)
288289 default :
289290 return_value = -1 ;
290291 }
291- } else
292+ }
292293#endif
293- {
294+ if ((return_value != - 1 ) && (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK)) {
294295 // Regular channel not complementary
295296 switch (channel) {
296297 case 1 :
297- return_value = LL_TIM_CHANNEL_CH1;
298+ return_value | = LL_TIM_CHANNEL_CH1;
298299 break ;
299300 case 2 :
300- return_value = LL_TIM_CHANNEL_CH2;
301+ return_value | = LL_TIM_CHANNEL_CH2;
301302 break ;
302303 case 3 :
303- return_value = LL_TIM_CHANNEL_CH3;
304+ return_value | = LL_TIM_CHANNEL_CH3;
304305 break ;
305306 case 4 :
306- return_value = LL_TIM_CHANNEL_CH4;
307+ return_value | = LL_TIM_CHANNEL_CH4;
307308 break ;
308309 default :
309310 return_value = -1 ;
@@ -401,11 +402,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
401402 case TIMER_OUTPUT_COMPARE_PWM1:
402403 case TIMER_OUTPUT_COMPARE_PWM2: {
403404#if defined(TIM_CCER_CC1NE)
404- if (isComplementaryChannel [channel - 1 ]) {
405+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
405406 HAL_TIMEx_PWMN_Start (&(_timerObj.handle ), timChannel);
406- } else
407+ }
407408#endif
408- {
409+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
409410 HAL_TIM_PWM_Start (&(_timerObj.handle ), timChannel);
410411 }
411412 }
@@ -416,11 +417,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
416417 case TIMER_OUTPUT_COMPARE_FORCED_ACTIVE:
417418 case TIMER_OUTPUT_COMPARE_FORCED_INACTIVE: {
418419#if defined(TIM_CCER_CC1NE)
419- if (isComplementaryChannel [channel - 1 ]) {
420+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
420421 HAL_TIMEx_OCN_Start (&(_timerObj.handle ), timChannel);
421- } else
422+ }
422423#endif
423- {
424+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
424425 HAL_TIM_OC_Start (&(_timerObj.handle ), timChannel);
425426 }
426427 }
@@ -724,13 +725,18 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
724725 HAL_TIM_IC_ConfigChannel (&(_timerObj.handle ), &channelIC, timChannel);
725726 break ;
726727 case TIMER_INPUT_FREQ_DUTY_MEASUREMENT:
728+ // Check if regular channel
729+ if (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) {
730+ Error_Handler ();
731+ }
727732 // Configure 1st channel
728733 channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
729734 channelIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
730735 HAL_TIM_IC_ConfigChannel (&(_timerObj.handle ), &channelIC, timChannel);
731736
732737 // Identify and configure 2nd associated channel
733738 timAssociatedInputChannel = getAssociatedChannel (channel);
739+ configuredChannels[timAssociatedInputChannel - 1 ] |= 0x01 ;
734740 _ChannelMode[timAssociatedInputChannel - 1 ] = mode;
735741 channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
736742 channelIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
@@ -759,9 +765,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
759765 Error_Handler ();
760766 }
761767
762- #if defined(TIM_CCER_CC1NE)
763- isComplementaryChannel[channel - 1 ] = STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM));
764- #endif
768+ configuredChannels[channel - 1 ] |= (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) ? 0x10 : 0x01 ;
765769 }
766770}
767771
0 commit comments