认识STM32的系统时钟
STM32共有五个时钟源,分别是:
- HSI是高速内部时钟、RC振荡器,频率为8MHz;
- HSE是高速外部时钟,频率范围为4~6MHz; (可接石英/陶瓷谐振器或者接外部时钟源)
- LSI是低速内部时钟,频率40kHz; (独立看门狗时钟源、可作RTC时钟源)
- LSE是低速外部时钟,频率为32.768kHz石英晶体; (主要RTC时钟源)
- PLL是锁相环倍频输出,频率可选择为HSI/2、HSE或者HSE/2、倍频可选择2~16倍,但其输出频率最大不超过72MHz;
此处重点介绍系统时钟,一般其他所有的外设时钟的来源都是SYSCLK,SYSCLK通过AHB分频器分频之后送给各个模块使用。这些模块中包括APB1和APB2分频器。
- 送给APB1分频器,输出一路供APB1外设使用(最大频率为36MHz),另一路送给定时器(Timer)2、3、4倍频器使用;
- 送给APB2分频器,输出一路供APB2外设使用(最大频率为72MHz),另一路送个定时器(Timer)1倍频使用;
具体如下表:
名称 | 类型 | 外设内容 | ||
APB1 | 低速外设 |
电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等 |
||
APB2 | 高速外设 | UART1、SPI1、Timer1、ADC1、ADC2、普通IO口(PA~PE)、第二功能IO口等 |
以上的时钟输出中很多都是带使能控制的,例如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG, ENABLE);
是对PD和PG口进行时钟使能。
STM32时钟系统配置初始化有函数Sys-temInit()之外,其它的配置在stm32f10x-rcc.h文件之中。
对于系统时钟默认的情况下在SystemInit函数的SetSysClock()函数中判断的,具体如下:
static void SetSysClock(void)
{
#ifdef SYSCLK_FREQ_HSE
SetSysClockToHSE();
#elif defined SYSCLK_FREQ_24MHz
SetSysClockTo24();
#elif defined SYSCLK_FREQ_36MHz
SetSysClockTo36();
#elif defined SYSCLK_FREQ_48MHz
SetSysClockTo48();
#elif defined SYSCLK_FREQ_56MHz
SetSysClockTo56();
#elif defined SYSCLK_FREQ_72MHz
SetSysClockTo72();
#endif
}
这段代码是判定系统宏定义的时钟是多少,然后设置相应的值,系统默认为72MHz:
#define SYSCLK_FREQ_72MHz 72000000
如果需要设置其他频率的时钟,只需要在stm32f10x-rcc.c文件的第115行注释掉上面代码,加入将需要的频率代码即可。
在SystemInit()函数中设置的系统时钟的大小如下:
-
-
-
-
-
-
-
-
- SYSCLK(系统时钟)=72MHz;
- AHB总线时钟(使用系统时钟)=72MHz;
- APB1总线时钟(PCLK1)=36MHz;
- APB2总线时钟(PCLK2)=72MHz;
-
-
-
-
-
-
-