diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 558aee3d..d21b5fff 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -783,7 +783,14 @@ void HardwareTimer::setMode(uint32_t channel, TimerModes_t mode, PinName pin) /* Configure some default values. Maybe overwritten later */ channelOC.TIM_OCMode = TIMER_NOT_USED; //set default value 0xFFFF - + + // Enable preload (shadow registers) for timer channel to prevent output glitches + // Ensures compare register updates only take effect at timer overflow/update events + TIM_OC1PreloadConfig(_timerObj.handle.Instance, TIM_OCPreload_Enable); + TIM_OC2PreloadConfig(_timerObj.handle.Instance, TIM_OCPreload_Enable); + TIM_OC3PreloadConfig(_timerObj.handle.Instance, TIM_OCPreload_Enable); + TIM_OC4PreloadConfig(_timerObj.handle.Instance, TIM_OCPreload_Enable); + // channelOC.Pulse = __HAL_TIM_GET_COMPARE(&(_timerObj.handle), timChannel); // keep same value already written in hardware register channelOC.TIM_Pulse = (((timChannel) == TIM_Channel_1) ? (_timerObj.handle.Instance->CH1CVR) :\ ((timChannel) == TIM_Channel_2) ? (_timerObj.handle.Instance->CH2CVR) :\