From 7ea6570ebbfb8de28f6c19514b737ce17d8be904 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Sat, 9 May 2020 13:12:23 -0700 Subject: [PATCH 1/2] Fixed setting HardwareTimer interrupt priority HardwareTimer::setInterruptPriority previously stored the priority fur future use, but it was typically never applied. It was applied only during the call to HAL_TIM_Base_Init in the HardwareTimer constructor. This change sets the priority immediately, in addition to storing it for future use by the HAL. --- cores/arduino/HardwareTimer.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 3c325d287c..9672337127 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -35,9 +35,6 @@ /* Private Variables */ timerObj_t *HardwareTimer_Handle[TIMER_NUM] = {NULL}; -IRQn_Type getTimerUpIrq(TIM_TypeDef *tim); -IRQn_Type getTimerCCIrq(TIM_TypeDef *tim); - /** * @brief HardwareTimer constructor: set default configuration values * @param Timer instance ex: TIM1, ... @@ -913,6 +910,10 @@ void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, ui */ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { + // Set priority for immediate use + NVIC_SetPriority(getTimerUpIrq(_timerObj.handle.Instance), NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority)); + + // Store priority for use if timer is re-initialized _timerObj.preemptPriority = preemptPriority; _timerObj.subPriority = subPriority; } From ebf27ee9d3d2419f62b7540d4eaf63ff97560e7d Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 12 May 2020 19:40:05 -0700 Subject: [PATCH 2/2] Set priority for Capture/Compare if different IRQ than Update --- cores/arduino/HardwareTimer.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cores/arduino/HardwareTimer.cpp b/cores/arduino/HardwareTimer.cpp index 9672337127..424770b286 100644 --- a/cores/arduino/HardwareTimer.cpp +++ b/cores/arduino/HardwareTimer.cpp @@ -910,8 +910,13 @@ void HardwareTimer::setPWM(uint32_t channel, PinName pin, uint32_t frequency, ui */ void HardwareTimer::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { - // Set priority for immediate use - NVIC_SetPriority(getTimerUpIrq(_timerObj.handle.Instance), NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority)); + // Set Update interrupt priority for immediate use + HAL_NVIC_SetPriority(getTimerUpIrq(_timerObj.handle.Instance), preemptPriority, subPriority); + + // Set Capture/Compare interrupt priority if timer provides a unique IRQ + if (getTimerCCIrq(_timerObj.handle.Instance) != getTimerUpIrq(_timerObj.handle.Instance)) { + HAL_NVIC_SetPriority(getTimerCCIrq(_timerObj.handle.Instance), preemptPriority, subPriority); + } // Store priority for use if timer is re-initialized _timerObj.preemptPriority = preemptPriority;