Skip to content

Commit a61b5fa

Browse files
committed
[Timer] Move get_timer_obj() from cpp to c
This will allow to customize IRQ priority Signed-off-by: Frederic Pillon <[email protected]>
1 parent 5cf1048 commit a61b5fa

File tree

4 files changed

+92
-93
lines changed

4 files changed

+92
-93
lines changed

cores/arduino/HardwareTimer.cpp

+71-81
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#define MAX_RELOAD ((1 << 16) - 1) // Currently even 32b timers are used as 16b to have generic behavior
3434

3535
/* Private Variables */
36-
HardwareTimerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL};
36+
timerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL};
3737

3838
IRQn_Type getTimerUpIrq(TIM_TypeDef *tim);
3939
IRQn_Type getTimerCCIrq(TIM_TypeDef *tim);
@@ -50,25 +50,25 @@ HardwareTimer::HardwareTimer(TIM_TypeDef *instance)
5050
Error_Handler();
5151
}
5252

53-
HardwareTimer_Handle[index] = &_HardwareTimerObj;
53+
HardwareTimer_Handle[index] = &_timerObj;
5454

55-
_HardwareTimerObj.handle.Instance = instance;
56-
_HardwareTimerObj.handle.Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
57-
_HardwareTimerObj.handle.hdma[0] = NULL;
58-
_HardwareTimerObj.handle.hdma[1] = NULL;
59-
_HardwareTimerObj.handle.hdma[2] = NULL;
60-
_HardwareTimerObj.handle.hdma[3] = NULL;
61-
_HardwareTimerObj.handle.hdma[4] = NULL;
62-
_HardwareTimerObj.handle.hdma[5] = NULL;
63-
_HardwareTimerObj.handle.hdma[6] = NULL;
64-
_HardwareTimerObj.handle.Lock = HAL_UNLOCKED;
65-
_HardwareTimerObj.handle.State = HAL_TIM_STATE_RESET;
55+
_timerObj.handle.Instance = instance;
56+
_timerObj.handle.Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
57+
_timerObj.handle.hdma[0] = NULL;
58+
_timerObj.handle.hdma[1] = NULL;
59+
_timerObj.handle.hdma[2] = NULL;
60+
_timerObj.handle.hdma[3] = NULL;
61+
_timerObj.handle.hdma[4] = NULL;
62+
_timerObj.handle.hdma[5] = NULL;
63+
_timerObj.handle.hdma[6] = NULL;
64+
_timerObj.handle.Lock = HAL_UNLOCKED;
65+
_timerObj.handle.State = HAL_TIM_STATE_RESET;
6666

67-
_HardwareTimerObj.handle.Instance = instance;
68-
_HardwareTimerObj.__this = (void *)this;
67+
_timerObj.handle.Instance = instance;
68+
_timerObj.__this = (void *)this;
6969

7070
// Enable Timer clock
71-
enableTimerClock(&(_HardwareTimerObj.handle));
71+
enableTimerClock(&(_timerObj.handle));
7272

