You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2024/11/06 19:25:15 UTC

(nuttx) branch master updated: Added PLLxFRACN definitions. Updated board.h to use them. Updated board.h to set SYSCLK to 250 MHz properly.

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

acassis 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 400f2960e6 Added PLLxFRACN definitions. Updated board.h to use them. Updated board.h to set SYSCLK to 250 MHz properly.
400f2960e6 is described below

commit 400f2960e6a4c7e9fffd0ab05b644fda95f7c8b2
Author: Kyle Wilson <kw...@2g-eng.com>
AuthorDate: Wed Nov 6 09:57:24 2024 -0600

    Added PLLxFRACN definitions. Updated board.h to use them. Updated board.h to set SYSCLK to 250 MHz properly.
    
    PLL1FRACN was being set improperly. stm32h5xxx_rcc.c does not shift the value provided by board.h. So it was being set wrong. The defintions in stm32h5xxx_rcc.h shift the FRACN value and are now used by board.h. Also, board.h was not setting PLL1P properly. PLL1P can not have odd divisors. Therefore a value of 0 was invalid. Set it to a value of 1 (divide by 2), then adjust PLL1N to 31 and PLL1FRAC1 to 2048 to actually set SYSCLK to 250MHz.
---
 arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h   | 18 +++++++++++++++
 boards/arm/stm32h5/nucleo-h563zi/include/board.h | 28 +++++++++++++-----------
 2 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h b/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
index 5a5e4f6036..b5ced0a7a9 100644
--- a/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
+++ b/arch/arm/src/stm32h5/hardware/stm32h5xxx_rcc.h
@@ -395,6 +395,12 @@
 #define RCC_PLL1DIVR_PLL1R_MASK             (0x7f << RCC_PLL1DIVR_PLL1R_SHIFT)
 #  define RCC_PLL1DIVR_PLL1R(n)             ((n-1) << RCC_PLL1DIVR_PLL1R_SHIFT) /* m = 1..128 */
 
+/* PLL1 fractional divider register */
+
+#define RCC_PLL1FRACR_PLL1FRACN_SHIFT       (3)
+#define RCC_PLL1FRACR_PLL1FRACN_MASK        (0x1fff << RCC_PLL1FRACR_PLL1FRACN_SHIFT)
+#define RCC_PLL1FRACR_PLL1FRACN(n)          (n << RCC_PLL1FRACR_PLL1FRACN_SHIFT) /* m = 0..8192 */
+
 /* PLL2 dividers register */
 
 #define RCC_PLL2DIVR_PLL2N_SHIFT            (0) /* Bits 8-0:  */
@@ -413,6 +419,12 @@
 #define RCC_PLL2DIVR_PLL2R_MASK             (0x7f << RCC_PLL2DIVR_PLL2R_SHIFT)
 #  define RCC_PLL2DIVR_PLL2R(n)             ((n-1) << RCC_PLL2DIVR_PLL2R_SHIFT) /* m = 1..128 */
 
+/* PLL2 fractional divider register */
+
+#define RCC_PLL2FRACR_PLL2FRACN_SHIFT       (3)
+#define RCC_PLL2FRACR_PLL2FRACN_MASK        (0x1fff << RCC_PLL2FRACR_PLL2FRACN_SHIFT)
+#define RCC_PLL2FRACR_PLL2FRACN(n)          (n << RCC_PLL2FRACR_PLL2FRACN_SHIFT) /* m = 0..8192 */
+
 /* PLL3 dividers register */
 
 #define RCC_PLL3DIVR_PLL3N_SHIFT            (0) /* Bits 8-0:  */
@@ -431,6 +443,12 @@
 #define RCC_PLL3DIVR_PLL3R_MASK             (0x7f << RCC_PLL3DIVR_PLL3R_SHIFT)
 #  define RCC_PLL3DIVR_PLL3R(n)             ((n-1) << RCC_PLL3DIVR_PLL3R_SHIFT) /* m = 1..128 */
 
+/* PLL3 fractional divider register */
+
+#define RCC_PLL3FRACR_PLL3FRACN_SHIFT       (3)
+#define RCC_PLL3FRACR_PLL3FRACN_MASK        (0x1fff << RCC_PLL3FRACR_PLL3FRACN_SHIFT)
+#define RCC_PLL3FRACR_PLL3FRACN(n)          (n << RCC_PLL3FRACR_PLL3FRACN_SHIFT) /* m = 0..8192 */
+
 /* Clock interrupt enable register */
 
 #define RCC_CIER_LSIRDYIE                (1 << 0)  /* Bit 0: LSI Ready Interrupt Enable */
