board.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. * Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2024-02-20 CDT first version
  10. * 2024-06-07 CDT Add XTAL divider config code for RTC
  11. */
  12. #include "board.h"
  13. #include "board_config.h"
  14. /* unlock/lock peripheral */
  15. #define EXAMPLE_PERIPH_WE (LL_PERIPH_GPIO | LL_PERIPH_EFM | LL_PERIPH_FCG | \
  16. LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM | LL_PERIPH_LVD)
  17. #define EXAMPLE_PERIPH_WP (LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM)
  18. /** System Base Configuration
  19. */
  20. void SystemBase_Config(void)
  21. {
  22. #if defined(BSP_USING_ON_CHIP_FLASH_ICODE_CACHE)
  23. EFM_ICacheCmd(ENABLE);
  24. #endif
  25. #if defined(BSP_USING_ON_CHIP_FLASH_DCODE_CACHE)
  26. EFM_DCacheCmd(ENABLE);
  27. #endif
  28. #if defined(BSP_USING_ON_CHIP_FLASH_ICODE_PREFETCH)
  29. EFM_PrefetchCmd(ENABLE);
  30. #endif
  31. }
  32. /** System Clock Configuration
  33. */
  34. void SystemClock_Config(void)
  35. {
  36. stc_clock_xtal_init_t stcXtalInit;
  37. stc_clock_pll_init_t stcPLLHInit;
  38. #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
  39. stc_clock_xtal32_init_t stcXtal32Init;
  40. #endif
  41. #if defined(BSP_RTC_USING_XTAL_DIV)
  42. stc_clock_xtaldiv_init_t stcXtaldivInit;
  43. #endif
  44. /* PCLK0, HCLK Max 200MHz */
  45. /* PCLK1, PCLK4 Max 100MHz */
  46. /* PCLK2, EXCLK Max 60MHz */
  47. /* PCLK3 Max 50MHz */
  48. CLK_SetClockDiv(CLK_BUS_CLK_ALL,
  49. (CLK_PCLK0_DIV1 | CLK_PCLK1_DIV2 | CLK_PCLK2_DIV4 |
  50. CLK_PCLK3_DIV4 | CLK_PCLK4_DIV2 | CLK_EXCLK_DIV4 |
  51. CLK_HCLK_DIV1));
  52. GPIO_AnalogCmd(XTAL_PORT, XTAL_IN_PIN | XTAL_OUT_PIN, ENABLE);
  53. (void)CLK_XtalStructInit(&stcXtalInit);
  54. /* Config Xtal and enable Xtal */
  55. stcXtalInit.u8Mode = CLK_XTAL_MD_OSC;
  56. stcXtalInit.u8Drv = CLK_XTAL_DRV_ULOW;
  57. stcXtalInit.u8State = CLK_XTAL_ON;
  58. stcXtalInit.u8StableTime = CLK_XTAL_STB_2MS;
  59. (void)CLK_XtalInit(&stcXtalInit);
  60. (void)CLK_PLLStructInit(&stcPLLHInit);
  61. /* VCO = (8/1)*100 = 800MHz*/
  62. stcPLLHInit.u8PLLState = CLK_PLL_ON;
  63. stcPLLHInit.PLLCFGR = 0UL;
  64. stcPLLHInit.PLLCFGR_f.PLLM = 1UL - 1UL;
  65. stcPLLHInit.PLLCFGR_f.PLLN = 100UL - 1UL;
  66. stcPLLHInit.PLLCFGR_f.PLLP = 4UL - 1UL;
  67. stcPLLHInit.PLLCFGR_f.PLLQ = 4UL - 1UL;
  68. stcPLLHInit.PLLCFGR_f.PLLR = 4UL - 1UL;
  69. stcPLLHInit.PLLCFGR_f.PLLSRC = CLK_PLL_SRC_XTAL;
  70. (void)CLK_PLLInit(&stcPLLHInit);
  71. /* 3 cycles for 150 ~ 200MHz */
  72. (void)EFM_SetWaitCycle(EFM_WAIT_CYCLE3);
  73. /* 3 cycles for 150 ~ 200MHz */
  74. GPIO_SetReadWaitCycle(GPIO_RD_WAIT3);
  75. CLK_SetSysClockSrc(CLK_SYSCLK_SRC_PLL);
  76. #if defined(BSP_RTC_USING_XTAL32) || defined(RT_USING_PM)
  77. /* Xtal32 config */
  78. GPIO_AnalogCmd(XTAL32_PORT, XTAL32_IN_PIN | XTAL32_OUT_PIN, ENABLE);
  79. (void)CLK_Xtal32StructInit(&stcXtal32Init);
  80. stcXtal32Init.u8State = CLK_XTAL32_ON;
  81. stcXtal32Init.u8Drv = CLK_XTAL32_DRV_HIGH;
  82. stcXtal32Init.u8Filter = CLK_XTAL32_FILTER_RUN_MD;
  83. (void)CLK_Xtal32Init(&stcXtal32Init);
  84. #endif
  85. #if defined(BSP_RTC_USING_XTAL_DIV)
  86. /* Xtal Div config */
  87. (void)CLK_XtalDivStructInit(&stcXtaldivInit);
  88. /* 8000000Hz / 32768Hz = 0x7A12 / 0x80 */
  89. stcXtaldivInit.u32Num = 0x7A12UL;
  90. stcXtaldivInit.u32Den = 0x80UL;
  91. stcXtaldivInit.u32State = CLK_XTALDIV_ON;
  92. (void)CLK_XtalDivInit(&stcXtaldivInit);
  93. #endif
  94. }
  95. /** Peripheral Clock Configuration
  96. */
  97. void PeripheralClock_Config(void)
  98. {
  99. #if defined(BSP_USING_MCAN1)
  100. CLK_SetCANClockSrc(CLK_MCAN1, CLK_MCANCLK_SYSCLK_DIV5);
  101. #endif
  102. #if defined(BSP_USING_MCAN2)
  103. CLK_SetCANClockSrc(CLK_MCAN2, CLK_MCANCLK_SYSCLK_DIV5);
  104. #endif
  105. #if defined(RT_USING_ADC)
  106. CLK_SetPeriClockSrc(CLK_PERIPHCLK_PCLK);
  107. #endif
  108. }
  109. /** Peripheral Registers Unlock
  110. */
  111. void PeripheralRegister_Unlock(void)
  112. {
  113. LL_PERIPH_WE(EXAMPLE_PERIPH_WE);
  114. }