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的时钟系统和时钟树 -
总结
- stm32时钟系统的主要目的就是给相对独立的外设提供时钟,也是为了降低整个芯片的耗能
- 系统时钟是处理器运行时间的基准
- 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令
- 一个单片机内提供不同的系统时钟,可以适应更多的应用场合
- 不同的功能模块会有不同的时钟上限,因此提供不同的时钟,也能在一个单片机内放置更多的功能模块,对不同的模块时钟增加开启和关闭的功能,可以降低单片机的功耗
- 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配置的时钟树生成如下代码
![](https://img-blog.csdnimg.cn/7351f50a66104393bcb9dd4790672e3b.png?watmark/2/text/aHR0cDovL2cuY3Nkbi5uZXQvV5bm1hbjIzMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- 经过上面的操作后,时钟已经流到AHB,APB1,APB2总线上了,想要使用某个外设,直接开启对应的外设时钟即可,例如串口
![](https://img-blog.csdnimg.cn/db7a078972954ba3a3748b045b3de417.png?watmark/2/text/aHR0cDovL2cuY3Nkbi5uZXQvV5bm1hbjIzMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
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