时钟系统是STM32中一个重要的组成部分,他就是CPU的脉搏,就像人的心跳一样。STM32单片机的时钟不像51单片机只有一个系统时钟,STM32有多个时钟源。STM32为什么要有多个时钟源呢?STM32本身比较复杂,外设非常多,但是并不是所有的外设都需要系统时钟这么高的频率,如看门狗以及RTC只需要十几k的时钟电路即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所有对于较为复杂的MCU一般都是采用多时钟源的方法来解决这些问题。
STM32时钟系统图:
在STM32中,有五个时钟源,分别是HSI、HSE、LSI、LSE和PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,HSI、HSE和PLL是高速时钟,LSI和LSE是低速时钟;从来源可分为外部时钟源和内部时钟源,其中HSE和LSE是外部时钟源,HSI、LSI和PLL是内部时钟源。
如图中红色部分所示为五个时钟源,蓝色部分为这5个时钟源给外设以及系统提供时钟示意图。
① HSI(高速内部时钟):RC振荡器,频率为8MHz。
② HSE(高速外部时钟):可接石英/陶瓷谐振器,或外接时钟源,频率范围是4MHz~16MHz。
③ LSE(低速外部时钟):接频率为32.768KHz的石英晶体,LSE主要是RTC的时钟源。
④ LSI(低速内部时钟):RC振荡器,频率为40MHz。独立看门狗的时钟源只能是LSI,同时LSI还可以做RTC的时钟源。
⑤ PLL(锁相环倍频输出):时钟输入源可以选择HSI/2、HSE和HSE/2。倍频可以选择2~16倍,其输出频率最大不能超过72MHz。
A. MCO是STM32的一个时钟输出IO,可以选择PLL/2、HSI、HSE和SYSCLK(系统时钟)四种中的一种时钟信号进行输出。该输出信号可以为外部其他系统提供时钟源。
B. 这里是RTC时钟源(实时时钟源),可以是LSE或HSI或HSE的128分频。
C. USB的时钟来源是PLL时钟源。STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源可以只能从PLL输出端获取,可以选择1.5分频或者1分频。当需要使用USB模式,PLL必须使能,并且时钟频率配置为18MHz或72MHz。
D. 该处为STM32的系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。
E. 该处指其他所有外设。这些外设的时钟都是来自系统时钟SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用。这些模块包括:
(1)AHB总线、内核、内存和DMA使用的HCLK时钟。
(2)通过8分频后送给Cortex的系统定时器时钟,即systick。
(3)直接送给Cortex的空闲运行时钟FCLK。
(4)送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器2、3、4倍频器使用。
(5)送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器1倍频器使用。
APB1与APB2的区别:
APB1上面连接的是低速时钟外设,包括电源接口、备份接口、CAN、USB、I2C2、UART2、UART3等等,APB2上面连接的是高速时钟外设包括UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口等。