众所周知,时钟系统是CPU的脉搏,就像人的心跳一样。所以时钟系统的重要性就不言而喻了。STM32F4的时钟系统比较复杂,不像简单的51单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么STM32要有多个时钟源呢?因为首先STM32本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及RTC只需要几十k的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的MCU一般都是采取多时钟源的方法来解决这些问题。
三种不同的时钟源可被用来驱动系统时钟(SYSCLK)
HSI振荡器时钟
HSE振荡器时钟
PLL时钟
这些设备有以下两种二级时钟源:
32kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。RTC用于从停机/待机模式下自动唤醒系统。
32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。
由时钟控制器的时钟树可以看出,STM32F4在应用中可以选择外部晶体或者内部RC振荡器来驱动内核和外设,像以太网,USB,I2S和SDIO需要专用时钟。AHB总线最高支持168MHz的时钟,通过AHB总线分频,APB2最高支持84MHz,APB1最高支持42MHz。
所有的外设驱动全部来自SYSCLK除了下面几个:
USBOTGFS的时钟(48MHz)、随机信号发生器时钟(《=48MHz)和SDIO时钟(《=48MHz)全部来自PLL48CLK。
I2S时钟,为了达到高性能的要求,I2S时钟可以用内部时钟PLLI2S或者使用外部时钟,通过I2S_CLKIN引脚输入得到。
USBOTGHS(60MHz)需要外部PHY芯片提供。
以太网时钟(TX,RX和RMII)也需要外部PHY芯片提供时钟。
RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTIck控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTIck时钟。定时器时钟频率分配由硬件按以下2种情况自动设置:
如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。