时钟与复位系统

1. 时钟

1.1 时钟树

在STM32中有3种不同的时钟源用来驱动系统时钟(SYSCLK):

  • HSI振荡器时钟(High Speed Internal oscillator,高速内部时钟)

  • HSE振荡器时钟(High Speed External(Oscillator / Clock),高速外部时钟)

  • PLL时钟(Phase Locked Loop 锁相环/倍频器)

还有2种2级时钟:

  • LSI时钟(Low Speed Internal,低速内部时钟)

  • LSE时钟(Low Speed External oscillator,低速外部时钟)。

image-20250403133318922

image-20250403135757396

1.2 HSE时钟

高速外部时钟信号(HSE)可以由两种可能的时钟源生成:

  • HSE外部晶体/陶瓷谐振器
  • HSE用户外部时钟

谐振器和负载电容必须尽可能靠近振荡器引脚放置,以最小化输出失真和启动稳定时间。负载电容值必须根据所选振荡器进行调整。

目前几乎所有的STM32单片机的设计都是在外部接一个8MHz的晶振,经过PLL倍频(9倍频)后得到一个72MHz的系统时钟。系统默认就是这个时钟。通过启动文件可以看到。

image-20250403133940552

  1. 外部源(HSE旁路)

    在这种模式下,必须提供一个外部时钟源。其频率可高达50 MHz。通过在时钟控制寄存器(RCC_CR)中设置HSEBYP和HSEON位来选择此模式。外部时钟信号(方波、正弦波或三角波)具有约50%的占空比,必须驱动OSC_IN引脚,而OSC_OUT引脚应保持高阻态。

  2. 外部晶体/陶瓷谐振器(HSE晶体)

    3至25 MHz的外部振荡器具有在主时钟上产生非常精确频率的优势。
    时钟控制寄存器(RCC_CR)中的HSERDY标志指示高速外部振荡器是否稳定。在启动时,直到硬件设置此位之前,时钟不会释放。如果在时钟中断寄存器(RCC_CIR)中启用,可以生成中断。
    使用时钟控制寄存器(RCC_CR)中的HSEON位可以打开和关闭HSE晶体。

1.3 HSI时钟

HSI时钟信号是由内部的8 MHz RC振荡器产生的,可以直接用作系统时钟,或者除以2(2分频)后用作PLL输入。

HSI RC振荡器的优势在于它能以低成本(无需外部组件)提供时钟源。它的启动时间也比HSE晶体振荡器快,然而,即使经过校准,其频率的准确性仍然不如外部晶体振荡器或陶瓷谐振器。

校准:

由于制造过程中的变化,RC振荡器的频率在不同的芯片之间可能会有所不同,这就是为什么ST为每个设备在TA=25°C时进行工厂校准以确保1%的精度。

复位后,工厂校准值会被加载到时钟控制寄存器(RCC_CR)的HSICAL[7:0]位中。

如果应用程序受到电压或温度变化的影响,这可能会影响RC振荡器的速度。可以在应用程序中使用时钟控制寄存器(RCC_CR)中的HSITRIM[4:0]位来微调HSI频率。

时钟控制寄存器(RCC_CR)中的HSIRDY标志指示HSI RC是否稳定。在启动时,直到硬件设置此位之前,HSI RC输出时钟不会被释放。

可以使用时钟控制寄存器(RCC_CR)中的HSION位来开启和关闭HSI RC。

如果HSE晶体振荡器失败,HSI信号也可以用作备份源(辅助时钟)。

1.4 PLL时钟

主PLL提供一个频率倍增器,起始于以下时钟源之一:

  • HSI时钟除以2
  • HSE或PLL2时钟通过一个可配置的分频器

PLL2和PLL3通过一个特定的可配置分频器由HSE时钟驱动。请参见图11和时钟配置寄存器2(RCC_CFGR2)。

每个PLL的配置(时钟源选择、预分频因子和乘法因子)必须在启用PLL之前完成。每个PLL应在输入时钟稳定后(就绪标志)启用。一旦PLL启用,这些参数就不能更改。

当更改主PLL的输入时钟源时,只有在选择新的时钟源之后(通过时钟配置寄存器(RCC_CFGR)中的PLLSRC位完成)才能关闭原始时钟源。

如果在时钟中断寄存器(RCC_CIR)中启用,当PLL准备就绪时可以生成一个中断。

1.5 LSE时钟

