@@ -852,12 +852,17 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP
852852 */
853853void HardwareTimer::attachInterrupt (void (*callback)(HardwareTimer *))
854854{
855- callbacks[0 ] = callback;
856- if (callback != NULL ) {
857- // Clear flag before enabling IT
858- __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), TIM_FLAG_UPDATE);
859- // Enable update interrupt only if callback is valid
860- __HAL_TIM_ENABLE_IT (&(_timerObj.handle ), TIM_IT_UPDATE);
855+ if (callbacks[0 ] != NULL ) {
856+ // Callback previously configured : do not clear neither enable IT, it is just a change of callback
857+ callbacks[0 ] = callback;
858+ } else {
859+ callbacks[0 ] = callback;
860+ if (callback != NULL ) {
861+ // Clear flag before enabling IT
862+ __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), TIM_FLAG_UPDATE);
863+ // Enable update interrupt only if callback is valid
864+ __HAL_TIM_ENABLE_IT (&(_timerObj.handle ), TIM_IT_UPDATE);
865+ }
861866 }
862867}
863868
@@ -889,12 +894,17 @@ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareT
889894 Error_Handler (); // only channel 1..4 have an interrupt
890895 }
891896
892- callbacks[channel] = callback;
893- if (callback != NULL ) {
894- // Clear flag before enabling IT
895- __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), interrupt);
896- // Enable interrupt corresponding to channel, only if callback is valid
897- __HAL_TIM_ENABLE_IT (&(_timerObj.handle ), interrupt);
897+ if (callbacks[channel] != NULL ) {
898+ // Callback previously configured : do not clear neither enable IT, it is just a change of callback
899+ callbacks[channel] = callback;
900+ } else {
901+ callbacks[channel] = callback;
902+ if (callback != NULL ) {
903+ // Clear flag before enabling IT
904+ __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), interrupt);
905+ // Enable interrupt corresponding to channel, only if callback is valid
906+ __HAL_TIM_ENABLE_IT (&(_timerObj.handle ), interrupt);
907+ }
898908 }
899909}
900910
0 commit comments