7373
// Configure HAL structure for all channels
7474
for (int i = 0; i < TIMER_CHANNELS; i++) {
@@ -103,7 +103,7 @@ HardwareTimer::HardwareTimer(TIM_TypeDef *instance)
103103
*/
104104
void HardwareTimer::pause()
105105
{
106-
HAL_TIM_Base_Stop_IT(&(_HardwareTimerObj.handle));
106+
HAL_TIM_Base_Stop_IT(&(_timerObj.handle));
107107
}
108108

109109
/**
@@ -113,19 +113,19 @@ void HardwareTimer::pause()
113113
*/
114114
void HardwareTimer::resume(void)
115115
{
116-
_HardwareTimerObj.handle.Init.CounterMode = TIM_COUNTERMODE_UP;
117-
_HardwareTimerObj.handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
116+
_timerObj.handle.Init.CounterMode = TIM_COUNTERMODE_UP;
117+
_timerObj.handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
118118
#if defined(TIM_RCR_REP)
119-
_HardwareTimerObj.handle.Init.RepetitionCounter = 0;
119+
_timerObj.handle.Init.RepetitionCounter = 0;
120120
#endif
121-
_HardwareTimerObj.handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
122-
HAL_TIM_Base_Init(&(_HardwareTimerObj.handle));
121+
_timerObj.handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
122+
HAL_TIM_Base_Init(&(_timerObj.handle));
123123

124124
// Start timer with IT if required
125125
if (callbacks[0] != NULL) {
126-
HAL_TIM_Base_Start_IT(&(_HardwareTimerObj.handle));
126+
HAL_TIM_Base_Start_IT(&(_timerObj.handle));
127127
} else {
128-
HAL_TIM_Base_Start(&(_HardwareTimerObj.handle));
128+
HAL_TIM_Base_Start(&(_timerObj.handle));
129129
}
130130

131131
resumeChannel(1);
@@ -175,58 +175,58 @@ void HardwareTimer::resumeChannel(uint32_t channel)
175175
}
176176

177177
if (IS_TIM_PWM_MODE(_channelOC[channel - 1].OCMode)) {
178-
HAL_TIM_PWM_ConfigChannel(&(_HardwareTimerObj.handle), &_channelOC[channel - 1], timChannel);
178+
HAL_TIM_PWM_ConfigChannel(&(_timerObj.handle), &_channelOC[channel - 1], timChannel);
179179

180180
if ((channel < (TIMER_CHANNELS + 1)) && (callbacks[channel] != NULL)) {
181181
// Only channel 1..4 can have interruption
182182
#if defined(TIM_CCER_CC1NE)
183183
if (isComplementaryChannel[channel]) {
184-
HAL_TIMEx_PWMN_Start_IT(&(_HardwareTimerObj.handle), timChannel);
184+
HAL_TIMEx_PWMN_Start_IT(&(_timerObj.handle), timChannel);
185185
} else
186186
#endif
187187
{
188-
HAL_TIM_PWM_Start_IT(&(_HardwareTimerObj.handle), timChannel);
188+
HAL_TIM_PWM_Start_IT(&(_timerObj.handle), timChannel);
189189
}
190190
} else {
191191
#if defined(TIM_CCER_CC1NE)
192192
if (isComplementaryChannel[channel]) {
193-
HAL_TIMEx_PWMN_Start(&(_HardwareTimerObj.handle), timChannel);
193+
HAL_TIMEx_PWMN_Start(&(_timerObj.handle), timChannel);
194194
} else
195195
#endif
196196
{
197-
HAL_TIM_PWM_Start(&(_HardwareTimerObj.handle), timChannel);
197+
HAL_TIM_PWM_Start(&(_timerObj.handle), timChannel);
198198
}
199199
}
200200
} else if (IS_TIM_OC_MODE(_channelOC[channel - 1].OCMode)) {
201-
HAL_TIM_OC_ConfigChannel(&(_HardwareTimerObj.handle), &_channelOC[channel - 1], timChannel);
201+
HAL_TIM_OC_ConfigChannel(&(_timerObj.handle), &_channelOC[channel - 1], timChannel);
202202

203203
if ((channel < (TIMER_CHANNELS + 1)) && (callbacks[channel] != NULL)) {
204204
// Only channel 1..4 can have interruption
205205
#if defined(TIM_CCER_CC1NE)
206206
if (isComplementaryChannel[channel]) {
207-
HAL_TIMEx_OCN_Start_IT(&(_HardwareTimerObj.handle), timChannel);
207+
HAL_TIMEx_OCN_Start_IT(&(_timerObj.handle), timChannel);
208208
} else
209209
#endif
210210
{
211-
HAL_TIM_OC_Start_IT(&(_HardwareTimerObj.handle), timChannel);
211+
HAL_TIM_OC_Start_IT(&(_timerObj.handle), timChannel);
212212
}
213213
} else {
214214
#if defined(TIM_CCER_CC1NE)
215215
if (isComplementaryChannel[channel]) {
216-
HAL_TIMEx_OCN_Start(&(_HardwareTimerObj.handle), timChannel);
216+
HAL_TIMEx_OCN_Start(&(_timerObj.handle), timChannel);
217217
} else
218218
#endif
219219
{
220-
HAL_TIM_OC_Start(&(_HardwareTimerObj.handle), timChannel);
220+
HAL_TIM_OC_Start(&(_timerObj.handle), timChannel);
221221
}
222222
}
223223
} else if (_channelIC[channel - 1].ICPolarity != TIMER_NOT_USED) {
224-
HAL_TIM_IC_ConfigChannel(&(_HardwareTimerObj.handle), &_channelIC[channel - 1], timChannel);
224+
HAL_TIM_IC_ConfigChannel(&(_timerObj.handle), &_channelIC[channel - 1], timChannel);
225225

226226
if (callbacks[channel] != NULL) {
227-
HAL_TIM_IC_Start_IT(&(_HardwareTimerObj.handle), timChannel);
227+
HAL_TIM_IC_Start_IT(&(_timerObj.handle), timChannel);
228228
} else {
229-
HAL_TIM_IC_Start(&(_HardwareTimerObj.handle), timChannel);
229+
HAL_TIM_IC_Start(&(_timerObj.handle), timChannel);
230230
}
231231
}
232232
}
@@ -239,7 +239,7 @@ void HardwareTimer::resumeChannel(uint32_t channel)
239239
uint32_t HardwareTimer::getPrescaleFactor()
240240
{
241241
// Hardware register correspond to prescaler-1. Example PSC register value 0 means divided by 1
242-
return (_HardwareTimerObj.handle.Init.Prescaler + 1);
242+
return (_timerObj.handle.Init.Prescaler + 1);
243243
}
244244