LSE晶体是一个32.768 kHz的低速外部晶体或陶瓷谐振器。它的优势在于为实时时钟外设(RTC)提供一个低功耗但高精度的时钟源,用于时钟/日历或其他定时功能。

通过备份域控制寄存器(RCC_BDCR)中的LSEON位来开启和关闭LSE晶体。

备份域控制寄存器(RCC_BDCR)中的LSERDY标志指示LSE晶体是否稳定。在启动时,LSE晶体的输出时钟信号不会被释放,直到硬件设置此位。如果在时钟中断寄存器(RCC_CIR)中启用,可以生成一个中断。

外部源(LSE旁路):

在这种模式下,必须提供一个外部时钟源。其频率可高达1 MHz。通过在备份域控制寄存器(RCC_BDCR)中设置LSEBYP和LSEON位来选择此模式。外部时钟信号(方波、正弦波或三角波)具有约50%的占空比,必须驱动OSC32_IN引脚,而OSC32_OUT引脚应保持高阻态。参见图12。

LSE是不能驱动系统时钟的。

1.6 LSI时钟

LSI RC作为低功耗时钟源,可以在停止和待机模式下为独立看门狗(IWDG)和自动唤醒单元(AWU)保持运行。时钟频率大约为40 kHz(在30 kHz到60 kHz之间)。

通过控制/状态寄存器(RCC_CSR)中的LSION位,可以开启和关闭LSI RC。

控制/状态寄存器(RCC_CSR)中的LSIRDY标志指示低速内部振荡器是否稳定。在启动时,直到硬件设置此位之前,时钟不会被释放。如果在时钟中断寄存器(RCC_CIR)中启用,可以生成中断。

LSI校准:

低速内部RC(LSI)振荡器的频率偏差可以校准,以获得准确的实时时钟(RTC)时间基准和/或IWDG超时(当使用LSI作为这些外设的时钟源时),并具有可接受的准确性。

这种校准是通过测量LSI时钟频率相对于TIM5输入时钟(TIM5CLK)来进行的。根据HSE振荡器的精度进行此测量后,软件可以调整RTC的可编程20位预分频器以获得准确的时间基准,或者可以计算准确的IWDG超时。

使用以下步骤校准LSI:

  1. 启用TIM5定时器,并将通道4配置为输入捕获模式。
  2. 在AFIO_MAPR寄存器中设置TIM5CH4_IREMAP位,以将LSI时钟内部连接到TIM5通道4输入捕获,用于校准目的。
  3. 使用TIM5捕获/比较4事件或中断测量LSI时钟的频率。
  4. 根据所需的时间基准和/或计算IWDG超时,使用测量的LSI频率更新RTC的20位预分频器。

LSI是不能驱动系统时钟的。

1.7 系统时钟(SYSCLK)选择

在系统复位后,HSI振荡器被选为系统时钟。

当直接使用一个时钟源或通过PLL作为系统时钟时,无法停止它。

只有在目标时钟源准备就绪(启动延迟后时钟稳定或PLL锁定)的情况下,才会发生从一个时钟源切换到另一个时钟源。如果选择了尚未准备就绪的时钟源,那么切换将在时钟源准备就绪时发生。时钟控制寄存器(RCC_CR)中的状态位指示哪些时钟(s)已就绪,以及当前使用哪个时钟作为系统时钟。

1.8 时钟安全系统(CSS)

时钟安全系统可以通过软件激活。在这种情况下,时钟检测器在HSE振荡器启动延迟后启用,并在该振荡器停止时禁用。

如果检测到HSE时钟发生故障,HSE振荡器将自动禁用,时钟故障事件将发送到TIM1高级控制定时器的中断输入,并生成一个中断以通知软件故障(时钟安全系统中断CSSI),允许MCU执行救援操作。CSSI与Cortex®-M3 NMI(不可屏蔽中断)异常向量相关联。

一旦启用CSS并且如果HSE时钟失败,CSS中断将发生,并自动生成NMI。除非清除CSS中断待处理位,否则NMI将无限期执行。因此,在NMI的中断服务例程中,用户必须通过在时钟中断寄存器(RCC_CIR)中设置CSSC位来清除CSS中断。

如果HSE振荡器直接或间接用作系统时钟(间接意味着:它直接用作PLL输入时钟或通过PLL2,并且PLL时钟用作系统时钟),检测到的故障会导致系统时钟切换到HSI振荡器,并禁用外部HSE振荡器。如果在故障发生时,HSE振荡器时钟(已分频或未分频)是用作系统时钟的PLL(直接或通过PLL2)的时钟输入,则PLL也会被禁用。