diff --git a/boards/arm/stm32h5/nucleo-h563zi/include/board.h b/boards/arm/stm32h5/nucleo-h563zi/include/board.h
index ca03ec7966..b27d501ddc 100644
--- a/boards/arm/stm32h5/nucleo-h563zi/include/board.h
+++ b/boards/arm/stm32h5/nucleo-h563zi/include/board.h
@@ -38,8 +38,8 @@
 
 /* The NUCLEO-H563ZI-Q supports both HSE and LSE crystals (X2 and X3).
  * However, as shipped, the X3 crystal is not populated.  Therefore the
- * Nucleo-H563ZI-Q will need to run off the 16MHz HSI clock, or the
- * 32kHz-synced CSI.  This configuration uses the CSI.
+ * Nucleo-H563ZI-Q will need to run off the 32MHz HSI clock, or the
+ * 4 MHz CSI clock.  This configuration uses the HSI.
  *
  *   System Clock source : PLL (CSI)
  *   SYSCLK(Hz)          : 250000000   Determined by PLL1 configuration
@@ -49,17 +49,17 @@
  *   APB2 Prescaler      : 1            (STM32_RCC_CFGR_PPRE2) (Max 250MHz)
  *   CSI Frequency(Hz)   : 4000000      (nominal)
  *   PLL1M               : 2            (STM32_PLL1CFGR_PLLM)
- *   PLL1N               : 125          (STM32_PLL1CFGR_PLLN)
- *   PLL1P               : 0            (STM32_PLL1CFGR_PLLP)
+ *   PLL1N               : 31           (STM32_PLL1CFGR_PLLN)
+ *   PLL1P               : 2            (STM32_PLL1CFGR_PLLP)
  *   PLL1Q               : 0            (STM32_PLL1CFGR_PLLQ)
  *   PLL1R               : 1            (STM32_PLL1CFGR_PLLR)
  *   PLL2M               : 2            (STM32_PLL2CFGR_PLLM)
- *   PLL2N               : 125          (STM32_PLL2CFGR_PLLN)
+ *   PLL2N               : 15           (STM32_PLL2CFGR_PLLN)
  *   PLL2P               : 0            (STM32_PLL2CFGR_PLLP)
  *   PLL2Q               : 0            (STM32_PLL2CFGR_PLLQ)
  *   PLL2R               : 1            (STM32_PLL2CFGR_PLLR)
  *   PLL3M               : 2            (STM32_PLL3CFGR_PLLM)
- *   PLL3N               : 125          (STM32_PLL3CFGR_PLLN)
+ *   PLL3N               : 15           (STM32_PLL3CFGR_PLLN)
  *   PLL3P               : 0            (STM32_PLL3CFGR_PLLP)
  *   PLL3Q               : 0            (STM32_PLL3CFGR_PLLQ)
  *   PLL3R               : 1            (STM32_PLL3CFGR_PLLR)
@@ -86,8 +86,9 @@
 
 /* 'main' PLL1 config; we use this to generate our system clock */
 
-/* Use 32 MHz HSI, set M to 2, N to 15, FRAC to 0x1400 (5120)
- * SYSCLK = (32000000 / 2) * (15 + (5120/8192)) = 250000000
+/* Use 32 MHz HSI, set M to 2, N to 31, FRAC to 0x800 (2048), PLL1P to 2
+ * SYSCLK = ((HSI / PLL1M) * (PLL1N + (PLL1FRACN/8192))) / PLL1P
+ * SYSCLK = ((32000000 / 2) * (31 + (2048/8192))) / 2 = 250000000
  */
 
 #define STM32_PLL1CFGR_PLL1FRACEN        RCC_PLL1CFGR_PLL1FRACEN 
@@ -95,16 +96,17 @@
 #define STM32_PLL1CFGR_PLL1RGE           RCC_PLL1CFGR_PLL1RGE_8_16M 
 
 #define STM32_PLL1CFGR_PLL1M             RCC_PLL1CFGR_PLL1M(2)
-#define STM32_PLL1DIVR_PLL1N             RCC_PLL1DIVR_PLL1N(15)
+#define STM32_PLL1DIVR_PLL1N             RCC_PLL1DIVR_PLL1N(31)
 
-#define STM32_PLL1DIVR_PLL1P             RCC_PLL1DIVR_PLL1P(1)
+#define STM32_PLL1DIVR_PLL1P             RCC_PLL1DIVR_PLL1P(2)
 #define STM32_PLL1CFGR_PLL1P_ENABLED     1
+#define STM32_PLL1P_FREQUENCY            250000000
 #define STM32_PLL1DIVR_PLL1Q             0
 #undef STM32_PLL1CFGR_PLL1Q_ENABLED
 #define STM32_PLL1DIVR_PLL1R             0 
 #undef STM32_PLL1CFGR_PLL1R_ENABLED
 
-#define STM32_PLL1FRACR_PLL1FRACN        5120ul
+#define STM32_PLL1FRACR_PLL1FRACN        RCC_PLL1FRACR_PLL1FRACN(2048)
 
 /* PLL2 config */
 
@@ -122,7 +124,7 @@
 #define STM32_PLL2DIVR_PLL2R             0 
 #undef STM32_PLL2CFGR_PLL2R_ENABLED
 
-#define STM32_PLL2FRACR_PLL2FRACN        5120ul
+#define STM32_PLL2FRACR_PLL2FRACN        RCC_PLL2FRACR_PLL2FRACN(5120)
 
 /* PLL3 config */
 
@@ -140,7 +142,7 @@
 #define STM32_PLL3DIVR_PLL3R             0 
 #undef STM32_PLL3CFGR_PLL3R_ENABLED
 
-#define STM32_PLL3FRACR_PLL3FRACN        5120ul
+#define STM32_PLL3FRACR_PLL3FRACN        RCC_PLL3FRACR_PLL3FRACN(5120)
 
 /* Enable CLK48; get it from HSI48 */