|
STM32的时钟体系可以直接以图概括(摘自STM32F10X参考手册)) Z U5 v1 `4 o; q. W6 @ % S) _2 c" _0 I. [( {
( H2 i5 g7 F* F 下面就此图做分析 5 g7 l% v+ I, @$ e H: c 1.1 时钟源的作用 无论是小型单片机还是像STM32这样高级单片机,它们工作的核心都是大规模的时序逻辑电路,而驱动时序逻辑电路的关键则是准确而又稳定的时钟源。它的作用就像小学在操场上做广播体操时候播放的背景音乐,用于协调和同步各单元运行,为时序电路提供基本的脉冲信号。 7 [2 l. r) ]- Z; w | 在51单片机中,一般都外接一个11.0592MHz的晶振,注意,提供时钟的不是晶振,而是RC时钟电路,而晶振只是时钟电路的元件之一。同理,在STM32中,时钟源也是由RC时钟电路产生,与51单片机的区别是区别在于,RC电路的位置。根据RC电路的位置,可以将STM32的时钟源分为内部时钟电路和外部时钟、内外部时钟电路。 - S/ w5 C+ y1 c, I, q/ \: d (1)内部时钟电路:9 P2 d! a% E s, H / B1 Y# Z$ S( \7 [ ! D" X) c6 c: n9 j1 j& d (2)内外部时钟电路:
(3)外部时钟电路 ; V& g! ~1 L) ]0 @' O
综上所述,STM32的时钟源有4个: HSI、HSE和LSI、LSE。 0 W$ Z2 L" `: `) b HSI时钟源,它是在由STM32在内部用RC振荡电路实现的高速内部时钟源。HIS RC振荡器能够在不需要任何外部期间的条件下提供系统时钟,它的启动时间比HSE晶体振荡器短,但是不精准,即使在校准之后它的时钟频率精度仍较差。在手册中还明确说,当HSI被用作PLL时钟输入时,系统时钟能得到的最大频率是61MHz,这显然不能发挥STM32最极致的性能。
) U2 J0 I4 o! o/ q b4 O% r 虽然HSI不精准,但是鉴于启动速度原因考虑,STM32上电复位,默认是采用HSI时钟源的,当然开发者可以不修改这个时钟源,那么系统将一直工作在一个时钟源不稳定不精准的环境下。
% }9 V1 g/ ]/ b% P6 n0 L: j) `) H
* q0 U' e5 D- T6 |: d" N $ G: [; d8 ^/ g- y8 E1.4 锁相环倍频器PLL/预分频器Prescaler STM32的cpu的工作常规频率是72MHZ(超过72MHz工作称为超频工作,CPU耗电加剧,且会发烫),但是我们接入的晶振是8MHz,这就需要一个对频率加倍的操作,即倍频。如图中的PLLMUL,PLLMULL实现对接入时钟源的倍频,如x2、x3、x4…倍频后的时钟源为PLLCLK。
, ^6 R/ y: v$ P & p$ y! U" N+ k& I7 a5 e3 f4 W预分频器是实现对频率削减作用的。倍频器将HSE倍频之后提供给cpu,但是除了cpu之外,其他片内外设,如SPI控制模块、IIC控制模块等的工作同样需要时钟源,这些外设的时钟源肯定是低于cpu运行时钟的,例如USB通讯才需要48MHz,所以需要对倍频后的时钟源进行分频。一般芯片的分频做法都是对一个时钟源倍频后供给某些部件,其他低于此倍频后的时钟都是基于此时钟源来分频的。用户可通过多个预分频器配置AHB,高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz。APB1域的最大允许频率是36MHz。SDIO接口的时钟频率固定在HCLK / 2。
4 | p: A8 u) G2 o& u; g 9 A: d. g8 e- V0 s$ M& E5 Z在软件开发中,我们要做的也无非设置门电路以选择时钟源输入、倍频/分频系数和打开/关闭对应外设所在总线的时钟。 ) }, _" ?' p; A9 E5 P. O3 Z 图中的MCO功能模块,可以将PLLCLK / 2、HSI、HSE、SYSCLK输出,供给其他系统作为输入时钟源,对这一功能模块也是又相应的寄存器,图中以MCO标注。 + @ j) O8 o6 `' B5 N: ~5 E
/ t! N* Y6 G3 [' `- u 6 P8 W2 |3 p" i3. 系统滴答Systick Systick就是一个定时器而已,只是它放在了NVIC中,主要的目的是为了给操作系统提供一个硬件上的中断,称之为滴答中断操作系统进行运转的时候,也会有时间节拍。它会根据节拍来工作,把整个时间段分成很多小小的时间片,而每个任务每次只能运行一个时间片的时间长度,超时就退出给别的任务运行,这样可以确保任何一个任务都不会霸占操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统的节拍。只要不把它在SysTick控制及状态寄存器中的使能位清除,就一直执行。 + V* O. d3 a% ] + R9 ?! G! Z% @7 B' C) A
# Q6 q& v, [) ?% K3 B: a RCC(复位与时钟控制器)通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟(后者图中没画出)。另外,还有其他时钟,如USB时钟,ADC时钟、独立看门狗时钟等,它们各自的时钟源通过前面学习,也可以轻易分析出来,这里不再赘述。1 @8 p W: y3 x' n
4. 时钟相关的寄存器 时钟体系涉及到的寄存器有 0 u, L4 ^, g3 [! @( ~6 e' E9 W m
这些寄存器的作用直接看数据可知。 * X. d5 G) p" M( ~7 p: ]3 _( u% h% G9 B0 Y6 l |
微信公众号
手机版