This is an automated email from the ASF dual-hosted git repository.

jerpelea pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a163815406 arch/arm/stm32h5: Fix MCO clock pins and config
5a163815406 is described below

commit 5a163815406814d1b0b8596b47ec5e6ed6ee8a4b
Author: Darryl Ring <[email protected]>
AuthorDate: Thu Aug 20 16:27:30 2026 -0700

    arch/arm/stm32h5: Fix MCO clock pins and config
    
    Add the correct pin map definitions for MCO1 and MCO2, and add the clock
    division option to stm32_mco{1,2}config with a macro. This matches the
    STM32H7 implementation.
    
    Signed-off-by: Darryl Ring <[email protected]>
---
 arch/arm/src/stm32h5/hardware/stm32h56xxx_pinmap.h |  3 ++-
 arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h     | 20 ++++++--------------
 arch/arm/src/stm32h5/stm32_rcc.h                   | 16 ++++++++++------
 3 files changed, 18 insertions(+), 21 deletions(-)

diff --git a/arch/arm/src/stm32h5/hardware/stm32h56xxx_pinmap.h 
b/arch/arm/src/stm32h5/hardware/stm32h56xxx_pinmap.h
index c9e8d59d7b6..672870ef0d4 100644
--- a/arch/arm/src/stm32h5/hardware/stm32h56xxx_pinmap.h
+++ b/arch/arm/src/stm32h5/hardware/stm32h56xxx_pinmap.h
@@ -127,7 +127,8 @@
 
 /* Clocks outputs */
 
-#define GPIO_MCO_0             (GPIO_ALT|GPIO_AF0|GPIO_PORTA|GPIO_PIN8)
+#define GPIO_MCO1_0            
(GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTA|GPIO_PIN8)
+#define GPIO_MCO2_0            
(GPIO_ALT|GPIO_AF0|GPIO_PUSHPULL|GPIO_PORTC|GPIO_PIN9)
 
 /* I2C */
 
diff --git a/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h 
b/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
index 3383507d502..2303e8dfdda 100644
--- a/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
+++ b/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
@@ -218,15 +218,11 @@
 #define RCC_CFGR1_TIMPRE                 (1 << 15) /* timers clocks prescaler 
selection */
 
 #define RCC_CFGR1_MCO1PRE_SHIFT             (18) /* Bits 21-18: MCO1 Prescaler 
*/
-#define RCC_CFGR1_MCO1PRE_MASK              (0xf << RCC_CFGR1_MCO1PRE_SHIFT)
-#  define RCC_CFGR1_MCO1PRE_MCO1            (0 << RCC_CFGR1_MCO1PRE_SHIFT)  /* 
0xx: MCO1 not divided */
-#  define RCC_CFGR1_MCO1PRE_MCO1d2          (2 << RCC_CFGR1_MCO1PRE_SHIFT)  /* 
10: MCO1 divided by 2 */
-#  define RCC_CFGR1_MCO1PRE_MCO1d4          (4 << RCC_CFGR1_MCO1PRE_SHIFT)  /* 
100: MCO1 divided by 4 */
-#  define RCC_CFGR1_MCO1PRE_MCO1d8          (8 << RCC_CFGR1_MCO1PRE_SHIFT)  /* 
1000: MCO1 divided by 8 */
-#  define RCC_CFGR1_MCO1PRE_MCO1d15         (15 << RCC_CFGR1_MCO1PRE_SHIFT) /* 
1111: MCO1 divided by 15 */
+#define RCC_CFGR1_MCO1PRE_MASK              (0xfU << RCC_CFGR1_MCO1PRE_SHIFT)
+#define RCC_CFGR1_MCO1PRE(x)                (((x) << RCC_CFGR1_MCO1PRE_SHIFT) 
& RCC_CFGR1_MCO1PRE_MASK)
 
 #define RCC_CFGR1_MCO1SEL_SHIFT            (22) /* Bits 24-22: Microcontroller 
Clock Output1 */
-#define RCC_CFGR1_MCO1SEL_MASK             (0x7 << RCC_CFGR1_MCO1SEL_SHIFT)
+#define RCC_CFGR1_MCO1SEL_MASK             (0x7U << RCC_CFGR1_MCO1SEL_SHIFT)
 #  define RCC_CFGR1_MCO1SEL_HSI            (0 << RCC_CFGR1_MCO1SEL_SHIFT) /* 
0000: HSI clock selected */
 #  define RCC_CFGR1_MCO1SEL_LSE            (1 << RCC_CFGR1_MCO1SEL_SHIFT) /* 
0001: LSE clock selected */
 #  define RCC_CFGR1_MCO1SEL_HSE            (2 << RCC_CFGR1_MCO1SEL_SHIFT) /* 
0010: HSE clock selected */
@@ -234,15 +230,11 @@
 #  define RCC_CFGR1_MCO1SEL_HSI48          (4 << RCC_CFGR1_MCO1SEL_SHIFT) /* 
0100: HSI48 clock selected */
 
 #define RCC_CFGR1_MCO2PRE_SHIFT             (25) /* Bits 28-25: MCO2 Prescaler 
