Skip to content

Commit a3ddf3a

Browse files
committed
[Timer] Add function to set interrupt priority
Signed-off-by: Frederic Pillon <[email protected]>
1 parent a61b5fa commit a3ddf3a

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

Diff for: cores/arduino/HardwareTimer.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ HardwareTimer::HardwareTimer(TIM_TypeDef *instance)
6666

6767
_timerObj.handle.Instance = instance;
6868
_timerObj.__this = (void *)this;
69+
_timerObj.preemptPriority = TIM_IRQ_PRIO;
70+
_timerObj.subPriority = TIM_IRQ_SUBPRIO;
6971

7072
// Enable Timer clock
7173
enableTimerClock(&(_timerObj.handle));
@@ -638,6 +640,19 @@ void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, ui
638640
resume();
639641
}
640642

643+
/**
644+
* @brief Set the priority of the interrupt
645+
* @note Must be call before resume()
646+
* @param preemptPriority: the pre-emption priority for the IRQn channel
647+
* @param subPriority: the subpriority level for the IRQ channel.
648+
* @retval None
649+
*/
650+
void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority)
651+
{
652+
_timerObj.preemptPriority = preemptPriority;
653+
_timerObj.subPriority = subPriority;
654+
}
655+
641656
/**
642657
* @brief Attach interrupt callback on update (rollover) event
643658
* @param callback: interrupt callback

Diff for: cores/arduino/HardwareTimer.h

+2
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ class HardwareTimer {
105105

106106
void setCaptureCompare(uint32_t channel, uint32_t compare, TimerCompareFormat_t format = TICK_COMPARE_FORMAT); // set Compare register value of specified channel depending on format provided
107107

108+
void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); // set interrupt priority
109+
108110
//Add interrupt to period update
109111
void attachInterrupt(void (*handler)(HardwareTimer *)); // Attach interrupt callback which will be called upon update event (timer rollover)
110112
void detachInterrupt(); // remove interrupt callback which was attached to update event

Diff for: cores/arduino/stm32/timer.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ timerObj_t *get_timer_obj(TIM_HandleTypeDef *htim)
3737
*/
3838
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim_base)
3939
{
40+
timerObj_t *obj = get_timer_obj(htim_base);
4041
enableTimerClock(htim_base);
4142

4243
// configure Update interrupt
43-
HAL_NVIC_SetPriority(getTimerUpIrq(htim_base->Instance), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
44+
HAL_NVIC_SetPriority(getTimerUpIrq(htim_base->Instance), obj->preemptPriority, obj->subPriority);
4445
HAL_NVIC_EnableIRQ(getTimerUpIrq(htim_base->Instance));
4546

4647
if (getTimerCCIrq(htim_base->Instance) != getTimerUpIrq(htim_base->Instance)) {
4748
// configure Capture Compare interrupt
48-
HAL_NVIC_SetPriority(getTimerCCIrq(htim_base->Instance), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
49+
HAL_NVIC_SetPriority(getTimerCCIrq(htim_base->Instance), obj->preemptPriority, obj->subPriority);
4950
HAL_NVIC_EnableIRQ(getTimerCCIrq(htim_base->Instance));
5051
}
5152
}
@@ -69,15 +70,16 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim_base)
6970
*/
7071
void HAL_TIM_OC_MspInit(TIM_HandleTypeDef *htim)
7172
{
73+
timerObj_t *obj = get_timer_obj(htim);
7274
enableTimerClock(htim);
7375

7476
// configure Update interrupt
75-
HAL_NVIC_SetPriority(getTimerUpIrq(htim->Instance), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
77+
HAL_NVIC_SetPriority(getTimerUpIrq(htim->Instance), obj->preemptPriority, obj->subPriority);
7678
HAL_NVIC_EnableIRQ(getTimerUpIrq(htim->Instance));
7779

7880
if (getTimerCCIrq(htim->Instance) != getTimerUpIrq(htim->Instance)) {
7981
// configure Capture Compare interrupt
80-
HAL_NVIC_SetPriority(getTimerCCIrq(htim->Instance), TIM_IRQ_PRIO, TIM_IRQ_SUBPRIO);
82+
HAL_NVIC_SetPriority(getTimerCCIrq(htim->Instance), obj->preemptPriority, obj->subPriority);
8183
HAL_NVIC_EnableIRQ(getTimerCCIrq(htim->Instance));
8284
}
8385
}

Diff for: cores/arduino/stm32/timer.h

+2
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,8 @@ typedef struct {
238238
// Those 2 first fields must remain in this order at the beginning of the structure
239239
void *__this;
240240
TIM_HandleTypeDef handle;
241+
uint32_t preemptPriority;
242+
uint32_t subPriority;
241243
} timerObj_t;
242244

243245
/* Exported functions ------------------------------------------------------- */

0 commit comments

Comments
 (0)