@@ -291,22 +291,38 @@ void HardwareTimer::resume(void)
291291 * @retval HAL channel. Error handler called if arduino channel is invalid
292292 */
293293#if defined(USE_HALV2_DRIVER)
294- hal_tim_channel_t HardwareTimer::getChannel (uint32_t channel)
294+ hal_tim_channel_t HardwareTimer::getChannel (uint32_t channel, bool complementary )
295295{
296296 hal_tim_channel_t timChannel = HAL_TIM_CHANNEL_1 ;
297297
298298 switch (channel) {
299299 case 1 :
300- timChannel = HAL_TIM_CHANNEL_1 ;
300+ if (complementary) {
301+ timChannel = HAL_TIM_CHANNEL_1N ;
302+ } else {
303+ timChannel = HAL_TIM_CHANNEL_1 ;
304+ }
301305 break ;
302306 case 2 :
303- timChannel = HAL_TIM_CHANNEL_2 ;
307+ if (complementary) {
308+ timChannel = HAL_TIM_CHANNEL_2N ;
309+ } else {
310+ timChannel = HAL_TIM_CHANNEL_2 ;
311+ }
304312 break ;
305313 case 3 :
306- timChannel = HAL_TIM_CHANNEL_3 ;
314+ if (complementary) {
315+ timChannel = HAL_TIM_CHANNEL_3N ;
316+ } else {
317+ timChannel = HAL_TIM_CHANNEL_3 ;
318+ }
307319 break ;
308320 case 4 :
309- timChannel = HAL_TIM_CHANNEL_4 ;
321+ if (complementary) {
322+ timChannel = HAL_TIM_CHANNEL_4N ;
323+ } else {
324+ timChannel = HAL_TIM_CHANNEL_4 ;
325+ }
310326 break ;
311327 default :
312328 Error_Handler ();
@@ -507,6 +523,7 @@ void HardwareTimer::resumeChannel(uint32_t channel)
507523{
508524#if defined(USE_HALV2_DRIVER)
509525 hal_tim_channel_t timChannel = getChannel (channel);
526+ hal_tim_channel_t timChannelN = getChannel (channel, true );
510527#else
511528 uint32_t timChannel = getChannel (channel);
512529#endif
@@ -523,10 +540,10 @@ void HardwareTimer::resumeChannel(uint32_t channel)
523540#if defined(TIM_CCER_CC1NE)
524541 if (__ChannelsUsed[channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
525542#if defined(USE_HALV2_DRIVER)
526- HAL_TIM_OC_StartChannel (&_timerObj.handle , timChannel );
543+ HAL_TIM_OC_StartChannel (&_timerObj.handle , timChannelN );
527544 HAL_TIM_Start (&_timerObj.handle );
528545#else
529- HAL_TIMEx_PWMN_Start (&(_timerObj.handle ), timChannel );
546+ HAL_TIMEx_PWMN_Start (&(_timerObj.handle ), timChannelN );
530547#endif
531548 }
532549#endif
@@ -548,10 +565,10 @@ void HardwareTimer::resumeChannel(uint32_t channel)
548565#if defined(TIM_CCER_CC1NE)
549566 if (__ChannelsUsed[channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
550567#if defined(USE_HALV2_DRIVER)
551- HAL_TIM_OC_StartChannel (&_timerObj.handle , timChannel );
568+ HAL_TIM_OC_StartChannel (&_timerObj.handle , timChannelN );
552569 HAL_TIM_Start (&_timerObj.handle );
553570#else
554- HAL_TIMEx_OCN_Start (&(_timerObj.handle ), timChannel );
571+ HAL_TIMEx_OCN_Start (&(_timerObj.handle ), timChannelN );
555572#endif
556573 }
557574#endif
@@ -789,9 +806,9 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, pin_size_t pin,
789806void HardwareTimer::setMode (uint32_t channel, TimerModes_t mode, PinName pin, ChannelInputFilter_t filter)
790807{
791808 uint32_t timAssociatedInputChannel;
792-
809+ bool inverted = (pin != NC ) ? STM_PIN_INVERTED ( pinmap_function (pin, PinMap_TIM)) : false ;
793810#if defined(USE_HALV2_DRIVER)
794- hal_tim_channel_t timChannel = getChannel (channel);
811+ hal_tim_channel_t timChannel = (inverted) ? getChannel (channel, true ) : getChannel (channel, false );
795812 hal_tim_oc_compare_unit_t oc_compare_unit = hal_tim_oc_channel_to_compare_unit (timChannel);
796813 hal_tim_oc_compare_unit_config_t oc_cu_config;
797814 hal_tim_oc_channel_config_t oc_channel_config;
@@ -886,7 +903,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
886903 break ;
887904 case TIMER_INPUT_FREQ_DUTY_MEASUREMENT :
888905 // Check if regular channel
889- if (STM_PIN_INVERTED ( pinmap_function (pin, PinMap_TIM)) ) {
906+ if (inverted ) {
890907 Error_Handler ();
891908 }
892909 // Configure 1st channel
@@ -995,7 +1012,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
9951012 break ;
9961013 case TIMER_INPUT_FREQ_DUTY_MEASUREMENT :
9971014 // Check if regular channel
998- if (STM_PIN_INVERTED ( pinmap_function (pin, PinMap_TIM)) ) {
1015+ if (inverted ) {
9991016 Error_Handler ();
10001017 }
10011018 // Configure 1st channel
@@ -1034,7 +1051,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
10341051 Error_Handler ();
10351052 }
10361053
1037- __ChannelsUsed[channel - 1 ] |= (STM_PIN_INVERTED ( pinmap_function (pin, PinMap_TIM)) ) ? COMPLEMENTARY_CHAN_MASK : REGULAR_CHAN_MASK ;
1054+ __ChannelsUsed[channel - 1 ] |= (inverted ) ? COMPLEMENTARY_CHAN_MASK : REGULAR_CHAN_MASK ;
10381055 }
10391056 }
10401057}
0 commit comments