*/
-#define RCC_CFGR1_MCO2PRE_MASK              (0xf << RCC_CFGR1_MCO2PRE_SHIFT)
-#  define RCC_CFGR1_MCO2PRE_MCO2            (0 << RCC_CFGR1_MCO2PRE_SHIFT)  /* 
0xx: MCO2 not divided */
-#  define RCC_CFGR1_MCO2PRE_MCO2d2          (2 << RCC_CFGR1_MCO2PRE_SHIFT)  /* 
10: MCO2 divided by 2 */
-#  define RCC_CFGR1_MCO2PRE_MCO2d4          (4 << RCC_CFGR1_MCO2PRE_SHIFT)  /* 
100: MCO2 divided by 4 */
-#  define RCC_CFGR1_MCO2PRE_MCO2d8          (8 << RCC_CFGR1_MCO2PRE_SHIFT)  /* 
1000: MCO2 divided by 8 */
-#  define RCC_CFGR1_MCO2PRE_MCO2d15         (15 << RCC_CFGR1_MCO2PRE_SHIFT) /* 
1111: MCO2 divided by 15 */
+#define RCC_CFGR1_MCO2PRE_MASK              (0xfU << RCC_CFGR1_MCO2PRE_SHIFT)
+#define RCC_CFGR1_MCO2PRE(x)                (((x) << RCC_CFGR1_MCO2PRE_SHIFT) 
& RCC_CFGR1_MCO2PRE_MASK)
 
 #define RCC_CFGR1_MCO2SEL_SHIFT            (29) /* Bits 31-29: Microcontroller 
Clock Output1 */
-#define RCC_CFGR1_MCO2SEL_MASK             (0x7 << RCC_CFGR1_MCO2SEL_SHIFT)
+#define RCC_CFGR1_MCO2SEL_MASK             (0x7U << RCC_CFGR1_MCO2SEL_SHIFT)
 #  define RCC_CFGR1_MCO2SEL_SYSCLLK        (0 << RCC_CFGR1_MCO2SEL_SHIFT) /* 
0000: Main SYSCLLK selected  */
 #  define RCC_CFGR1_MCO2SEL_PLL2           (1 << RCC_CFGR1_MCO2SEL_SHIFT) /* 
0001: Main PLL2 selected  */
 #  define RCC_CFGR1_MCO2SEL_HSE            (2 << RCC_CFGR1_MCO2SEL_SHIFT) /* 
0010: HSE clock selected */
diff --git a/arch/arm/src/stm32h5/stm32_rcc.h b/arch/arm/src/stm32h5/stm32_rcc.h
index 8e0f56fb786..ac95eadf5b9 100644
--- a/arch/arm/src/stm32h5/stm32_rcc.h
+++ b/arch/arm/src/stm32h5/stm32_rcc.h
@@ -67,21 +67,23 @@ extern "C"
  *     chip/stm32h5_rcc.h {RCC_CFGR_SYSCLK, RCC_CFGR_INTCLK,
  *     RCC_CFGR_EXTCLK, RCC_CFGR_PLLCLKd2, RCC_CFGR_PLL2CLK,
  *     RCC_CFGR_PLL3CLKd2, RCC_CFGR_XT1, RCC_CFGR_PLL3CLK}
+ *   div - Clock divider passed through the RCC_CFGR_MCO1PRE macro from
+ *     chip/stm32h5_rcc.h {RCC_CFGR_MCO1PRE(x) where x is 0..15})}
  *
  * Returned Value:
  *   None
  *
  ****************************************************************************/
 
-static inline void stm32_mco1config(uint32_t source)
+static inline void stm32_mco1config(uint32_t source, uint32_t div)
 {
   uint32_t regval;
 
   /* Set MCO source */
 
   regval = getreg32(STM32_RCC_CFGR1);
-  regval &= ~(RCC_CFGR1_MCO1SEL_MASK);
-  regval |= (source & RCC_CFGR1_MCO1SEL_MASK);
+  regval &= ~(RCC_CFGR1_MCO1SEL_MASK | RCC_CFGR1_MCO1PRE_MASK);
+  regval |= (source | div);
   putreg32(regval, STM32_RCC_CFGR1);
 }
 
@@ -95,21 +97,23 @@ static inline void stm32_mco1config(uint32_t source)
  *     chip/stm32h5_rcc.h {RCC_CFGR_SYSCLK, RCC_CFGR_INTCLK,
  *     RCC_CFGR_EXTCLK, RCC_CFGR_PLLCLKd2, RCC_CFGR_PLL2CLK,
  *     RCC_CFGR_PLL3CLKd2, RCC_CFGR_XT1, RCC_CFGR_PLL3CLK}
+ *   div - Clock divider passed through the RCC_CFGR_MCO2PRE macro from
+ *     chip/stm32h5_rcc.h {RCC_CFGR_MCO2PRE(x) where x is 0..15})}
  *
  * Returned Value:
  *   None
  *
  ****************************************************************************/
 
-static inline void stm32_mco2config(uint32_t source)
+static inline void stm32_mco2config(uint32_t source, uint32_t div)
 {
   uint32_t regval;
 
   /* Set MCO source */
 
   regval = getreg32(STM32_RCC_CFGR1);
-  regval &= ~(RCC_CFGR1_MCO2SEL_MASK);
-  regval |= (source & RCC_CFGR1_MCO2SEL_MASK);
+  regval &= ~(RCC_CFGR1_MCO2SEL_MASK | RCC_CFGR1_MCO2PRE_MASK);
+  regval |= (source | div);
   putreg32(regval, STM32_RCC_CFGR1);
 }
 

Reply via email to