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 0x01
35+ #define COMPLEMENTARY_CHAN_MASK 0x10
3436
3537/* Private Variables */
3638timerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL };
@@ -73,9 +75,6 @@ HardwareTimer::HardwareTimer(TIM_TypeDef *instance)
7375void HardwareTimer::setup (TIM_TypeDef *instance)
7476{
7577 uint32_t index = get_timer_index (instance);
76- if (index == UNKNOWN_TIMER) {
77- Error_Handler ();
78- }
7978
8079 // Already initialized?
8180 if (_timerObj.handle .Instance ) {
@@ -111,9 +110,7 @@ void HardwareTimer::setup(TIM_TypeDef *instance)
111110
112111 // Initialize channel mode and complementary
113112 for (int i = 0 ; i < TIMER_CHANNELS; i++) {
114- #if defined(TIM_CCER_CC1NE)
115- isComplementaryChannel[i] = false ;
116- #endif
113+ __ChannelsUsed[i] = 0x00 ;
117114 _ChannelMode[i] = TIMER_DISABLED;
118115 }
119116
@@ -174,14 +171,7 @@ void HardwareTimer::pauseChannel(uint32_t channel)
174171
175172 int timAssociatedInputChannel;
176173 int LLChannel = getLLChannel (channel);
177- if (LLChannel == -1 ) {
178- Error_Handler ();
179- }
180-
181174 int interrupt = getIT (channel);
182- if (interrupt == -1 ) {
183- Error_Handler ();
184- }
185175
186176 // Disable channel and corresponding interrupt
187177 __HAL_TIM_DISABLE_IT (&(_timerObj.handle ), interrupt);
@@ -190,11 +180,11 @@ void HardwareTimer::pauseChannel(uint32_t channel)
190180 /* Starting from G4, new Channel state implementation prevents to restart a channel,
191181 if the channel has not been explicitly be stopped with HAL interface */
192182#if defined(TIM_CHANNEL_N_STATE_SET)
193- if (isComplementaryChannel [channel - 1 ]) {
183+ if (__ChannelsUsed [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
194184 TIM_CHANNEL_N_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
195- } else
185+ }
196186#endif
197- {
187+ if (__ChannelsUsed[channel - 1 ] & REGULAR_CHAN_MASK) {
198188 TIM_CHANNEL_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
199189 }
200190#endif
@@ -234,11 +224,11 @@ void HardwareTimer::resume(void)
234224/* *
235225 * @brief Convert arduino channel into HAL channel
236226 * @param Arduino channel [1..4]
237- * @retval HAL channel. return -1 if arduino channel is invalid
227+ * @retval HAL channel. Error handler called if arduino channel is invalid
238228 */
239229int HardwareTimer::getChannel (uint32_t channel)
240230{
241- uint32_t return_value;
231+ int return_value = - 1 ;
242232
243233 switch (channel) {
244234 case 1 :
@@ -254,21 +244,22 @@ int HardwareTimer::getChannel(uint32_t channel)
254244 return_value = TIM_CHANNEL_4;
255245 break ;
256246 default :
257- return_value = - 1 ;
247+ Error_Handler () ;
258248 }
259249 return return_value;
260250}
261251
262252/* *
263- * @brief Convert arduino channel into LL channel
253+ * @brief Convert arduino channel into LL channels used (regular and/or complementary)
264254 * @param Arduino channel [1..4]
265- * @retval LL channel. return -1 if arduino channel is invalid
255+ * @retval LL channel. Error handler called if arduino channel is invalid
266256 */
267257int HardwareTimer::getLLChannel (uint32_t channel)
268258{
269- uint32_t return_value;
259+ int return_value = 0 ;
260+
270261#if defined(TIM_CCER_CC1NE)
271- if (isComplementaryChannel [channel - 1 ]) {
262+ if (__ChannelsUsed [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
272263 // Complementary channel
273264 switch (channel) {
274265 case 1 :
@@ -288,38 +279,41 @@ int HardwareTimer::getLLChannel(uint32_t channel)
288279 default :
289280 return_value = -1 ;
290281 }
291- } else
282+ }
292283#endif
293- {
284+ if ((return_value != - 1 ) && (__ChannelsUsed[channel - 1 ] & REGULAR_CHAN_MASK)) {
294285 // Regular channel not complementary
295286 switch (channel) {
296287 case 1 :
297- return_value = LL_TIM_CHANNEL_CH1;
288+ return_value | = LL_TIM_CHANNEL_CH1;
298289 break ;
299290 case 2 :
300- return_value = LL_TIM_CHANNEL_CH2;
291+ return_value | = LL_TIM_CHANNEL_CH2;
301292 break ;
302293 case 3 :
303- return_value = LL_TIM_CHANNEL_CH3;
294+ return_value | = LL_TIM_CHANNEL_CH3;
304295 break ;
305296 case 4 :
306- return_value = LL_TIM_CHANNEL_CH4;
297+ return_value | = LL_TIM_CHANNEL_CH4;
307298 break ;
308299 default :
309300 return_value = -1 ;
310301 }
311302 }
303+ if (return_value == -1 ) {
304+ Error_Handler ();
305+ }
312306 return return_value;
313307}
314308
315309/* *
316310 * @brief Convert arduino channel into HAL Interrupt ID
317311 * @param Arduino channel [1..4]
318- * @retval HAL channel. return -1 if arduino channel is invalid
312+ * @retval HAL channel. Error handler called if arduino channel is invalid
319313 */
320314int HardwareTimer::getIT (uint32_t channel)
321315{
322- uint32_t return_value;
316+ int return_value = - 1 ;
323317
324318 switch (channel) {
325319 case 1 :
@@ -335,7 +329,7 @@ int HardwareTimer::getIT(uint32_t channel)
335329 return_value = TIM_IT_CC4;
336330 break ;
337331 default :
338- return_value = - 1 ;
332+ Error_Handler () ;
339333 }
340334 return return_value;
341335}
@@ -377,19 +371,7 @@ void HardwareTimer::resumeChannel(uint32_t channel)
377371{
378372 int timChannel = getChannel (channel);
379373 int timAssociatedInputChannel;
380- if (timChannel == -1 ) {
381- Error_Handler ();
382- }
383-
384374 int interrupt = getIT (channel);
385- if (interrupt == -1 ) {
386- Error_Handler ();
387- }
388-
389- int LLChannel = getLLChannel (channel);
390- if (LLChannel == -1 ) {
391- Error_Handler ();
392- }
393375
394376 // Clear flag and enable IT
395377 if (callbacks[channel]) {
@@ -401,11 +383,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
401383 case TIMER_OUTPUT_COMPARE_PWM1:
402384 case TIMER_OUTPUT_COMPARE_PWM2: {
403385#if defined(TIM_CCER_CC1NE)
404- if (isComplementaryChannel [channel - 1 ]) {
386+ if (__ChannelsUsed [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
405387 HAL_TIMEx_PWMN_Start (&(_timerObj.handle ), timChannel);
406- } else
388+ }
407389#endif
408- {
390+ if (__ChannelsUsed[channel - 1 ] & REGULAR_CHAN_MASK) {
409391 HAL_TIM_PWM_Start (&(_timerObj.handle ), timChannel);
410392 }
411393 }
@@ -416,11 +398,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
416398 case TIMER_OUTPUT_COMPARE_FORCED_ACTIVE:
417399 case TIMER_OUTPUT_COMPARE_FORCED_INACTIVE: {
418400#if defined(TIM_CCER_CC1NE)
419- if (isComplementaryChannel [channel - 1 ]) {
401+ if (__ChannelsUsed [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
420402 HAL_TIMEx_OCN_Start (&(_timerObj.handle ), timChannel);
421- } else
403+ }
422404#endif
423- {
405+ if (__ChannelsUsed[channel - 1 ] & REGULAR_CHAN_MASK) {
424406 HAL_TIM_OC_Start (&(_timerObj.handle ), timChannel);
425407 }
426408 }
@@ -642,10 +624,6 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
642624 TIM_OC_InitTypeDef channelOC;
643625 TIM_IC_InitTypeDef channelIC;
644626
645- if (timChannel == -1 ) {
646- Error_Handler ();
647- }
648-
649627 /* Configure some default values. Maybe overwritten later */
650628 channelOC.OCMode = TIMER_NOT_USED;
651629 channelOC.Pulse = __HAL_TIM_GET_COMPARE (&(_timerObj.handle ), timChannel); // keep same value already written in hardware register
@@ -724,13 +702,18 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
724702 HAL_TIM_IC_ConfigChannel (&(_timerObj.handle ), &channelIC, timChannel);
725703 break ;
726704 case TIMER_INPUT_FREQ_DUTY_MEASUREMENT:
705+ // Check if regular channel
706+ if (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) {
707+ Error_Handler ();
708+ }
727709 // Configure 1st channel
728710 channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
729711 channelIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
730712 HAL_TIM_IC_ConfigChannel (&(_timerObj.handle ), &channelIC, timChannel);
731713
732714 // Identify and configure 2nd associated channel
733715 timAssociatedInputChannel = getAssociatedChannel (channel);
716+ __ChannelsUsed[timAssociatedInputChannel - 1 ] |= REGULAR_CHAN_MASK;
734717 _ChannelMode[timAssociatedInputChannel - 1 ] = mode;
735718 channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
736719 channelIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
@@ -759,9 +742,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
759742 Error_Handler ();
760743 }
761744
762- #if defined(TIM_CCER_CC1NE)
763- isComplementaryChannel[channel - 1 ] = STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM));
764- #endif
745+ __ChannelsUsed[channel - 1 ] |= (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) ? COMPLEMENTARY_CHAN_MASK : REGULAR_CHAN_MASK;
765746 }
766747}
767748
@@ -818,10 +799,6 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
818799 uint32_t Prescalerfactor = LL_TIM_GetPrescaler (_timerObj.handle .Instance ) + 1 ;
819800 uint32_t CCR_RegisterValue;
820801
821- if (timChannel == -1 ) {
822- Error_Handler ();
823- }
824-
825802 switch (format) {
826803 case MICROSEC_COMPARE_FORMAT:
827804 CCR_RegisterValue = ((compare * (getTimerClkFreq () / 1000000 )) / Prescalerfactor);
@@ -885,10 +862,6 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_
885862 uint32_t Prescalerfactor = LL_TIM_GetPrescaler (_timerObj.handle .Instance ) + 1 ;
886863 uint32_t return_value;
887864
888- if (timChannel == -1 ) {
889- Error_Handler ();
890- }
891-
892865 switch (format) {
893866 case MICROSEC_COMPARE_FORMAT:
894867 return_value = (uint32_t )((CCR_RegisterValue * Prescalerfactor * 1000000.0 ) / getTimerClkFreq ());
@@ -1026,9 +999,6 @@ void HardwareTimer::detachInterrupt()
1026999void HardwareTimer::attachInterrupt (uint32_t channel, callback_function_t callback)
10271000{
10281001 int interrupt = getIT (channel);
1029- if (interrupt == -1 ) {
1030- Error_Handler ();
1031- }
10321002
10331003 if ((channel == 0 ) || (channel > (TIMER_CHANNELS + 1 ))) {
10341004 Error_Handler (); // only channel 1..4 have an interrupt
@@ -1055,9 +1025,6 @@ void HardwareTimer::attachInterrupt(uint32_t channel, callback_function_t callba
10551025void HardwareTimer::detachInterrupt (uint32_t channel)
10561026{
10571027 int interrupt = getIT (channel);
1058- if (interrupt == -1 ) {
1059- Error_Handler ();
1060- }
10611028
10621029 if ((channel == 0 ) || (channel > (TIMER_CHANNELS + 1 ))) {
10631030 Error_Handler (); // only channel 1..4 have an interrupt
@@ -1194,14 +1161,6 @@ bool HardwareTimer::isRunningChannel(uint32_t channel)
11941161 int interrupt = getIT (channel);
11951162 bool ret;
11961163
1197- if (LLChannel == -1 ) {
1198- Error_Handler ();
1199- }
1200-
1201- if (interrupt == -1 ) {
1202- Error_Handler ();
1203- }
1204-
12051164 // channel is running if: timer is running, and either output channel is
12061165 // enabled or interrupt is set
12071166 ret = LL_TIM_CC_IsEnabledChannel (_timerObj.handle .Instance , LLChannel)
@@ -1361,6 +1320,9 @@ timer_index_t get_timer_index(TIM_TypeDef *instance)
13611320 index = TIMER22_INDEX;
13621321 }
13631322#endif
1323+ if (index == UNKNOWN_TIMER) {
1324+ Error_Handler ();
1325+ }
13641326 return index;
13651327}
13661328
0 commit comments