这是stm32的时钟系统,时钟与单片机的关系就好比心脏与人的关系一样,它为单片机的运行提供时间基准。STM32F1系列单片机的时钟树请看图1。
图1 STM32F1系列单片机的时钟树
我们将这个复杂的系统分成三个部分,第一个部分是时钟的输入,也就是时钟源。第二个部分是时钟的输出,也就是各种外设等应用模块。第三个部分就是连接输入与输出的枢纽,也就是锁相回路、分频器和倍频器等。请看图2.
图2 时钟系统的三个部分
STM32F1系列单片机有四个时钟源:
1.低速的内部时钟(LSI),它是一个RC振荡器,可以产生40KHz左右的时钟频率,供给独立看门狗或实时时钟使用。
(a) 低速的内部时钟(LSI)
2.低速的外部时钟(LSE),它只用于给实时时钟提供时间基准。
(b) 低速的外部时钟(LSE)
3.高速的外部时钟(HSE),也就是外接晶振,晶振的频率范围是4-16MHz,这个时钟有3种用途,可以直接或2分频后传输给锁相回路,也可以直接作为系统时钟,或128分频后,供给实时时钟使用。
(c) 高速的外部时钟(HSE)
4.高速的内部时钟(HSI),由一个RC振荡器产生一个8MHz的时间基准,这个时钟有两个去向,直接供给系统时钟或者二分频之后输入锁相回路。
(d) 高速的内部时钟(HSI)
系统时钟可直接供给I2S2、I2S3接口使用,或经过AHB预分频分频后再分发给各种外设和接口使用。如图3所示。
图3 系统时钟经分频器分频
有人说,如果采用16MHz的高速外部时钟再经过16倍频后系统时钟就可以达到256MHz了,那么单片机的运行速度就可以大大提高了,但我们一般不这么做,因为超频后时钟不稳定且功耗增加。我们一般只取72MHz,也就是外接8M晶振再经9倍频后得到。
那么为什么不使用同一个时钟来为所有外设提供时间基准呢,这是因为不同的外设对时钟频率有不同的要求,如果全使用高速时钟,势必会造成时钟资源浪费且增加功耗。
最后我们需要知道,任意一个时钟源都可以被独立的启动或关闭,同时任意一个外设的时钟也可以单独的被使能或关闭,这样,就可以从软件上将系统功耗优化到最佳。