@@ -158,7 +158,11 @@ void HardwareTimer::resume(void)
158
158
if (callbacks[0 ] != NULL ) {
159
159
__HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), TIM_FLAG_UPDATE);
160
160
__HAL_TIM_ENABLE_IT (&(_timerObj.handle ), TIM_IT_UPDATE);
161
+
162
+ // Start timer in Time base mode. Required when there is no channel used but only update interrupt.
163
+ HAL_TIM_Base_Start (&(_timerObj.handle ));
161
164
}
165
+
162
166
// Resume all channels
163
167
resumeChannel (1 );
164
168
resumeChannel (2 );
@@ -848,12 +852,17 @@ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subP
848
852
*/
849
853
void HardwareTimer::attachInterrupt (void (*callback)(HardwareTimer *))
850
854
{
851
- callbacks[0 ] = callback;
852
- if (callback != NULL ) {
853
- // Clear flag before enabling IT
854
- __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), TIM_FLAG_UPDATE);
855
- // Enable update interrupt only if callback is valid
856
- __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
+ }
857
866
}
858
867
}
859
868
@@ -885,12 +894,17 @@ void HardwareTimer::attachInterrupt(uint32_t channel, void (*callback)(HardwareT
885
894
Error_Handler (); // only channel 1..4 have an interrupt
886
895
}
887
896
888
- callbacks[channel] = callback;
889
- if (callback != NULL ) {
890
- // Clear flag before enabling IT
891
- __HAL_TIM_CLEAR_FLAG (&(_timerObj.handle ), interrupt);
892
- // Enable interrupt corresponding to channel, only if callback is valid
893
- __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
+ }
894
908
}
895
909
}
896
910
0 commit comments