目录
- 1 时钟系统结构图
- 2 STM32时钟系统(一)
- 3 STM32时钟系统(二)
- 4 RCC寄存器
-
- 4.1 时钟控制寄存器(RCC_CR)
- 4.2 时钟配置寄存器(RCC_CFGR)
- 4.3 时钟中断寄存器(RCC_CIR)
- 4.4 APB2外设复位寄存器(RCC_APB2RSTR)
- 4.5 APB1外设复位寄存器(RCC_APB1RSTR)
- 4.6 AHB外设时钟使能寄存器(RCC_AHBENR)
- 4.7 APB2外设时钟使能寄存器(RCC_APB2ENR)
- 4.8 APB1外设时钟使能寄存器(RCC_APB1ENR)
- 4.9 备份域控制寄存器(RCC_BDCR)
- 4.10 控制/状态寄存器(RCC_CSR)
- 4.11 AHB外设时钟复位寄存器(RCC_AHBRSTR)
- 4.12 时钟配置寄存器2(RCC_CFGR2)
- 4.13 RCC寄存器地址映像
- 5 时钟系统初始化C语言代码实现
- 6 结束
1 时钟系统结构图
2 STM32时钟系统(一)
2.1 各个时钟源
① STM32有5个时钟源:HSI、HSE、 LSI、 LSE、 PLL
- HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高
- HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz ~ 16MHz
- LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟
- LSE是低速外部时钟,接频率为32.768kHz的石英晶体
- PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2,倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz
② 系统时钟SYSCLK可来源于三个时钟源:
- HSI振荡器时钟
- HSE振荡器时钟
- PLL时钟
④ 举例: Keil编写程序是默认的时钟为72Mhz:
- 外部晶振(HSE)提供的8MHz,通过PLLXTPRE分频器
- 进入PLLSRC选择开关,通过PLLMUL锁相环进行倍频(x9),为系统提供72MHz的系统时钟(SYSCLK)
- AHB预分频器对时钟信号进行分频,为低速外设提供时钟
③ 注意:
- 独立时钟源为4个,因为PLL本身不能提供时钟
- LSI一般作为IWDGCLK(独立看门狗)时钟源和RTC时钟源
- 系统时钟最大频率为72MHz
2.2 时钟信号输出到外部
STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。可以把时钟信号输出供外部使用
2.3 AHB分频器
系统时钟通过AHB分频器给外设提供时钟,系统时钟 -> AHB分频器 -> 各个外设分频倍频器 -> 外设时钟的设置
AHB分频器可选择1、2、4、8、16、64、128、256、512分频,输出的时钟输送给5大模块使用:
- 内核总线:输送给AHB总线、内核、内存和DMA使用的HCLK时钟
- Tick定时器:通过8分频后送给Cortex的系统定时器时钟
- I2S总线:直接送给Cortex的空闲运行时钟FCLK
- APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给通用定时器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2-7使用
- APB2外设:送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给高级定时器。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用
2.4 APB1和APB2的对应外设
APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、USART2、USART3、UART4、UART5、SPI2、SP3等
而APB2上面连接的是高速外设,包括UART1、SPI1、Timer1、ADC1、ADC2、ADC3、所有的普通I/O口(PA-PE)、第二功能I/O(AFIO)口等
3 STM32时钟系统(二)
3.1 时钟安全系统(CSS)
如果HSE时钟发生故障,HSE振荡器被自动关闭,时钟失效事件将被送到高级定时器(TIM1和TIM8)的刹车输入端,并产生时钟安全中断CSSI,允许软件完成营救操作。此CSSI中断连接到Cortex™-M3的NMI中断(不可屏蔽中断)
一旦CSS被激活,并且HSE时钟出现故障,CSS中断就产生,并且NMI也自动产生。NMI将被不断执行,直到CSS 中断挂起位被清除。因此,在NMI的处 理程序中必须通过设置时钟中断寄存器(RCC_ CIR) 里的CSSC位来清除CSS中断
如果HSE振荡器被直接或间接地作为系统时钟,(间接的意思是:它被作为PLL输入时钟或通过PLL2,并且PLL时钟被作为系统时钟),时钟故障将导致系统时钟自动切换到HSI振荡器,同时外部HSE振荡器被关闭。在时钟失效时,如果HSE振荡器时钟(直接的或通过PLL2)是作为PLL的输入时钟,PLL也将被关闭
3.2 RTC时钟
通过设置 备份域控制寄存器(RCC_BDCR)里的RTCSEL[1:0]位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供
3.3 看门狗时钟
如果独立看门狗已经由硬件选项或软件启动,LSI振荡器将被强制在打开状态,并且不能被关闭。在LSI振荡器稳定后,时钟供应给IWDG
3.4 USB时钟
STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz