@@ -471,6 +471,8 @@ void HardwareTimer::setPrescaleFactor(uint32_t prescaler)
471
471
{
472
472
// Hardware register correspond to prescaler-1. Example PSC register value 0 means divided by 1
473
473
LL_TIM_SetPrescaler (_timerObj.handle .Instance , prescaler - 1 );
474
+
475
+ updateRegistersIfNotRunning (_timerObj.handle .Instance );
474
476
}
475
477
476
478
/* *
@@ -550,6 +552,8 @@ void HardwareTimer::setOverflow(uint32_t overflow, TimerFormat_t format)
550
552
ARR_RegisterValue = 0 ;
551
553
}
552
554
__HAL_TIM_SET_AUTORELOAD (&_timerObj.handle , ARR_RegisterValue);
555
+
556
+ updateRegistersIfNotRunning (_timerObj.handle .Instance );
553
557
}
554
558
555
559
/* *
@@ -640,7 +644,7 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin)
640
644
641
645
/* Configure some default values. Maybe overwritten later */
642
646
channelOC.OCMode = TIMER_NOT_USED;
643
- channelOC.Pulse = __HAL_TIM_GET_COMPARE (&(_timerObj.handle ), timChannel); // keep same value already written in hardware < register
647
+ channelOC.Pulse = __HAL_TIM_GET_COMPARE (&(_timerObj.handle ), timChannel); // keep same value already written in hardware register
644
648
channelOC.OCPolarity = TIM_OCPOLARITY_HIGH;
645
649
channelOC.OCFastMode = TIM_OCFAST_DISABLE;
646
650
#if defined(TIM_CR2_OIS1)
@@ -857,6 +861,8 @@ void HardwareTimer::setCaptureCompare(uint32_t channel, uint32_t compare, TimerC
857
861
}
858
862
859
863
__HAL_TIM_SET_COMPARE (&(_timerObj.handle ), timChannel, CCR_RegisterValue);
864
+
865
+ updateRegistersIfNotRunning (_timerObj.handle .Instance );
860
866
}
861
867
862
868
/* *
@@ -1082,7 +1088,8 @@ bool HardwareTimer::hasInterrupt(uint32_t channel)
1082
1088
1083
1089
/* *
1084
1090
* @brief Generate an update event to force all registers (Autoreload, prescaler, compare) to be taken into account
1085
- * @note Refresh() can only be called after a 1st call to resume() to be sure timer is initialised.
1091
+ * @note @note Refresh() can only be called after timer has been initialized,
1092
+ either by calling setup() function or thanks to constructor with TIM instance parameter.
1086
1093
* It is useful while timer is running after some registers update
1087
1094
* @retval None
1088
1095
*/
@@ -1198,6 +1205,27 @@ bool HardwareTimer::isRunningChannel(uint32_t channel)
1198
1205
return (isRunning () && ret);
1199
1206
}
1200
1207
1208
+ /* *
1209
+ * @brief Take into account registers update immediately if timer is not running,
1210
+ * (independently from Preload setting)
1211
+ * @param TIMx Timer instance
1212
+ * @retval None
1213
+ */
1214
+ void HardwareTimer::updateRegistersIfNotRunning (TIM_TypeDef *TIMx)
1215
+ {
1216
+ if (!isRunning ()) {
1217
+ if (LL_TIM_IsEnabledIT_UPDATE (TIMx)) {
1218
+ // prevent Interrupt generation from refresh()
1219
+ LL_TIM_DisableIT_UPDATE (TIMx);
1220
+ refresh ();
1221
+ LL_TIM_ClearFlag_UPDATE (TIMx);
1222
+ LL_TIM_EnableIT_UPDATE (TIMx);
1223
+ } else {
1224
+ refresh ();
1225
+ }
1226
+ }
1227
+ }
1228
+
1201
1229
/* *
1202
1230
* @brief HardwareTimer destructor
1203
1231
* @retval None
0 commit comments