在\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c文件中 第140行这个,是用MX 生成的代码,SystemCoreClock 为什么是160M,而不是168M uint32_t SystemCoreClock = 16000000; __IO const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; |
楼主明显看错了啊,uint32_t SystemCoreClock = 16000000;应该是16M才对吧,其实此处这个值无所谓的,因为这个只是初始值,配置时钟的时候还会更新。
这个变量定义的时候注释说的很明白了:HAL库是使用方法3进行更新这个值的。
1、首先使用HAL会调用 SystemClock_Config();更新系统时钟,在这个函数里面又调用了HAL_RCC_ClockConfig,
2、在函数HAL_RCC_ClockConfig的最后调用了 HAL_InitTick (TICK_INT_PRIORITY);
3、在HAL_InitTick (TICK_INT_PRIORITY);调用了HAL_RCC_GetHCLKFreq,
4、最后HAL_RCC_GetHCLKFreq里面SystemCoreClock被更新为设置的168M或者180M或者其他值。。
你会发现这个过程不单更新了SystemCoreClock的值,还更新了SysTick的时钟源(因为在HAL_Init();里面已经设置过一次了),所以即使修改了主时钟的频率,SysTick的1ms的中断还是准确的。
学习了。
感觉不是168是因为没必要非得100%CPU全速吧
如果使用上面的图中步骤1的设置的时钟会是180M(使用外部8M晶振),如果使用USB的话主频一般配置为168M。当然根据需要和个人爱好可以随便配置。
PLL_VCO = (HSE_VALUE / PLL_M) * PLL_N = (8/8)*360 = 360;
SYSCLK = PLL_VCO / PLL_P = 360/RCC_PLLP_DIV2 = 360/2 = 180M;
不太明白你说的主频配置为168M和CPU100%全速是什么意思,这个应该可以超频到更高吧。
原来如此!!!不错