Skip to content

Commit c8fc079

Browse files
committed
Merge branch 'fix_int_handler' of https://github.com/svastm/mbed into svastm-fix_int_handler
Conflicts: hal/targets/hal/TARGET_STM/TARGET_STM32F0/pwmout_api.c hal/targets/hal/TARGET_STM/TARGET_STM32F7/pwmout_api.c
2 parents 5cd7317 + be1efa4 commit c8fc079

File tree

44 files changed

+810
-614
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+810
-614
lines changed

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F030R8/hal_tick.c

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ void timer_update_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

@@ -64,31 +66,35 @@ void timer_oc_irq_handler(void)
6466

6567
// Channel 1 for mbed timeout
6668
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
67-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
68-
if (oc_rem_part > 0) {
69-
set_compare(oc_rem_part); // Finish the remaining time left
70-
oc_rem_part = 0;
71-
} else {
72-
if (oc_int_part > 0) {
73-
set_compare(0xFFFF);
74-
oc_rem_part = cval; // To finish the counter loop the next time
75-
oc_int_part--;
69+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
70+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
71+
if (oc_rem_part > 0) {
72+
set_compare(oc_rem_part); // Finish the remaining time left
73+
oc_rem_part = 0;
7674
} else {
77-
us_ticker_irq_handler();
75+
if (oc_int_part > 0) {
76+
set_compare(0xFFFF);
77+
oc_rem_part = cval; // To finish the counter loop the next time
78+
oc_int_part--;
79+
} else {
80+
us_ticker_irq_handler();
81+
}
7882
}
7983
}
8084
}
8185

8286
// Channel 2 for HAL tick
8387
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
84-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
85-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
86-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
87-
// Increment HAL variable
88-
HAL_IncTick();
89-
// Prepare next interrupt
90-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
91-
PreviousVal = val;
88+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
89+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
90+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
91+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
92+
// Increment HAL variable
93+
HAL_IncTick();
94+
// Prepare next interrupt
95+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
96+
PreviousVal = val;
97+
}
9298
}
9399
}
94100
}

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F031K6/hal_tick.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,28 @@ void us_ticker_irq_handler(void);
4141

4242
void timer_irq_handler(void) {
4343
// Channel 1 for mbed timeout
44-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC1) == SET) {
45-
us_ticker_irq_handler();
44+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
45+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
46+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
47+
us_ticker_irq_handler();
48+
}
4649
}
4750

4851
// Channel 2 for HAL tick
49-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC2) == SET) {
50-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
51-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
52-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
53-
// Increment HAL variable
54-
HAL_IncTick();
55-
// Prepare next interrupt
56-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
57-
PreviousVal = val;
52+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
53+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
54+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
55+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
56+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
57+
// Increment HAL variable
58+
HAL_IncTick();
59+
// Prepare next interrupt
60+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
61+
PreviousVal = val;
5862
#if 0 // For DEBUG only
59-
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
63+
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
6064
#endif
65+
}
6166
}
6267
}
6368
}
@@ -77,7 +82,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
7782
// Configure time base
7883
TimMasterHandle.Instance = TIM_MST;
7984
TimMasterHandle.Init.Period = 0xFFFFFFFF;
80-
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
85+
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
8186
TimMasterHandle.Init.ClockDivision = 0;
8287
TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
8388
TimMasterHandle.Init.RepetitionCounter = 0;

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F042K6/hal_tick.c

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,28 @@ void us_ticker_irq_handler(void);
4141

4242
void timer_irq_handler(void) {
4343
// Channel 1 for mbed timeout
44-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC1) == SET) {
45-
us_ticker_irq_handler();
44+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
45+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
46+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
47+
us_ticker_irq_handler();
48+
}
4649
}
4750

4851
// Channel 2 for HAL tick
49-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC2) == SET) {
50-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
51-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
52-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
53-
// Increment HAL variable
54-
HAL_IncTick();
55-
// Prepare next interrupt
56-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
57-
PreviousVal = val;
52+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
53+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
54+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
55+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
56+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
57+
// Increment HAL variable
58+
HAL_IncTick();
59+
// Prepare next interrupt
60+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
61+
PreviousVal = val;
5862
#if 0 // For DEBUG only
59-
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
63+
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
6064
#endif
65+
}
6166
}
6267
}
6368
}
@@ -77,7 +82,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
7782
// Configure time base
7883
TimMasterHandle.Instance = TIM_MST;
7984
TimMasterHandle.Init.Period = 0xFFFFFFFF;
80-
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
85+
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
8186
TimMasterHandle.Init.ClockDivision = 0;
8287
TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
8388
TimMasterHandle.Init.RepetitionCounter = 0;

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F070RB/hal_tick.c

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,10 @@ void timer_update_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

@@ -64,34 +66,38 @@ void timer_oc_irq_handler(void)
6466

6567
// Channel 1 for mbed timeout
6668
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
67-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC1);
68-
if (oc_rem_part > 0) {
69-
set_compare(oc_rem_part); // Finish the remaining time left
70-
oc_rem_part = 0;
71-
} else {
72-
if (oc_int_part > 0) {
73-
set_compare(0xFFFF);
74-
oc_rem_part = cval; // To finish the counter loop the next time
75-
oc_int_part--;
69+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
70+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
71+
if (oc_rem_part > 0) {
72+
set_compare(oc_rem_part); // Finish the remaining time left
73+
oc_rem_part = 0;
7674
} else {
77-
us_ticker_irq_handler();
75+
if (oc_int_part > 0) {
76+
set_compare(0xFFFF);
77+
oc_rem_part = cval; // To finish the counter loop the next time
78+
oc_int_part--;
79+
} else {
80+
us_ticker_irq_handler();
81+
}
7882
}
7983
}
8084
}
8185

8286
// Channel 2 for HAL tick
8387
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
84-
__HAL_TIM_CLEAR_FLAG(&TimMasterHandle, TIM_FLAG_CC2);
85-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
86-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
87-
// Increment HAL variable
88-
HAL_IncTick();
89-
// Prepare next interrupt
90-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
91-
PreviousVal = val;
88+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
89+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
90+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
91+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
92+
// Increment HAL variable
93+
HAL_IncTick();
94+
// Prepare next interrupt
95+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
96+
PreviousVal = val;
9297
#if 0 // For DEBUG only
93-
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
98+
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
9499
#endif
100+
}
95101
}
96102
}
97103
}

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F072RB/hal_tick.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,28 @@ void us_ticker_irq_handler(void);
4141

4242
void timer_irq_handler(void) {
4343
// Channel 1 for mbed timeout
44-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC1) == SET) {
45-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
46-
us_ticker_irq_handler();
44+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
45+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
46+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
47+
us_ticker_irq_handler();
48+
}
4749
}
4850

4951
// Channel 2 for HAL tick
50-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC2) == SET) {
51-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
52-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
53-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
54-
// Increment HAL variable
55-
HAL_IncTick();
56-
// Prepare next interrupt
57-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
58-
PreviousVal = val;
52+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
53+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
54+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
55+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
56+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
57+
// Increment HAL variable
58+
HAL_IncTick();
59+
// Prepare next interrupt
60+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
61+
PreviousVal = val;
5962
#if 0 // For DEBUG only
60-
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
63+
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
6164
#endif
65+
}
6266
}
6367
}
6468
}
@@ -78,7 +82,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
7882
// Configure time base
7983
TimMasterHandle.Instance = TIM_MST;
8084
TimMasterHandle.Init.Period = 0xFFFFFFFF;
81-
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
85+
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
8286
TimMasterHandle.Init.ClockDivision = 0;
8387
TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
8488
TimMasterHandle.Init.RepetitionCounter = 0;

hal/targets/cmsis/TARGET_STM/TARGET_STM32F0/TARGET_NUCLEO_F091RC/hal_tick.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,24 +41,28 @@ void us_ticker_irq_handler(void);
4141

4242
void timer_irq_handler(void) {
4343
// Channel 1 for mbed timeout
44-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC1) == SET) {
45-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
46-
us_ticker_irq_handler();
44+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC1) == SET) {
45+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC1) == SET) {
46+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC1);
47+
us_ticker_irq_handler();
48+
}
4749
}
4850

4951
// Channel 2 for HAL tick
50-
if (__HAL_TIM_GET_ITSTATUS(&TimMasterHandle, TIM_IT_CC2) == SET) {
51-
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
52-
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
53-
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
54-
// Increment HAL variable
55-
HAL_IncTick();
56-
// Prepare next interrupt
57-
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
58-
PreviousVal = val;
52+
if (__HAL_TIM_GET_FLAG(&TimMasterHandle, TIM_FLAG_CC2) == SET) {
53+
if (__HAL_TIM_GET_IT_SOURCE(&TimMasterHandle, TIM_IT_CC2) == SET) {
54+
__HAL_TIM_CLEAR_IT(&TimMasterHandle, TIM_IT_CC2);
55+
uint32_t val = __HAL_TIM_GetCounter(&TimMasterHandle);
56+
if ((val - PreviousVal) >= HAL_TICK_DELAY) {
57+
// Increment HAL variable
58+
HAL_IncTick();
59+
// Prepare next interrupt
60+
__HAL_TIM_SetCompare(&TimMasterHandle, TIM_CHANNEL_2, val + HAL_TICK_DELAY);
61+
PreviousVal = val;
5962
#if 0 // For DEBUG only
60-
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
63+
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
6164
#endif
65+
}
6266
}
6367
}
6468
}
@@ -78,7 +82,7 @@ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) {
7882
// Configure time base
7983
TimMasterHandle.Instance = TIM_MST;
8084
TimMasterHandle.Init.Period = 0xFFFFFFFF;
81-
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 µs tick
85+
TimMasterHandle.Init.Prescaler = (uint32_t)(SystemCoreClock / 1000000) - 1; // 1 us tick
8286
TimMasterHandle.Init.ClockDivision = 0;
8387
TimMasterHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
8488
TimMasterHandle.Init.RepetitionCounter = 0;

0 commit comments

Comments
 (0)