Skip to content

Commit a0fd4b5

Browse files
committed
fix(hardwaretimer): timer channel N HALv2 support
Signed-off-by: Frederic Pillon <frederic.pillon@st.com>
1 parent 5e5f665 commit a0fd4b5

3 files changed

Lines changed: 55 additions & 21 deletions

File tree

libraries/SrcWrapper/inc/HardwareTimer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ class HardwareTimer {
215215
// The following function(s) are available for more advanced timer options
216216
#if defined(USE_HALV2_DRIVER)
217217
hal_tim_handle_t *getHandle(); // return the handle address for HAL related configuration
218-
hal_tim_channel_t getChannel(uint32_t channel);
218+
hal_tim_channel_t getChannel(uint32_t channel, bool complementary = false);
219219
#else
220220
TIM_HandleTypeDef *getHandle(); // return the handle address for HAL related configuration
221221
uint32_t getChannel(uint32_t channel);

libraries/SrcWrapper/src/HardwareTimer.cpp

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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,
789806
void 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
}

libraries/SrcWrapper/src/stm32/timer.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ timerObj_t *get_timer_obj(TIM_HandleTypeDef *htim)
3434
return (obj);
3535
}
3636

37-
#if defined(USE_HALV2_DRIVER)
38-
#else
37+
#if !defined(USE_HALV2_DRIVER)
3938
/**
4039
* @brief TIMER Initialization - clock init and nvic init
4140
* @param htim_base: TIM handle
@@ -830,18 +829,36 @@ hal_tim_channel_t getTimerChannel(PinName pin)
830829
{
831830
uint32_t function = pinmap_function(pin, PinMap_TIM);
832831
hal_tim_channel_t channel = -1;
832+
bool inverted = STM_PIN_INVERTED(function);
833+
833834
switch (STM_PIN_CHANNEL(function)) {
834835
case 1:
835-
channel = HAL_TIM_CHANNEL_1;
836+
if (inverted) {
837+
channel = HAL_TIM_CHANNEL_1N;
838+
} else {
839+
channel = HAL_TIM_CHANNEL_1;
840+
}
836841
break;
837842
case 2:
838-
channel = HAL_TIM_CHANNEL_2;
843+
if (inverted) {
844+
channel = HAL_TIM_CHANNEL_2N;
845+
} else {
846+
channel = HAL_TIM_CHANNEL_2;
847+
}
839848
break;
840849
case 3:
841-
channel = HAL_TIM_CHANNEL_3;
850+
if (inverted) {
851+
channel = HAL_TIM_CHANNEL_3N;
852+
} else {
853+
channel = HAL_TIM_CHANNEL_3;
854+
}
842855
break;
843856
case 4:
844-
channel = HAL_TIM_CHANNEL_4;
857+
if (inverted) {
858+
channel = HAL_TIM_CHANNEL_4N;
859+
} else {
860+
channel = HAL_TIM_CHANNEL_4;
861+
}
845862
break;
846863
default:
847864
_Error_Handler("TIM: Unknown timer channel", (int)(STM_PIN_CHANNEL(function)));

0 commit comments

Comments
 (0)