1.9 RTC时钟

RTCCLK时钟源可以是HSE/128、LSE或LSI时钟中的任意一个。这是通过编程备份域控制寄存器(RCC_BDCR)中的RTCSEL[1:0]位来选择的。

在不重置备份域的情况下,这个选择是不能被修改的。

LSE时钟位于备份域中,而HSE和LSI时钟则不在。因此:

  • 如果选择了LSE作为RTC时钟:
    • 即使VDD供电被关闭,只要VBAT供电保持,RTC仍可继续工作。
  • 如果选择了LSI作为自动唤醒单元(AWU)时钟:
    • 如果VDD供电被关闭,AWU的状态是无法保证的。
  • 如果使用HSE时钟除以128作为RTC时钟:
    • 如果VDD供电被关闭或内部电压调节器被关闭(从1.8V域移除电源),RTC的状态是无法保证的。
    • 功率控制器寄存器中的DPB位(禁用备份域写保护)必须设置为1

1.10 看门狗时钟

如果独立看门狗(IWDG)通过硬件选项或软件访问启动,LSI振荡器将被强制开启且无法被禁用。在LSI振荡器启动后,时钟将提供给IWDG。

1.11 时钟输出功能

微控制器时钟输出(MCO)功能允许将时钟信号输出到外部MCO引脚。相应GPIO端口的配置寄存器必须编程为复用功能模式。可以选择8个时钟信号中的一个作为MCO时钟。

  • 系统时钟(SYSCLK)
  • 内部高速时钟(HSI)
  • 外部高速时钟(HSE)
  • 选择的PLL时钟除以2
  • 选择的PLL2时钟
  • 选择的PLL3时钟除以2
  • 选择的XT1外部3-25 MHz振荡器时钟(用于以太网)
  • 选择的PLL3时钟(用于以太网)

输出到MCO的选定时钟信号不得超过50 MHz(最大I/O速度)。选择由时钟配置寄存器(RCC_CFGR)的MCO[3:0]位控制。

2. 复位

存在三种类型的重置,被定义为系统重置、电源重置和备份域重置。

image-20250403151531242

2.1 系统复位

系统重置将所有寄存器设置为它们的重置值,除了时钟控制器CSR寄存器中的重置标志和备份域中的寄存器(见图4)。

当发生以下事件之一时,会生成系统重置:

  1. NRST引脚上的低电平(外部重置)
  2. 窗口看门狗计数结束条件(WWDG重置)
  3. 独立看门狗计数结束条件(IWDG重置)
  4. 软件重置(SW重置)(见软件重置)
  5. 低功耗管理重置(见低功耗管理重置)

通过检查控制/状态寄存器RCC_CSR中的重置标志,可以识别重置源

软件复位

必须将Cortex®-M3应用中断和重置控制寄存器中的SYSRESETREQ位设置为1,以强制对设备进行软件重置。

2.2 低功耗管理复位

生成低功耗管理复位有两种方式:

  1. 进入待机模式时产生的复位:

    这种复位是通过在用户选项字节中重置nRST_STDBY位来启用的。在这种情况下,每当成功执行待机模式进入序列时,设备将被复位而不是进入待机模式。

  2. 进入停止模式时的复位:

    这种复位是通过在用户选项字节中重置nRST_STOP位来启用的。在这种情况下,每当成功执行停止模式进入序列时,设备将被复位而不是进入停止模式。

2.3 电源复位

当发生以下事件之一时,将生成电源重置:

  1. 上电/下电重置(POR/PDR重置)

  2. 退出待机模式时

    电源重置将所有寄存器设置为其重置值,但备份域除外(见图4)

    这些源作用于NRST引脚,并且在延迟阶段始终保持低电平。RESET服务例程向量固定在内存映射中的地址0x0000_0004。。

    提供给设备的系统复位信号在NRST引脚上输出。脉冲发生器保证每个复位源(外部或内部复位)的最小复位脉冲持续时间为20微秒。在外部复位的情况下,当NRST引脚被断言为低电平时生成复位脉冲。

image-20250403152931426

2.4 备份域重置

备份域有两个特定的重置操作,这些操作只影响备份域(见图4)。

当发生以下事件之一时,将生成一个备份域重置:

  1. 软件重置,通过在备份域控制寄存器(RCC_BDCR)中设置BDRST位触发。
  2. VDD或VBAT电源开启,如果之前两个电源都已关闭。