开门见山,今天我们来讲一讲STM32的复位电路与时钟源。
接触过51单片机的小伙伴们都知道,复位电路对于单片机来说是必不可少的一部分。复位就是把单片机当前的运行状态恢复到起始状态的操作。对于STM32的F1系列单片机来说,它支持三种复位形式,分别为系统复位、上电复位和备份区域复位。其芯片内部的复位电路结构如下图所示。
下面将这三种复位形式一一进行说明。
电源复位:其产生的条件是,当系统上电、掉电,以及系统从待机模式返回时,发生电源复位。电源复位能够复位除了备份区域寄存器之外的所有寄存器的状态。
系统复位:以下任一事件发生时,均能产生一个系统复位:
1. NRST引脚上的低电平(外部复位)
2. 窗口看门狗计数终止(WWDG复位)
3. 独立看门狗计数终止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗管理复位
系统复位能够复位除时钟控制寄存器CRS中的复位标志和备份区域中的寄存器之外的所有寄存器。
备份区域复位:对于备份区域的复位,一种是在软件复位的时候设定备份区域控制寄存器中的对应位产生的;另一种是当电源和电池都掉电又重新上电时产生的。
那么对于我们常用的复位电路,在这里其实对应的是系统复位中的第一个条件,即 令NRST引脚上的来一个低电平信号(外部复位)引发的系统复位。现将其常用的复位电路图展示如下。
由图可以看出,当按键按下时,NRST引脚和地相接,从而被拉低,产生一个低电平信号,实现复位。当系统上电瞬间,电容充电导致NRST在上电瞬间被拉为低电平信号,这个信号持续1100us的时间。(时间计算公式:t = 1.1RC = 1.1*10000Ω*0.0000001F = 0.0011s = 1100us) 而这个时间对于STM32的NRST所需要的低电平信号时长,足够了。
除了上述的复位形式和复位电路之外,时钟对于单片机来说,也是很关键的存在。时钟之于单片机就像是心跳之于我们人类一样,不可或缺,甚至是一刻都不能缺。因为如果没有时钟电路,单片机是根本无法工作的。
那么对于STM32来说他又有哪些时钟可用,他的芯片内部的时钟电路又是怎样构成的呢?我们本节就来详细的探讨一下。
学过51单片机的同学都知道,单片机要想正常工作,那么晶振电路就必不可少,缺了晶振电路,那么51单片机是无法正常工作的。可有的同学在实际中发现,对于一些高级点的单片机最小系统电路板上,怎么找都找不到晶振,这又是怎么回事呢?这不科学啊!其实真相是,对于这类单片机,他们在可以使用外部晶振作为时钟信号的同时,他们的芯片内部还集成有高精度的R/C振荡电路,因此他们可以选择使用晶振,也可以不用。这就解释了为什么有些单片机在电路板上找不到晶振(例如STM32),却依旧能够正常工作的原因。那是因为他们使用的是内部的时钟,而非外部的晶振时钟。
STM32的时钟产生产生方式分为分为内部时钟产生方式(芯片内部R/C震荡电路)和外部时钟产生方式(外部晶振电路)两种。
内部时钟产生方式又分为高速内部(HSI)RC振荡器和低速内部(LSI)RC振荡器两种,这两个振荡器分别产生两组时钟信号。HSI的频率典型值是8MHz,精度典型值是1%,最差值是2.5%。LSI的输出频率典型值是40KHz,最小值是30KHz,最大值是60KHz。由此可以看出,内部时钟不论是高速还是低速,其精度误差均较大,因此在对于时钟精度要求比较高的场合,一般都不采用内部时钟,而选择外部时钟源。
STM32的外部时钟源可以接高速(HSE)和低速(LSE)两组外部时钟。HSE频率的取值范围在0~25MHz,精度取决于选择的晶体振荡电路。LSE频率的取值范围在0~1000KHz,目的是为了生成准确的串行异步通信的波特率,一般频率的典型值为32.768KHz。外部时钟通常由晶体振荡器产生,典型的晶振电路如下。
对上述电路简要做下说明。上图的外部晶振电路中,我们使用的是无源晶振。一般来说,我们将晶振分为两种类型:无源晶振和有源晶振。无源晶振一般称为晶体(Crystal),有源晶振一般称为振荡器(Oscillator)。
无源晶振因为价格便宜,因此被广泛采用。但是无源晶振自身是无法起振的,因此需要芯片内部的震荡电路一起协助工作。上图中的HSE和LSE都是采用的无源晶振的形式,在晶振的两侧有两个电容,这两个电容我们成为负载电容,也叫起振电容。我们都知道,晶振在上电启动后会震荡产生脉冲波形,但往往伴随着有谐波掺杂在主波形中,影响单片机的工作稳定性,因此加上这两个电容是为了将这些谐波滤掉。该起振电容的大小一般选择10~40pF,当然根据不同的单片机使用手册可以具体查阅,如果手册上没有说明,一般选择20pF、30pF即可,这是个经验值。
讲到这里,有的小伙伴们要发问了,你刚才说了STM32有这么多种时钟可以选择,那我到底该怎样选择呢?我在做STM32最小系统板的时候该不该焊接晶振电路呢?如果需要焊接的话,焊接几个呢?带着这些问题,接下来我们就来了解一下这些时钟究竟在STM32中该如何选择,以及该如何使用。
首先,对于系统时钟的选择来说,我们可以选择上文中所提到的内部高速时钟HSI、内部低速时钟LSI、外部高速时钟HSE、外部低速时钟LSI这四种当中的任意一种。在STM32当中我们可以通过对其芯片内部的时钟管理寄存器进行配置。
时钟管理寄存器包括:时钟控制寄存器(RCC_CR)、时钟配置寄存器(RCC_CFGR)、和时钟中断寄存器(RCC_CIR)。STM32通过操作这些寄存器来使能外部和内部时钟,配置各项时钟参数,使单片机工作的时候能够以所配置的频率稳定工作。例如,我们都知道STM32F10x系列的主频是72MHz,而我们从上面的时钟电路图中看出,外部高速晶振的频率仅为8MHz,那么要想得到72MHz的频率,我们就必须通过倍频获得。就要通过STM32内部的一块名为“时钟树”的电路结构中对PLL电路的控制,来将外部输入时钟HSE进行9倍频,得到72MHz的时钟信号。
那么究竟什么是时钟树,这些寄存器又是怎样对STM32的时钟树进行控制的呢?我们在写程序的时候,又该如何操作呢?