Skip to content

Commit 05b5d68

Browse files
committed
feat(HardwareTimer): support regular and complementary channels
Signed-off-by: Frederic Pillon <[email protected]>
1 parent c12103b commit 05b5d68

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

Diff for: cores/arduino/HardwareTimer.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ class HardwareTimer {
181181
int getLLChannel(uint32_t channel);
182182
int getIT(uint32_t channel);
183183
int getAssociatedChannel(uint32_t channel);
184-
#if defined(TIM_CCER_CC1NE)
185-
bool isComplementaryChannel[TIMER_CHANNELS];
186-
#endif
184+
// Store for each channel if regular, complementary or both are configured
185+
// High part for complementary (0x10), low part for regular (0x01)
186+
uint8_t configuredChannels[TIMER_CHANNELS];
187187
private:
188188
TimerModes_t _ChannelMode[TIMER_CHANNELS];
189189
timerObj_t _timerObj;

Diff for: libraries/SrcWrapper/src/HardwareTimer.cpp

+24-24
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
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 */
3638
timerObj_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 configuraed 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
*/
267267
int 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
}
@@ -731,6 +732,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
731732

732733
// Identify and configure 2nd associated channel
733734
timAssociatedInputChannel = getAssociatedChannel(channel);
735+
configuredChannels[timAssociatedInputChannel - 1] |= (STM_PIN_INVERTED(pinmap_function(pin, PinMap_TIM))) ? 0x10 : 0x01;
734736
_ChannelMode[timAssociatedInputChannel - 1] = mode;
735737
channelIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
736738
channelIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
@@ -759,9 +761,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin, Ch
759761
Error_Handler();
760762
}
761763

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;
765765
}
766766
}
767767

0 commit comments

Comments
 (0)