STM32 RCC浅析

RCC的全称是reset and clock control, 以下将从reset和clock两个方面进行介绍

Reset

在stm32中·有三种类型的复位: system reset, power reset, backup domain reset

system reset

system reset将会复位除了RCC->CSR寄存器(reset flag)和备份域寄存器以外的所有寄存器

  • 几种system reset来源
    1. A low level on NRST pin
    2. WWDG 和 IWDG
    3. Software reset
    4. low-power management

  • 当系统被复位后,如何知道是因为什么原因造成的复位呢?
    在这里插入图片描述

    之前说到系统复位后,CSR里面的reset flag并不会被复位,因为这里就是保存产生复位原因的flag的地方

  • Software reset的实现
    在这里插入图片描述
    见图中描述,将SCB->AIRCR中的SYSRESETREQ置位后,将会使芯片产生系统复位,注意,VECTRRESET bit置位后也会产生复位,但只是复位cortex m3/m4处理器(调试逻辑除外),并不会复位外设,一般在调试过程中使用的复位就是这个,否则调试逻辑将会断开

  • low-power management reset实现
    在User Option Bytes中,设置nRST_STDBY/nRST_STOP bit后,不管进入stand by/stop mode的流程是否正确执行,都会产生reset,而不会进入stand by/stop mode

  • power reset实现
    NRST pin至少保持20us的低电平,即可产生system reset,可以分为内部和外部的触发方式,但原理都一样,都是产生20us的低电平
    在这里插入图片描述

CLOCK

  • 什么是时钟
    时钟是单片机运行的基础, 时钟信号推动单片机内各个部分执行相应的指令。时钟系统就是CPU的脉搏,决定cpu的速率,像人的心跳一样,只有有了心跳,人才能去做其它的事情。

  • 为什么STM32要有多个时钟源
    STM32本身十分复杂,外设非常多,但我们实际使用的时候只会用到有限的几个外设,使用任何外设都需要时钟才能启动,但并不是所有的外设都需要系统时钟那么高的频率,为了兼容不同速度的设备,有些高速,有些低速,如果都用高速时钟,势必造成浪费,并且,同一个电路,时钟越快功耗也越快,同时抗电磁干扰能力也就越弱,所以较为复杂的MCU都是采用多时钟源的方法来解决这些问题,基于这些原因,便有了stm32的时钟系统和时钟树

  • 总结

    1. stm32时钟系统的主要目的就是给相对独立的外设提供时钟,也是为了降低整个芯片的耗能
    2. 系统时钟是处理器运行时间的基准
    3. 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令
    4. 一个单片机内提供不同的系统时钟,可以适应更多的应用场合
    5. 不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块,对不同的模块时钟增加开启和关闭的功能,可以降低单片机的功耗
    6. stm32为了低功耗,所有外设时钟均默认为disable,用到什么外设再去对应打开,这样耗能会减少
  • stm32f1的时钟系统框图
    在这里插入图片描述

  • 有三个时钟可以作为system clock
    - HSI oscillator clock
    - HSE oscillator clock
    - PLL clock

  • 另外还有两个时钟源可以使用
    - 40khz的低速内部rc时钟:LSI
    - 32.768khz的低速外部晶振:LSE

  • HSE clock
    HSE时钟可以由外部晶体振荡器产生,或者是用户提供的外部时钟, 使用3~25M的外部晶体振荡器可以产生一个非常准确的时钟

  • HSI clock
    HSI时钟由内部8M的RC振荡器产生,可以直接用于system clock或者二分频后用于pll输入,使用HSI可以降低成本(不需要外部组件),而且相比外部晶振拥有一个更快的启动时间,然而即使经过校准后的HSI也没有HSE的时钟精准

  • PLLs
    PLL的配置(源的选择,分频系数,倍频系数)必须在使能PLL前完成, 而且在使能PLL前需要确保它使用的输入时钟是稳定的,一旦PLL使能了,前面所说的这些参数不能被改变,在PLL ready后可以产生一个中断(前提是在RCC-> CIR寄存器中使能这个功能)

  • LSE clock
    提供一个low power,且足够准确的的时钟给RTC

  • LSI clock
    提供一个low power且可以在stop/standby 模式下仍然可以跑的时钟给IWDT和Auto-wakeup unit

  • System clock selection
    在system reset后,HSI会自动选择为system clock,当一个时钟源(直接或者间接通过PLL)作为system clock时,是不可能将它停下的,当要system clock从一个源切换至另一个源时,必须保证目标源ready:clock stable or PLL locked

  • CSS(clock security system)
    当检测到HSE出故障时,将会产生一个CSSI(连接到的NMI)中断,供用户采取补救措施,一般情况下,HSE出问题后将会自动切换至HSI时钟

STM32HAL库RCC流程

按照时钟的走向,可以简单理解为:各个时钟源的设置—>系统时钟来源设置—>各个外设时钟的设置

  • 在进入main函数之前,会先执行SystemInit函数,这里面就是对RCC的复位初始化
  • 在进入main函数后,会根据user配置的时钟树生成如下代码
  • 经过上面的操作后,时钟已经流到AHB,APB1,APB2总线上了,想要使用某个外设,直接开启对应的外设时钟即可,例如串口

RCC寄存器总览

  • RCC_CR
    在这里插入图片描述

  • RCC_CFGR
    在这里插入图片描述

  • RCC_CFG2
    在这里插入图片描述

  • RCC_CIR
    在这里插入图片描述

  • RCC_AHBRSTR
    在这里插入图片描述

  • RCC_APB1RSTR
    在这里插入图片描述

  • RCC_APB2RSTR
    在这里插入图片描述

  • RCC_AHBENR
    在这里插入图片描述

  • RCC_APB1ENR
    在这里插入图片描述

  • RCC_APB2ENR
    在这里插入图片描述

  • RCC_BDCR
    在这里插入图片描述

  • RCC_CSR
    在这里插入图片描述

参考自:
1.《stm32f1xxx reference manual》
2. https://blog.csdn.net/as480133937/article/details/98845509?spm=1001.2014.3001.5502

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值