系統各總線時鍾測試
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 }
重新運行程序,結果如下: