在使用stm32开发的过程中,有时需要手动修改系统时钟参数,使板子上的晶振和目标系统时钟匹配。在此记录一下对时钟配置代码的理解。
一. STM32F4xx更换外部晶振(或修改系统时钟)
1.需要修改的文件:
system_stm32f4xx.c、stm32f4xx.h
2.计算系统时钟的方法(F40x系统时钟通常是168M):
PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N;
SYSCLK = PLL_VCO / PLL_P;
3.例子:外部晶振由8M改成25M,F4需要的操作:
1) stm32f4xx.h中,HSE_VALUE 由8改成25;
2)system_stm32f4xx.c中,的PLL_M由8改成25;
4.修改系统时钟:
system_stm32f4xx.c中,修改系统时钟的值:
uint32_t SystemCoreClock = 48000000;
二. STM32F0xx更换外部晶振(或修改系统时钟)
1. 手动匹配外部晶振的频率:
stm32f0xx.h中,HSE_VALUE 由8000000改成12000000;
2. 修改SetSysClock() 函数:
在system_stm32f4xx.c,SetSysClock函数中修改倍频(RCC_CFGR_PLLMULL6 = 6倍频,改成RCC_CFGR_PLLMULL4):
/* PLL configuration = HSE * 6 = 48 MHz */
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
3.修改系统时钟:
system_stm32f4xx.c中,修改系统时钟的值:
uint32_t SystemCoreClock = 48000000;
注意:
如果要设置分频参数,可能要自己添加代码(库函数可能会用默认不分频),这时设置CFGR2寄存器时,要注意一个寄存器位:
也就是CFGR寄存器的bit17和PREDIV[0]是同一个位,如果清零CFGR寄存器的bit17,PREDIV[0]也同时被清零;因此如果需要修改分频参数,建议放在设置PLL倍频参数之后。