Bug fix for TIM9 interrupt for PWM

Use this forum for requesting small changes in ChibiOS. Large changes should be discussed in the development forum. This forum is NOT for support.
wild-boar
Posts: 8
Joined: Thu May 08, 2014 11:58 pm
Been thanked: 1 time

Bug fix for TIM9 interrupt for PWM

Postby wild-boar » Thu Dec 24, 2020 9:58 pm

I upgraded a project from ChibiOS 18 to 20. I noticed that the interrupt handler for TIM9 under PWM was removed. I put back the changes and it appears to be working. Here are the three code changes. Thanks!

diff --git a/os/hal/ports/STM32/LLD/TIMv1/hal_pwm_lld.c b/os/hal/ports/STM32/LLD/TIMv1/hal_pwm_lld.c
index eb6bebc7e..9b10df847 100644
--- a/os/hal/ports/STM32/LLD/TIMv1/hal_pwm_lld.c
+++ b/os/hal/ports/STM32/LLD/TIMv1/hal_pwm_lld.c
@@ -364,7 +364,22 @@ OSAL_IRQ_HANDLER(STM32_TIM8_CC_HANDLER) {

#if STM32_PWM_USE_TIM9 || defined(__DOXYGEN__)
#if !defined(STM32_TIM9_SUPPRESS_ISR)
-#error "TIM9 ISR not defined by platform"
+#if !defined(STM32_TIM9_HANDLER)
+#error "STM32_TIM9_HANDLER not defined"
+#endif
+/**
+ * * @brief TIM9 interrupt handler.
+ * *
+ * * @isr
+ * */
+OSAL_IRQ_HANDLER(STM32_TIM9_HANDLER) {
+
+ OSAL_IRQ_PROLOGUE();
+
+ pwm_lld_serve_interrupt(&PWMD9);
+
+ OSAL_IRQ_EPILOGUE();
+}
#endif /* !defined(STM32_TIM9_SUPPRESS_ISR) */
#endif /* STM32_PWM_USE_TIM9 */

@@ -683,6 +698,9 @@ void pwm_lld_start(PWMDriver *pwmp) {
if (&PWMD9 == pwmp) {
rccEnableTIM9(true);
rccResetTIM9();
+#if !defined(STM32_TIM9_SUPPRESS_ISR)
+ nvicEnableVector(STM32_TIM9_NUMBER, STM32_PWM_TIM9_IRQ_PRIORITY);
+#endif
#if defined(STM32_TIM9CLK)
pwmp->clock = STM32_TIM9CLK;
#else
@@ -1059,6 +1077,9 @@ void pwm_lld_stop(PWMDriver *pwmp) {

#if STM32_PWM_USE_TIM9
if (&PWMD9 == pwmp) {
+#if !defined(STM32_TIM9_SUPPRESS_ISR)
+ nvicDisableVector(STM32_TIM9_NUMBER);
+#endif
rccDisableTIM9();
}
#endif

User avatar
Giovanni
Site Admin
Posts: 13247
Joined: Wed May 27, 2009 8:48 am
Location: Salerno, Italy
Has thanked: 793 times
Been thanked: 685 times
Contact:

Re: Bug fix for TIM9 interrupt for PWM

Postby Giovanni » Sat Dec 26, 2020 8:41 am

Hi,

The change is intentional, those IRQs sources that share the IRQ handler with other sources are no more defined into the drivers. Recent STM32s define shared handlers in stm32_irq.c so that error is not triggered. Some older STM32s have not yet been updated.

You may define the ISR in your application code making sure to define that macro (perhaps in mcuconf.h) so that the #error is not triggered.

Giovanni

wild-boar
Posts: 8
Joined: Thu May 08, 2014 11:58 pm
Been thanked: 1 time

Re: Bug fix for TIM9 interrupt for PWM

Postby wild-boar » Sat Dec 26, 2020 3:25 pm

Thank you for the response. Looking at all the other ISR handlers, I now understand the problem.

I am using the STM32F4 platform and it is only missing TIM9. I am hoping that you can accept this patch for the STM32F4 platform that adds TIM9 interrupt support back. I have tested it and it works.

I put the patched code here and also attached it. Thanks!

Code: Select all

diff --git a/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc b/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc
new file mode 100644
index 000000000..7aebb4a64
--- /dev/null
+++ b/os/hal/ports/STM32/LLD/TIMv1/stm32_tim9.inc
@@ -0,0 +1,133 @@
+/*
+    ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+/**
+ * @file    TIMv1/stm32_tim9.inc
+ * @brief   Shared TIM9 handler.
+ *
+ * @addtogroup STM32_TIM9_HANDLER
+ * @{
+ */
+
+/*===========================================================================*/
+/* Driver local definitions.                                                 */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Derived constants and error checks.                                       */
+/*===========================================================================*/
+
+/* Registry checks for robustness.*/
+#if !defined(STM32_HAS_TIM9)
+#error "STM32_HAS_TIM9 not defined in registry"
+#endif
+
+/* Driver checks for robustness, undefined USE macros are defaulted to
+   FALSE. This makes this module independent from drivers implementation.*/
+#if !defined(STM32_GPT_USE_TIM9)
+#define STM32_GPT_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_ICU_USE_TIM9)
+#define STM32_ICU_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_PWM_USE_TIM9)
+#define STM32_PWM_USE_TIM9                  FALSE
+#endif
+#if !defined(STM32_ST_USE_TIM9)
+#define STM32_ST_USE_TIM9                   FALSE
+#endif
+
+#if STM32_HAS_TIM9
+
+/* Priority settings checks.*/
+#if !defined(STM32_IRQ_TIM9_PRIORITY)
+#error "STM32_IRQ_TIM9_PRIORITY not defined in mcuconf.h"
+#endif
+
+#if !OSAL_IRQ_IS_VALID_PRIORITY(STM32_IRQ_TIM9_PRIORITY)
+#error "Invalid IRQ priority assigned to STM32_IRQ_TIM9_PRIORITY"
+#endif
+
+#endif /* STM32_HAS_TIM9 */
+
+/*===========================================================================*/
+/* Driver exported variables.                                                */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local variables.                                                   */
+/*===========================================================================*/
+
+/*===========================================================================*/
+/* Driver local functions.                                                   */
+/*===========================================================================*/
+
+static inline void tim9_irq_init(void) {
+#if defined(STM32_TIM9_IS_USED)
+  nvicEnableVector(STM32_TIM9_NUMBER, STM32_IRQ_TIM9_PRIORITY);
+#endif
+}
+
+static inline void tim9_irq_deinit(void) {
+#if defined(STM32_TIM9_IS_USED)
+  nvicDisableVector(STM32_TIM9_NUMBER);
+#endif
+}
+
+/*===========================================================================*/
+/* Driver interrupt handlers.                                                */
+/*===========================================================================*/
+
+#if defined(STM32_TIM9_IS_USED) || defined(__DOXYGEN__)
+/**
+ * @brief   TIM9 interrupt handler.
+ *
+ * @isr
+ */
+OSAL_IRQ_HANDLER(STM32_TIM9_HANDLER) {
+
+  OSAL_IRQ_PROLOGUE();
+
+#if HAL_USE_GPT
+#if STM32_GPT_USE_TIM9
+  gpt_lld_serve_interrupt(&GPTD9);
+#endif
+#endif
+#if HAL_USE_ICU
+#if STM32_ICU_USE_TIM9
+  icu_lld_serve_interrupt(&ICUD9);
+#endif
+#endif
+#if HAL_USE_PWM
+#if STM32_PWM_USE_TIM9
+  pwm_lld_serve_interrupt(&PWMD9);
+#endif
+#endif
+#if 1
+#if STM32_ST_USE_TIM9
+  st_lld_serve_interrupt();
+#endif
+#endif
+
+  OSAL_IRQ_EPILOGUE();
+}
+#endif
+
+/*===========================================================================*/
+/* Driver exported functions.                                                */
+/*===========================================================================*/
+
+/** @} */
diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_isr.c b/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
index 08237e1c3..65767f908 100644
--- a/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
+++ b/os/hal/ports/STM32/STM32F4xx/stm32_isr.c
@@ -51,6 +51,8 @@
 /* Driver interrupt handlers.                                                */
 /*===========================================================================*/
 
+#include "stm32_tim9.inc"
+
 #if (HAL_USE_PAL && (PAL_USE_WAIT || PAL_USE_CALLBACKS)) || defined(__DOXYGEN__)
 #if !defined(STM32_DISABLE_EXTI0_HANDLER)
 /**
@@ -223,6 +225,8 @@ OSAL_IRQ_HANDLER(VectorE0) {
  */
 void irqInit(void) {
 
+  tim9_irq_init();
+
 #if HAL_USE_PAL
   nvicEnableVector(EXTI0_IRQn, STM32_IRQ_EXTI0_PRIORITY);
   nvicEnableVector(EXTI1_IRQn, STM32_IRQ_EXTI1_PRIORITY);
@@ -241,6 +245,8 @@ void irqInit(void) {
  */
 void irqDeinit(void) {
 
+  tim9_irq_deinit();
+
 #if HAL_USE_PAL
   nvicDisableVector(EXTI0_IRQn);
   nvicDisableVector(EXTI1_IRQn);
diff --git a/os/hal/ports/STM32/STM32F4xx/stm32_isr.h b/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
index 6a826f6a3..3499794ec 100644
--- a/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
+++ b/os/hal/ports/STM32/STM32F4xx/stm32_isr.h
@@ -29,6 +29,12 @@
 /* Driver constants.                                                         */
 /*===========================================================================*/
 
+/**
+ * @name    ISRs suppressed in standard drivers
+ * @{
+ */
+#define STM32_TIM9_SUPPRESS_ISR
+
 /**
  * @name    ISR names and numbers remapping
  * @{
Attachments
patch.zip
Patch with new include file.
(3 KiB) Downloaded 7 times

User avatar
FXCoder
Posts: 313
Joined: Sun Jun 12, 2016 4:10 am
Location: Sydney, Australia
Has thanked: 140 times
Been thanked: 101 times

Re: Bug fix for TIM9 interrupt for PWM

Postby FXCoder » Sat Jan 16, 2021 4:47 am

Hi,
The existing 20.3.x ChibiOS branch is intended to support TIM9 through stm32_tim1_9_10_11.inc

There is a typo in that file at line 191...

Code: Select all

#if defined(STM32_TIM1_IS_USED) || defined(STM32_TIM19_IS_USED)  ||         \

Should be...

Code: Select all

#if defined(STM32_TIM1_IS_USED) || defined(STM32_TIM9_IS_USED)  ||          \


Try removing your patch, edit os/hal/ports/STM32/LLD/TIMv1/stm32_tim1_9_10_11.inc as above and let us know how that goes.
--
Bob


Return to “Small Change Requests”

Who is online

Users browsing this forum: No registered users and 3 guests