31
31
/* Private Defines */
32
32
#define PIN_NOT_USED 0xFF
33
33
#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
34
36
35
37
/* Private Variables */
36
38
timerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL };
@@ -111,9 +113,7 @@ void HardwareTimer::setup(TIM_TypeDef *instance)
111
113
112
114
// Initialize channel mode and complementary
113
115
for (int i = 0 ; i < TIMER_CHANNELS; i++) {
114
- #if defined(TIM_CCER_CC1NE)
115
- isComplementaryChannel[i] = false ;
116
- #endif
116
+ configuredChannels[i] = 0x00 ;
117
117
_ChannelMode[i] = TIMER_DISABLED;
118
118
}
119
119
@@ -190,11 +190,11 @@ void HardwareTimer::pauseChannel(uint32_t channel)
190
190
/* Starting from G4, new Channel state implementation prevents to restart a channel,
191
191
if the channel has not been explicitly be stopped with HAL interface */
192
192
#if defined(TIM_CHANNEL_N_STATE_SET)
193
- if (isComplementaryChannel [channel - 1 ]) {
193
+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
194
194
TIM_CHANNEL_N_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
195
- } else
195
+ }
196
196
#endif
197
- {
197
+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
198
198
TIM_CHANNEL_STATE_SET (&(_timerObj.handle ), getChannel (channel), HAL_TIM_CHANNEL_STATE_READY);
199
199
}
200
200
#endif
@@ -260,15 +260,16 @@ int HardwareTimer::getChannel(uint32_t channel)
260
260
}
261
261
262
262
/* *
263
- * @brief Convert arduino channel into LL channel
263
+ * @brief Convert configuraed arduino channel into LL channels (regular and/or complementary)
264
264
* @param Arduino channel [1..4]
265
265
* @retval LL channel. return -1 if arduino channel is invalid
266
266
*/
267
267
int HardwareTimer::getLLChannel (uint32_t channel)
268
268
{
269
- uint32_t return_value;
269
+ int return_value = 0 ;
270
+
270
271
#if defined(TIM_CCER_CC1NE)
271
- if (isComplementaryChannel [channel - 1 ]) {
272
+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
272
273
// Complementary channel
273
274
switch (channel) {
274
275
case 1 :
@@ -288,22 +289,22 @@ int HardwareTimer::getLLChannel(uint32_t channel)
288
289
default :
289
290
return_value = -1 ;
290
291
}
291
- } else
292
+ }
292
293
#endif
293
- {
294
+ if ((return_value != - 1 ) && (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK)) {
294
295
// Regular channel not complementary
295
296
switch (channel) {
296
297
case 1 :
297
- return_value = LL_TIM_CHANNEL_CH1;
298
+ return_value | = LL_TIM_CHANNEL_CH1;
298
299
break ;
299
300
case 2 :
300
- return_value = LL_TIM_CHANNEL_CH2;
301
+ return_value | = LL_TIM_CHANNEL_CH2;
301
302
break ;
302
303
case 3 :
303
- return_value = LL_TIM_CHANNEL_CH3;
304
+ return_value | = LL_TIM_CHANNEL_CH3;
304
305
break ;
305
306
case 4 :
306
- return_value = LL_TIM_CHANNEL_CH4;
307
+ return_value | = LL_TIM_CHANNEL_CH4;
307
308
break ;
308
309
default :
309
310
return_value = -1 ;
@@ -401,11 +402,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
401
402
case TIMER_OUTPUT_COMPARE_PWM1:
402
403
case TIMER_OUTPUT_COMPARE_PWM2: {
403
404
#if defined(TIM_CCER_CC1NE)
404
- if (isComplementaryChannel [channel - 1 ]) {
405
+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
405
406
HAL_TIMEx_PWMN_Start (&(_timerObj.handle ), timChannel);
406
- } else
407
+ }
407
408
#endif
408
- {
409
+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
409
410
HAL_TIM_PWM_Start (&(_timerObj.handle ), timChannel);
410
411
}
411
412
}
@@ -416,11 +417,11 @@ void HardwareTimer::resumeChannel(uint32_t channel)
416
417
case TIMER_OUTPUT_COMPARE_FORCED_ACTIVE:
417
418
case TIMER_OUTPUT_COMPARE_FORCED_INACTIVE: {
418
419
#if defined(TIM_CCER_CC1NE)
419
- if (isComplementaryChannel [channel - 1 ]) {
420
+ if (configuredChannels [channel - 1 ] & COMPLEMENTARY_CHAN_MASK ) {
420
421
HAL_TIMEx_OCN_Start (&(_timerObj.handle ), timChannel);
421
- } else
422
+ }
422
423
#endif
423
- {
424
+ if (configuredChannels[channel - 1 ] & REGULAR_CHAN_MASK) {
424
425
HAL_TIM_OC_Start (&(_timerObj.handle ), timChannel);
425
426
}
426
427
}
@@ -731,6 +732,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
731
732
732
733
// Identify and configure 2nd associated channel
733
734
timAssociatedInputChannel = getAssociatedChannel (channel);
735
+ configuredChannels[timAssociatedInputChannel - 1 ] |= (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) ? 0x10 : 0x01 ;
734
736
_ChannelMode[timAssociatedInputChannel - 1 ] = mode;
735
737
channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
736
738
channelIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
@@ -759,9 +761,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
759
761
Error_Handler ();
760
762
}
761
763
762
- #if defined(TIM_CCER_CC1NE)
763
- isComplementaryChannel[channel - 1 ] = STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM));
764
- #endif
764
+ configuredChannels[channel - 1 ] |= (STM_PIN_INVERTED (pinmap_function (pin, PinMap_TIM))) ? 0x10 : 0x01 ;
765
765
}
766
766
}
767
767
0 commit comments