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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM