1010 * Change Logs:
1111 * Date Author Notes
1212 * 2009-09-22 Bernard add board.h to this bsp
13+ * 2017-12-29 ZYH Correctly generate the 48M clock
1314 */
1415
1516#include <rtthread.h>
2021 */
2122
2223/*@{*/
23-
24+ #ifdef RT_USING_HSI
25+ #error Can not using HSI on this bsp
26+ #endif
27+ #if defined(RCC_PERIPHCLK_SDIO ) || defined(RCC_PERIPHCLK_CEC ) || defined(RCC_PERIPHCLK_LTDC )\
28+ || defined(RCC_PERIPHCLK_SPDIFRX ) || defined(RCC_PERIPHCLK_FMPI2C1 ) || defined(RCC_PERIPHCLK_LPTIM1 )
29+ #warning Please give priority to the correctness of the clock tree when the peripherals are abnormal
30+ #endif
2431static void SystemClock_Config (void )
2532{
33+ rt_uint32_t hse_clk ,sys_clk ;
34+ #if (RT_HSE_VALVE % 1000000 != 0 )
35+ #error HSE must be integer of MHz
36+ #endif
37+ hse_clk = HSE_VALUE /1000000UL ;
38+ sys_clk = HCLK_VALUE /1000000UL ;
2639 RCC_OscInitTypeDef RCC_OscInitStruct ;
2740 RCC_ClkInitTypeDef RCC_ClkInitStruct ;
28- #ifdef RT_USING_RTC
41+ #if defined( RT_USING_RTC ) || defined( RCC_PERIPHCLK_CLK48 )
2942 RCC_PeriphCLKInitTypeDef PeriphClkInitStruct ;
3043#endif
3144 /**Configure the main internal regulator output voltage
@@ -44,10 +57,55 @@ static void SystemClock_Config(void)
4457 RCC_OscInitStruct .HSEState = RCC_HSE_ON ;
4558 RCC_OscInitStruct .PLL .PLLState = RCC_PLL_ON ;
4659 RCC_OscInitStruct .PLL .PLLSource = RCC_PLLSOURCE_HSE ;
47- RCC_OscInitStruct .PLL .PLLM = (HSE_VALUE /1000000UL );//Get 1M clock
48- RCC_OscInitStruct .PLL .PLLN = (HCLK_VALUE /1000000UL )* 2 ;//Get 2*HCLK_VALUE
49- RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;//Get HCLK_VALUE
50- RCC_OscInitStruct .PLL .PLLQ = RCC_OscInitStruct .PLL .PLLN /48 ;//Get 48M Clock
60+ if (hse_clk % 2 == 0 )
61+ {
62+ RCC_OscInitStruct .PLL .PLLM = hse_clk /2 ;//Get 2M clock
63+ if ((sys_clk * 2 ) % 48 == 0 )
64+ {
65+ RCC_OscInitStruct .PLL .PLLN = sys_clk ;//Get 2*HCLK_VALUE
66+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;//Get HCLK_VALUE
67+ }
68+ else if ((sys_clk * 4 ) % 48 == 0 )
69+ {
70+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 2 ;//Get 4*HCLK_VALUE
71+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV4 ;//Get HCLK_VALUE
72+ }
73+ else if ((sys_clk * 6 ) % 48 == 0 )
74+ {
75+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 3 ;//Get 6*HCLK_VALUE
76+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV6 ;//Get HCLK_VALUE
77+ }
78+ else if ((sys_clk * 8 ) % 48 == 0 )
79+ {
80+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 4 ;//Get 8*HCLK_VALUE
81+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV8 ;//Get HCLK_VALUE
82+ }
83+ }
84+ else
85+ {
86+ RCC_OscInitStruct .PLL .PLLM = hse_clk ;//Get 1M clock
87+ if ((sys_clk * 2 ) % 48 == 0 )
88+ {
89+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 2 ;//Get 2*HCLK_VALUE
90+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV2 ;//Get HCLK_VALUE
91+ }
92+ else if ((sys_clk * 4 ) % 48 == 0 )
93+ {
94+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 4 ;//Get 4*HCLK_VALUE
95+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV4 ;//Get HCLK_VALUE
96+ }
97+ else if ((sys_clk * 6 ) % 48 == 0 )
98+ {
99+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 6 ;//Get 6*HCLK_VALUE
100+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV6 ;//Get HCLK_VALUE
101+ }
102+ else if ((sys_clk * 8 ) % 48 == 0 )
103+ {
104+ RCC_OscInitStruct .PLL .PLLN = sys_clk * 8 ;//Get 8*HCLK_VALUE
105+ RCC_OscInitStruct .PLL .PLLP = RCC_PLLP_DIV8 ;//Get HCLK_VALUE
106+ }
107+ }
108+ RCC_OscInitStruct .PLL .PLLQ = hse_clk / RCC_OscInitStruct .PLL .PLLM * RCC_OscInitStruct .PLL .PLLN /48 ;//Get 48M Clock
51109 if (HAL_RCC_OscConfig (& RCC_OscInitStruct ) != HAL_OK )
52110 {
53111 while (1 )
@@ -94,9 +152,16 @@ static void SystemClock_Config(void)
94152 {}
95153 }
96154#endif
97- #ifdef RT_USING_RTC
98- PeriphClkInitStruct .PeriphClockSelection = RCC_PERIPHCLK_RTC ;
155+ #if defined(RT_USING_RTC ) || defined(RCC_PERIPHCLK_CLK48 )
156+ PeriphClkInitStruct .PeriphClockSelection = 0 ;
157+ #ifdef RT_USING_RTC
158+ PeriphClkInitStruct .PeriphClockSelection |= RCC_PERIPHCLK_RTC ;
99159 PeriphClkInitStruct .RTCClockSelection = RCC_RTCCLKSOURCE_LSI ;
160+ #endif
161+ #ifdef RCC_PERIPHCLK_CLK48
162+ PeriphClkInitStruct .PeriphClockSelection |= RCC_PERIPHCLK_CLK48 ;
163+ PeriphClkInitStruct .Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLQ ;
164+ #endif
100165 if (HAL_RCCEx_PeriphCLKConfig (& PeriphClkInitStruct ) != HAL_OK )
101166 {
102167 while (1 )
0 commit comments