245245
/**
@@ -250,8 +250,8 @@ uint32_t HardwareTimer::getPrescaleFactor()
250250
void HardwareTimer::setPrescaleFactor(uint32_t prescaler)
251251
{
252252
// Hardware register correspond to prescaler-1. Example PSC register value 0 means divided by 1
253-
__HAL_TIM_SET_PRESCALER(&_HardwareTimerObj.handle, prescaler - 1);
254-
_HardwareTimerObj.handle.Init.Prescaler = prescaler - 1;
253+
__HAL_TIM_SET_PRESCALER(&_timerObj.handle, prescaler - 1);
254+
_timerObj.handle.Init.Prescaler = prescaler - 1;
255255
}
256256

257257
/**
@@ -265,8 +265,8 @@ void HardwareTimer::setPrescaleFactor(uint32_t prescaler)
265265
uint32_t HardwareTimer::getOverflow(TimerFormat_t format)
266266
{
267267
// Hardware register correspond to period count-1. Example ARR register value 9 means period of 10 timer cycle
268-
uint32_t ARR_RegisterValue = __HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle));
269-
uint32_t Prescalerfactor = _HardwareTimerObj.handle.Instance->PSC + 1;
268+
uint32_t ARR_RegisterValue = __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
269+
uint32_t Prescalerfactor = _timerObj.handle.Instance->PSC + 1;
270270
uint32_t return_value;
271271
switch (format) {
272272
case MICROSEC_FORMAT:
@@ -302,15 +302,15 @@ void HardwareTimer::setOverflow(uint32_t overflow, TimerFormat_t format)
302302
case MICROSEC_FORMAT:
303303
period_cyc = overflow * (getTimerClkFreq() / 1000000);
304304
Prescalerfactor = (period_cyc / 0x10000) + 1;
305-
__HAL_TIM_SET_PRESCALER(&_HardwareTimerObj.handle, Prescalerfactor - 1);
306-
_HardwareTimerObj.handle.Init.Prescaler = Prescalerfactor - 1;
305+
__HAL_TIM_SET_PRESCALER(&_timerObj.handle, Prescalerfactor - 1);
306+
_timerObj.handle.Init.Prescaler = Prescalerfactor - 1;
307307
ARR_RegisterValue = (period_cyc / Prescalerfactor) - 1;
308308
break;
309309
case HERTZ_FORMAT:
310310
period_cyc = getTimerClkFreq() / overflow;
311311
Prescalerfactor = (period_cyc / 0x10000) + 1;
312-
__HAL_TIM_SET_PRESCALER(&_HardwareTimerObj.handle, Prescalerfactor - 1);
313-
_HardwareTimerObj.handle.Init.Prescaler = Prescalerfactor - 1;
312+
__HAL_TIM_SET_PRESCALER(&_timerObj.handle, Prescalerfactor - 1);
313+
_timerObj.handle.Init.Prescaler = Prescalerfactor - 1;
314314
ARR_RegisterValue = (period_cyc / Prescalerfactor) - 1;
315315
break;
316316
case TICK_FORMAT:
@@ -319,8 +319,8 @@ void HardwareTimer::setOverflow(uint32_t overflow, TimerFormat_t format)
319319
break;
320320
}
321321

322-
__HAL_TIM_SET_AUTORELOAD(&_HardwareTimerObj.handle, ARR_RegisterValue);
323-
_HardwareTimerObj.handle.Init.Period = ARR_RegisterValue;
322+
__HAL_TIM_SET_AUTORELOAD(&_timerObj.handle, ARR_RegisterValue);
323+
_timerObj.handle.Init.Period = ARR_RegisterValue;
324324
}
325325

326326
/**
@@ -333,8 +333,8 @@ void HardwareTimer::setOverflow(uint32_t overflow, TimerFormat_t format)
333333
*/
334334
uint32_t HardwareTimer::getCount(TimerFormat_t format)
335335
{
336-
uint32_t CNT_RegisterValue = __HAL_TIM_GET_COUNTER(&(_HardwareTimerObj.handle));
337-
uint32_t Prescalerfactor = _HardwareTimerObj.handle.Instance->PSC + 1;
336+
uint32_t CNT_RegisterValue = __HAL_TIM_GET_COUNTER(&(_timerObj.handle));
337+
uint32_t Prescalerfactor = _timerObj.handle.Instance->PSC + 1;
338338
uint32_t return_value;
339339
switch (format) {
340340
case MICROSEC_FORMAT:
@@ -363,7 +363,7 @@ uint32_t HardwareTimer::getCount(TimerFormat_t format)
363363
void HardwareTimer::setCount(uint32_t counter, TimerFormat_t format)
364364
{
365365
uint32_t CNT_RegisterValue;
366-
uint32_t Prescalerfactor = _HardwareTimerObj.handle.Instance->PSC + 1;
366+
uint32_t Prescalerfactor = _timerObj.handle.Instance->PSC + 1;
367367
switch (format) {
368368
case MICROSEC_FORMAT:
369369
CNT_RegisterValue = ((counter * (getTimerClkFreq() / 1000000)) / Prescalerfactor) - 1 ;
@@ -376,7 +376,7 @@ void HardwareTimer::setCount(uint32_t counter, TimerFormat_t format)
376376
CNT_RegisterValue = counter - 1;
377377
break;
378378
}
379-
__HAL_TIM_SET_COUNTER(&(_HardwareTimerObj.handle), CNT_RegisterValue);
379+
__HAL_TIM_SET_COUNTER(&(_timerObj.handle), CNT_RegisterValue);
380380
}
381381

382382
/**
@@ -519,7 +519,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin)
519519
void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerCompareFormat_t format)
520520
{
521521
int timChannel = getChannel(channel);
522-
uint32_t Prescalerfactor = _HardwareTimerObj.handle.Instance->PSC + 1;
522+
uint32_t Prescalerfactor = _timerObj.handle.Instance->PSC + 1;
523523
uint32_t CCR_RegisterValue;
524524

525525
if (timChannel == -1) {
@@ -534,21 +534,21 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
534534
CCR_RegisterValue = (getTimerClkFreq() / (compare * Prescalerfactor)) - 1;
535535
break;
536536
case PERCENT_COMPARE_FORMAT:
537-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle)) + 1) * compare) / 100;
537+
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 100;
538538
break;
539539
case RESOLUTION_8B_COMPARE_FORMAT:
540-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle)) + 1) * compare) / 255 ;
540+
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 255 ;
541541
break;
542542
case RESOLUTION_12B_COMPARE_FORMAT:
543-
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle)) + 1) * compare) / 4095 ;
543+
CCR_RegisterValue = ((__HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle)) + 1) * compare) / 4095 ;
544544
break;
545545
case TICK_COMPARE_FORMAT:
546546
default :
547547
CCR_RegisterValue = compare - 1;
548548
break;
549549
}
550550

551-
__HAL_TIM_SET_COMPARE(&(_HardwareTimerObj.handle), timChannel, CCR_RegisterValue);
551+
__HAL_TIM_SET_COMPARE(&(_timerObj.handle), timChannel, CCR_RegisterValue);
552552
_channelOC[channel - 1].Pulse = CCR_RegisterValue;
553553
}
554554

@@ -564,8 +564,8 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
564564
uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_t format)
565565
{
566566
int timChannel = getChannel(channel);
567-
uint32_t CCR_RegisterValue = __HAL_TIM_GET_COMPARE(&(_HardwareTimerObj.handle), timChannel);
568-
uint32_t Prescalerfactor = _HardwareTimerObj.handle.Instance->PSC + 1;
567+
uint32_t CCR_RegisterValue = __HAL_TIM_GET_COMPARE(&(_timerObj.handle), timChannel);
568+
uint32_t Prescalerfactor = _timerObj.handle.Instance->PSC + 1;
569569
uint32_t return_value;
570570

571571
if (timChannel == -1) {
@@ -580,13 +580,13 @@ uint32_t HardwareTimer::getCaptureCompare(uint32_t channel, TimerCompareFormat_
580580
return_value = (uint32_t)(getTimerClkFreq() / (CCR_RegisterValue * Prescalerfactor));
581581
break;
582582
case PERCENT_COMPARE_FORMAT:
583-
return_value = (CCR_RegisterValue * 100) / __HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle));
583+
return_value = (CCR_RegisterValue * 100) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
584584
break;
585585
case RESOLUTION_8B_COMPARE_FORMAT:
586-
return_value = (CCR_RegisterValue * 255) / __HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle));
586+
return_value = (CCR_RegisterValue * 255) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
587587
break;
588588
case RESOLUTION_12B_COMPARE_FORMAT:
589-
return_value = (CCR_RegisterValue * 4095) / __HAL_TIM_GET_AUTORELOAD(&(_HardwareTimerObj.handle));
589+
return_value = (CCR_RegisterValue * 4095) / __HAL_TIM_GET_AUTORELOAD(&(_timerObj.handle));
590590
break;
591591
case TICK_COMPARE_FORMAT:
592592
default :
@@ -694,7 +694,7 @@ void HardwareTimer::detachInterrupt(uint32_t channel)
694694
*/
695695
void HardwareTimer::refresh()
696696
{
697-
HAL_TIM_GenerateEvent(&(_HardwareTimerObj.handle), TIM_EVENTSOURCE_UPDATE);
697+
HAL_TIM_GenerateEvent(&(_timerObj.handle), TIM_EVENTSOURCE_UPDATE);
698698
}
699699

700700
/**
@@ -708,7 +708,7 @@ void HardwareTimer::updateCallback(TIM_HandleTypeDef *htim)
708708
Error_Handler();
709709
}
710710

711-
HardwareTimerObj_t *obj = get_timer_obj(htim);
711+
timerObj_t *obj = get_timer_obj(htim);
712712
HardwareTimer *HT = (HardwareTimer *)(obj->__this);
713713

714714
if (HT->callbacks[0] != NULL) {
@@ -749,7 +749,7 @@ void HardwareTimer::captureCompareCallback(TIM_HandleTypeDef *htim)
749749
return;
750750
}
751751

752-
HardwareTimerObj_t *obj = get_timer_obj(htim);
752+
timerObj_t *obj = get_timer_obj(htim);
753753
HardwareTimer *HT = (HardwareTimer *)(obj->__this);
754754

755755
if (HT->callbacks[channel] != NULL) {
@@ -763,10 +763,10 @@ void HardwareTimer::captureCompareCallback(TIM_HandleTypeDef *htim)
763763
*/
764764
HardwareTimer::~HardwareTimer()
765765
{
766-
uint32_t index = get_timer_index(_HardwareTimerObj.handle.Instance);
767-
disableTimerClock(&(_HardwareTimerObj.handle));
766+
uint32_t index = get_timer_index(_timerObj.handle.Instance);
767+
disableTimerClock(&(_timerObj.handle));
768768
HardwareTimer_Handle[index] = NULL;
769-
_HardwareTimerObj.__this = NULL;
769+
_timerObj.__this = NULL;
770770
}
771771

772772
/**
@@ -904,7 +904,7 @@ uint32_t HardwareTimer::getTimerClkFreq()
904904

905905
/* Get clock configuration */
906906
HAL_RCC_GetClockConfig(&clkconfig, &pFLatency);
907-
switch (getTimerClkSrc(_HardwareTimerObj.handle.Instance)) {
907+
switch (getTimerClkSrc(_timerObj.handle.Instance)) {
908908
case 1:
909909
uwAPBxPrescaler = clkconfig.APB1CLKDivider;
910910
uwTimclock = HAL_RCC_GetPCLK1Freq();
@@ -1015,25 +1015,15 @@ uint32_t HardwareTimer::getTimerClkFreq()
10151015
return uwTimclock;
10161016
}
10171017

1018-
/* Aim of the function is to get _HardwareTimerObj_s pointer using htim pointer */
1019-
/* Highly inspired from magical linux kernel's "container_of" */
1020-
/* (which was not directly used since not compatible with IAR toolchain) */
1021-
HardwareTimerObj_t *get_timer_obj(TIM_HandleTypeDef *htim)
1022-
{
1023-
HardwareTimerObj_t *obj;
1024-
obj = (HardwareTimerObj_t *)((char *)htim - offsetof(HardwareTimerObj_t, handle));
1025-
return (obj);
1026-
}
1027-
10281018
/**
10291019
* @brief This function will reset the timer
10301020
* @param obj : Hardware timer instance ex: Timer6, ...
10311021
* @retval None
10321022
*/
10331023
void HardwareTimer::timerHandleDeinit()
10341024
{
1035-
HAL_TIM_Base_Stop_IT(&(_HardwareTimerObj.handle));
1036-
HAL_TIM_Base_DeInit(&(_HardwareTimerObj.handle));
1025+
HAL_TIM_Base_Stop_IT(&(_timerObj.handle));
1026+
HAL_TIM_Base_DeInit(&(_timerObj.handle));
10371027
}
10381028

10391029
/******************************************************************************/

0 commit comments

Comments
 (0)