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
3838IRQn_Type getTimerUpIrq (TIM_TypeDef *tim);
3939IRQn_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 */
104104void 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 */
114114void 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)
239239uint32_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()
250250void 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)
265265uint32_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 */
334334uint32_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)
363363void 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)
519519void 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
564564uint32_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 */
695695void 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 */
764764HardwareTimer::~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 */
10331023void 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