Skip to content

Commit 0779b00

Browse files
committed
[BSP][STM32F4xx-HAL]Update clock tree
修正84M主频下48M时钟的产生错误 修正没有对部分芯片需要单独配置48M时源(RCC_PERIPHCLK_CLK48) 增加芯片存在非通用时钟树配置时产生编译警告 严正警告。F4工作在100M主频下(F411等)无法正确产生48M时钟,此时请另行配置时钟或降频至84M使用。自动配置的时钟将导致芯片无法启动。(只要是不能产生48M时钟的HCLK配置均不能使用该BSP内的自动时钟配置,芯片最大主频中只有100M无法使用)
1 parent 813919b commit 0779b00

File tree

1 file changed

+73
-8
lines changed

1 file changed

+73
-8
lines changed

bsp/stm32f4xx-HAL/drivers/board.c

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
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>
@@ -20,12 +21,24 @@
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
2431
static 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

Comments
 (0)