系统各总线时钟测试
1 int main(void) 2 { 3 RCC_OscInitTypeDef RCC_OscInitStruct; 4 5 rt_kprintf("SysClockFreq: %d ", HAL_RCC_GetSysClockFreq()); 6 rt_kprintf("PCLK1Freq: %d ", HAL_RCC_GetPCLK1Freq()); 7 rt_kprintf("PCLK2Freq: %d ", 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 }
重新运行程序,结果如下: