rt-thread 3.1.0+stm32f4xx_hal中的系统时钟问题

系统各总线时钟测试

 1 int main(void)
 2 {
 3     RCC_OscInitTypeDef RCC_OscInitStruct;
 4 
 5     rt_kprintf("SysClockFreq: %d\n", HAL_RCC_GetSysClockFreq());
 6     rt_kprintf("PCLK1Freq: %d\n", HAL_RCC_GetPCLK1Freq());
 7     rt_kprintf("PCLK2Freq: %d\n", HAL_RCC_GetPCLK2Freq());
 8     HAL_RCC_GetOscConfig(&RCC_OscInitStruct);
 9 
10     return 0;
11 }

得到系统时钟为(env中配置的晶振为25MHz,系统时钟为168MHz)

从HAL_RCC_GetOscConfig(&RCC_OscInitStruct)中获取的配置如下

发现问题在于PLLN=160(取值范围应为[192,432])

解决方法:

在board.c文件中的static void SystemClock_Config(void)中,添加如下代码

 1 if (source_clk % 2 == 0)
 2     {
 3         RCC_OscInitStruct.PLL.PLLM = source_clk / 2; //Get 2M clock
 4         if ((sys_clk * 4) % 48 == 0)
 5         {
 6             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 4*HCLK_VALUE
 7             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;//Get HCLK_VALUE
 8         }
 9         else if ((sys_clk * 6) % 48 == 0)
10         {
11             RCC_OscInitStruct.PLL.PLLN = sys_clk * 3;//Get 6*HCLK_VALUE
12             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6;//Get HCLK_VALUE
13         }
14         else if ((sys_clk * 8) % 48 == 0)
15         {
16             RCC_OscInitStruct.PLL.PLLN = sys_clk * 4;//Get 8*HCLK_VALUE
17             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8;//Get HCLK_VALUE
18         }
19         else
20         {
21             //can not get 48M Clock USB is unuseable
22             RCC_OscInitStruct.PLL.PLLN = sys_clk;//Get 2*HCLK_VALUE
23             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
24         }
25     }
26     else
27     {
28         RCC_OscInitStruct.PLL.PLLM = source_clk;//Get 1M clock
29         if ((sys_clk * 2) % 48 == 0)  //添加内容
30         {
31             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 2*HCLK_VALUE
32             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
33         }
34         else if ((sys_clk * 4) % 48 == 0)
35         {
36             RCC_OscInitStruct.PLL.PLLN = sys_clk * 4;//Get 4*HCLK_VALUE
37             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;//Get HCLK_VALUE
38         }
39         else if ((sys_clk * 6) % 48 == 0)
40         {
41             RCC_OscInitStruct.PLL.PLLN = sys_clk * 6;//Get 6*HCLK_VALUE
42             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6;//Get HCLK_VALUE
43         }
44         else if ((sys_clk * 8) % 48 == 0)
45         {
46             RCC_OscInitStruct.PLL.PLLN = sys_clk * 8;//Get 8*HCLK_VALUE
47             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8;//Get HCLK_VALUE
48         }
49         else
50         {
51             //can not get 48M Clock USB is unuseable
52             RCC_OscInitStruct.PLL.PLLN = sys_clk * 2;//Get 2*HCLK_VALUE
53             RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;//Get HCLK_VALUE
54         }
55     }
重新运行程序,结果如下:

 

STM32F4_RCC系统时钟配置及描述可参见http://www.cnblogs.com/strongerHuang/p/5609969.html

posted @ 2018-11-06 16:01  兵哥奇遇记  阅读(1346)  评论(0编辑  收藏  举报