Skip to content

Commit 2780436

Browse files
committed
[STM32L0XX] Fix timer interrupt handler
1 parent fe3b80a commit 2780436

File tree

5 files changed

+107
-86
lines changed

5 files changed

+107
-86
lines changed

hal/targets/cmsis/TARGET_STM/TARGET_STM32L0/TARGET_DISCO_L053C8/hal_tick.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,37 +51,43 @@ void timer_irq_handler(void) {
5151

5252
// Clear Update interrupt flag
5353
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE) == SET) {
54-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE);
55-
SlaveCounter++;
54+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET) {
55+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_UPDATE);
56+
SlaveCounter++;
57+
}
5658
}
5759

5860
// Channel 1 for mbed timeout
5961
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
60-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
61-
if (oc_rem_part > 0) {
62-
set_compare(oc_rem_part); // Finish the remaining time left
63-
oc_rem_part = 0;
64-
} else {
65-
if (oc_int_part > 0) {
66-
set_compare(0xFFFF);
67-
oc_rem_part = cval; // To finish the counter loop the next time
68-
oc_int_part--;
62+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
63+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
64+
if (oc_rem_part > 0) {
65+
set_compare(oc_rem_part); // Finish the remaining time left
66+
oc_rem_part = 0;
6967
} else {
70-
us_ticker_irq_handler();
68+
if (oc_int_part > 0) {
69+
set_compare(0xFFFF);
70+
oc_rem_part = cval; // To finish the counter loop the next time
71+
oc_int_part--;
72+
} else {
73+
us_ticker_irq_handler();
74+
}
7175
}
7276
}
7377
}
7478

7579
// Channel 2 for HAL tick
7680
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
77-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
78-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
79-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
80-
// Increment HAL variable
81-
HAL_IncTick();
82-
// Prepare next interrupt
83-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
84-
PreviousVal = val;
81+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
82+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
83+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
84+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
85+
// Increment HAL variable
86+
HAL_IncTick();
87+
// Prepare next interrupt
88+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
89+
PreviousVal = val;
90+
}
8591
}
8692
}
8793
}

hal/targets/cmsis/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L011K4/hal_tick.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,15 @@ void timer_irq_handler(void) {
5151

5252
// Clear Update interrupt flag
5353
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE) == SET) {
54-
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET)
55-
{
54+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET) {
5655
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_UPDATE);
5756
SlaveCounter++;
5857
}
5958
}
6059

6160
// Channel 1 for mbed timeout
6261
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
63-
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET)
64-
{
62+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
6563
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
6664
if (oc_rem_part > 0) {
6765
set_compare(oc_rem_part); // Finish the remaining time left
@@ -80,8 +78,7 @@ void timer_irq_handler(void) {
8078

8179
// Channel 2 for HAL tick
8280
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
83-
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET)
84-
{
81+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
8582
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
8683
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
8784
if ((val - PreviousVal) >= HAL_TICK_DELAY) {

hal/targets/cmsis/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L031K6/hal_tick.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,37 +51,43 @@ void timer_irq_handler(void) {
5151

5252
// Clear Update interrupt flag
5353
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE) == SET) {
54-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE);
55-
SlaveCounter++;
54+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET) {
55+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_UPDATE);
56+
SlaveCounter++;
57+
}
5658
}
5759

5860
// Channel 1 for mbed timeout
5961
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
60-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
61-
if (oc_rem_part > 0) {
62-
set_compare(oc_rem_part); // Finish the remaining time left
63-
oc_rem_part = 0;
64-
} else {
65-
if (oc_int_part > 0) {
66-
set_compare(0xFFFF);
67-
oc_rem_part = cval; // To finish the counter loop the next time
68-
oc_int_part--;
62+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
63+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
64+
if (oc_rem_part > 0) {
65+
set_compare(oc_rem_part); // Finish the remaining time left
66+
oc_rem_part = 0;
6967
} else {
70-
us_ticker_irq_handler();
68+
if (oc_int_part > 0) {
69+
set_compare(0xFFFF);
70+
oc_rem_part = cval; // To finish the counter loop the next time
71+
oc_int_part--;
72+
} else {
73+
us_ticker_irq_handler();
74+
}
7175
}
7276
}
7377
}
7478

