Skip to content

Commit a6f7a98

Browse files
ABOSTMfpistm
authored andcommitted
HardwareTimer: Clear IT flag only if callback not previously configured
rework #806 after discussion with @matthijskooijman
1 parent 094df96 commit a6f7a98

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

Diff for: cores/arduino/HardwareTimer.cpp

+22-12
Original file line numberDiff line numberDiff line change
@@ -852,12 +852,17 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP
852852
*/
853853
void 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

Comments
 (0)