7579
// Channel 2 for HAL tick
7680
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
77-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
78-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
79-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
80-
// Increment HAL variable
81-
HAL_IncTick();
82-
// Prepare next interrupt
83-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
84-
PreviousVal = val;
81+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
82+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
83+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
84+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
85+
// Increment HAL variable
86+
HAL_IncTick();
87+
// Prepare next interrupt
88+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
89+
PreviousVal = val;
90+
}
8591
}
8692
}
8793
}

hal/targets/cmsis/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L053R8/hal_tick.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,37 +51,43 @@ void timer_irq_handler(void) {
5151

5252
// Clear Update interrupt flag
5353
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE) == SET) {
54-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE);
55-
SlaveCounter++;
54+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET) {
55+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_UPDATE);
56+
SlaveCounter++;
57+
}
5658
}
5759

5860
// Channel 1 for mbed timeout
5961
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
60-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
61-
if (oc_rem_part > 0) {
62-
set_compare(oc_rem_part); // Finish the remaining time left
63-
oc_rem_part = 0;
64-
} else {
65-
if (oc_int_part > 0) {
66-
set_compare(0xFFFF);
67-
oc_rem_part = cval; // To finish the counter loop the next time
68-
oc_int_part--;
62+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
63+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
64+
if (oc_rem_part > 0) {
65+
set_compare(oc_rem_part); // Finish the remaining time left
66+
oc_rem_part = 0;
6967
} else {
70-
us_ticker_irq_handler();
68+
if (oc_int_part > 0) {
69+
set_compare(0xFFFF);
70+
oc_rem_part = cval; // To finish the counter loop the next time
71+
oc_int_part--;
72+
} else {
73+
us_ticker_irq_handler();
74+
}
7175
}
7276
}
7377
}
7478

7579
// Channel 2 for HAL tick
7680
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
77-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
78-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
79-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
80-
// Increment HAL variable
81-
HAL_IncTick();
82-
// Prepare next interrupt
83-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
84-
PreviousVal = val;
81+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
82+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
83+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
84+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
85+
// Increment HAL variable
86+
HAL_IncTick();
87+
// Prepare next interrupt
88+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
89+
PreviousVal = val;
90+
}
8591
}
8692
}
8793
}

hal/targets/cmsis/TARGET_STM/TARGET_STM32L0/TARGET_NUCLEO_L073RZ/hal_tick.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,37 +51,43 @@ void timer_irq_handler(void) {
5151

5252
// Clear Update interrupt flag
5353
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE) == SET) {
54-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_UPDATE);
55-
SlaveCounter++;
54+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_UPDATE) == SET) {
55+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_UPDATE);
56+
SlaveCounter++;
57+
}
5658
}
5759

5860
// Channel 1 for mbed timeout
5961
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
60-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
61-
if (oc_rem_part > 0) {
62-
set_compare(oc_rem_part); // Finish the remaining time left
63-
oc_rem_part = 0;
64-
} else {
65-
if (oc_int_part > 0) {
66-
set_compare(0xFFFF);
67-
oc_rem_part = cval; // To finish the counter loop the next time
68-
oc_int_part--;
62+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
63+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
64+
if (oc_rem_part > 0) {
65+
set_compare(oc_rem_part); // Finish the remaining time left
66+
oc_rem_part = 0;
6967
} else {
70-
us_ticker_irq_handler();
68+
if (oc_int_part > 0) {
69+
set_compare(0xFFFF);
70+
oc_rem_part = cval; // To finish the counter loop the next time
71+
oc_int_part--;
72+
} else {
73+
us_ticker_irq_handler();
74+
}
7175
}
7276
}
7377
}
7478

7579
// Channel 2 for HAL tick
7680
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
77-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
78-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
79-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
80-
// Increment HAL variable
81-
HAL_IncTick();
82-
// Prepare next interrupt
83-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
84-
PreviousVal = val;
81+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
82+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
83+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
84+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
85+
// Increment HAL variable
86+
HAL_IncTick();
87+
// Prepare next interrupt
88+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
89+
PreviousVal = val;
90+
}
8591
}
8692
}
8793
}

0 commit comments

Comments
 (0)