STM32基础知识(三)-- 系统时钟RCC详解


前言

本文主要探讨STM32中比较重要的一个基础知识,RCC系统时钟,系统时钟也就是CPU的脉搏,决定CPU的速率,被誉为芯片的心跳,之后再文章中将会结合《STM32F10X-中文参考手册》进行介绍时钟树以及相关知识。

参考手册获取方式在上一篇博客中介绍


一、基础知识

(1)RCC – 复位和时钟控制器

RCC :reset clock control 复位和时钟控制器。 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。单片机有了时钟,才能够运行执行指令。

(2)HSE – 高速外部时钟信号

HSE: High Speed External Clock signal,高速外部时钟信号,HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从4-16MHZ 不等。当使用有源晶振时,时钟从OSC_IN 引脚进入,OSC_OUT 引脚悬空,当选用无源晶振时,时钟从OSC_IN 和OSC_OUT 进入,并且要配谐振电容。HSE 最常使用的就是8M 的无源晶振

(3)LSE – 低速外部时钟信号

LSE: Low Speed External Clock signal,低速外部时钟信号,即是OSC32_IN和OSC32_OUT接口。外部用于RTC的32.768KHz晶振

(4)HSI – 高速内部时钟信号

HSI: High Speed Internal Clock signal,高速内部时钟信号,出厂校准的8MHz内部RC振荡器。

(5)LSI – 高速内部时钟信号

LSI: Low Speed Internal Clock signal,高速内部时钟信号,带有校准功能的40KHz的内部RC振荡器。

(6)RTC – 实时时钟

RTC: Real Time Clock实时时钟,用于带有年、月、日、小时、分钟、秒钟的计时器。时间显示时候使用

(7)PLL – 锁相环

PLL:锁相环倍频输出,PLL 时钟来源可以有两个,一个来自HSE,另外一个是HSI/2,倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。HSI 是内部高速的时钟信号,频率为8M,根据温度和环境的情况频率会有漂移,一般不作为PLL 的时钟来源。这里我们选HSE 作为PLL 的时钟来源

(8)PLLCLK – PLL时钟

通过设置PLL 的倍频因子, 可以对PLL 的时钟来源进行倍频, 倍频因子可以是:[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16], 具体设置成多少, 由时钟配置寄存器设置。
例如:设置PLL 的时钟来源为HSE=8M,PLL设置为9 倍频,所以经过PLL 倍频之后的PLL时钟:PLLCLK = 8M *9 = 72M。
72M 是ST 官方推荐的稳定运行时钟,如果你想超频的话,增大倍频因子即可,最高为128M。

(9)SYSCLK – 系统时钟

SYSCLK:系统时钟,系统时钟来源可以是:HSI、PLLCLK、HSE,具体的时钟配置寄存器设置。最高72MHz

(10)AHB – 高级高性能总线

AHB:高级高性能总线,这是一种“系统总线”AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接。AHB 系统由主模块、从模块和基础结构(Infrastructure)3部分组成,整个AHB总线上的传输都由主模块发出,由从模块负责回应。

(11)APB

APB:是一种外围总线。APB主要用于低带宽的周边外设之间的连接,例如UART等,它的总线架构不像 AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。

(12)STM32 的多个时钟源

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

(13)外部晶振与内部晶振的区别

外部晶振比较稳定而内部晶振的误差比较大,但如果对频率要求不高,如不涉及到串口通信和精确定时等情况时,则可以使用内部晶振。所以如果对频率要求不高,则一般是优先使用内部晶振。如果要省电,用到了SLEEP,则不能使用内部晶振,因为内部振荡会停止。

二、时钟树详解

首先简单介绍一下整个时钟树
时钟树
在上图中标注了时钟树每一部分的组成,东西很多,看着也很乱,为了方便理解接下来选择其中的一条线进行介绍。
时钟树解释
在上面这个图中,选取了一条时钟线,开始在(1)的位置 选择了外部高速时钟,一般选择8M,然后通过(2)的线路进入(3),在(3)也就是锁相环中,倍频选择x9,8M * 9 = 72M,经过前面的倍频,频率达到72M,也就是最大频率,之后进入APB预分频器(4)中,根据不同外设要求,根据不同外设需要挂载的总线,选择(5)或者(6),经过整个流程达到更改时钟频率的效果。
小结一下:
系统时钟SYSCLK 的左边,系统时钟有很多种选择,也就是系统时钟可以从不同种类初始频率得到,就是设置系统时钟使用哪个时钟源;
系统时钟SYSCLK 的右边,则是系统时钟通过AHB预分频器,给相对应的外设设置相对应的时钟频率。
从左到右可以简单理解为 ,不同时钟源—>系统时钟来源的设置—>系统时钟—>AHB分频器—>各个外设分频倍频器 —> 外设时钟的设置

接下来分部分介绍:

系统时钟来源
系统时钟来源
由上图可知,系统时钟来源于三个部分:HSI 振荡器时钟、HSE 振荡器时钟、主 PLL (PLL) 时钟
初次之外还有两个次级时钟源
次级时钟源

40 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。
32.768 kHz 低速外部晶振(LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)

USB时钟源
USB时钟源
全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取(唯一的),可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz

时钟输出
时钟输出
可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。可以把时钟信号输出供外部使用。

时钟监视系统(CSS)

时钟监视系统
STM32还提供了一个时钟监视系统(CSS),用于监视高速外部时钟(HSE)的工作状态。倘若HSE失效,会自动切换(高速内部时钟)HSI作为系统时钟的输入,保证系统的正常运行。

AHB分频器给外设提供时钟
AHB分频器
AHB分频器可选择1、2、4、8、16、64、128、256、512分频;
系统时钟经过AHB分频器分到五个部分:
(1)内核总线:送给AHB总线、内核、内存和DMA使用的HCLK时钟。
(2)Tick定时器:通过8分频后送给Cortex的系统定时器时钟。
(3)I2S总线:直接送给Cortex的空闲运行时钟FCLK(Free running Clock)。
(4)APB1外设:送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给通用定时器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2-7使用。
(5)APB2外设:送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给高级定时器。该倍频器可选择1或者2倍频,时钟输出供定时器1和定时器8使用。

另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

APB1(低速外设) 上的设备有:电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看门狗、Timer2、Timer3、Timer4。注意USB模块虽然需要一个单独的48MHz时钟信号,但它应该不是供USB模块工作的时钟,而只是提供给串行接口引擎(SIE)使用的时钟。USB模块工作的时钟应该是由APB1提供的。即: APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM等设备。
APB2(高速外设) 上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。即 APB2负责AD,I/O,高级TIM,串口1等设备。
对于不同芯片APB挂载的设备,可以在STM32相对于的芯片参考手册中查看
以上的时钟输出中,有很多是 带使能控制 的,例如AHB总线时钟、内核时钟、各种APB1外设、APB2外设等等。 当需要使用某模块时,一定要先使能对应的时钟。


系统时钟库函数

该函数截取自固件库文件system_stm32f103xe.c
为了方便阅读,我把英文注释翻译成了中文
该函数是直接操作寄存器的,有关寄存器部分请参考数据手册的RCC 的寄存器描述部分

void HSE_SetSysClock(void)
{
	RCC_ClkInitTypeDef clkinitstruct = {0};
	RCC_OscInitTypeDef oscinitstruct = {0};
	/* Enable HSE Oscillator and activate PLL with HSE as source */
	/* 使能HSE,并以HSE 作为PLL 时钟源*/
	oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
	oscinitstruct.HSEState = RCC_HSE_ON;
	oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
	oscinitstruct.PLL.PLLState = RCC_PLL_ON;
	oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
	oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL9;
	if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK) 
	{
	/* Initialization Error */
	/* 初始化错误*/
	while (1);
	}
/* Select PLL as system clock source and configure the HCLK, PCLK1
and PCLK2 clocks dividers */
/* 选择PLL 作为系统时钟源并配置HCLK,PCLK1 和PCLK2 分频系数*/
	clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK |
	RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1
	| RCC_CLOCKTYPE_PCLK2);
	clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
	clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;
	if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
	{
	/* Initialization Error */
	/* 初始化错误*/
	while (1);
   }
}
void HSI_SetSysClock(void)
{
	RCC_ClkInitTypeDef clkinitstruct = {0};
	RCC_OscInitTypeDef oscinitstruct = {0};
	/* Enable HSE Oscillator and activate PLL with HSE as source */
	/* 使能HSI, 并以HSI 作为PLL 时钟源*/
	oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
	oscinitstruct.HSEState = RCC_HSE_ON;
	oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
	oscinitstruct.PLL.PLLState = RCC_PLL_ON;
	oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
	oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL9;
	if (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK) 
	{
	/* Initialization Error */
	/* 初始化错误*/
	while (1);
	}
/* Select PLL as system clock source and configure the HCLK, PCLK1
and PCLK2 clocks dividers */
/* 选择PLL 作为系统时钟源并配置HCLK,PCLK1 和PCLK2 分频系数*/
	clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK |
	RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1
	| RCC_CLOCKTYPE_PCLK2);
	clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
	clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
	clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;
	clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;
	if (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK)
	{
	/* Initialization Error */
	while (1);
	}
}

总结

本文详细的介绍了STM32RCC时钟的相关知识,分析了整个时钟树,最后附上了相关的库函数。

博客制作过程中难免有一些疏漏和不严谨之处,有问题欢迎评论区批评指正。

  • 38
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32CubeMX是一款用于STM32微控制器的图形化配置工具,其中包括了RCC(Reset and Clock Control)模块的配置。RCC模块是STM32微控制器中的一个重要模块,它负责系统时钟的配置和控制。下面是RCC配置的详解: 1.时钟源选择:RCC模块支持多种时钟源,包括内部时钟(HSI、LSI)、外部时钟(HSE、LSE)和PLL时钟。在配置时需要根据实际需求选择合适的时钟源。 2.时钟分频配置:RCC模块支持多种时钟分频配置,包括AHB、APB1和APB2的分频配置。在配置时需要根据实际需求选择合适的分频系数。 3.时钟输出配置:RCC模块支持将时钟输出到MCO引脚,以便于外部设备使用。在配置时需要选择合适的时钟输出源和分频系数。 4.时钟安全配置:RCC模块支持时钟安全功能,包括时钟监测和时钟失效处理。在配置时需要根据实际需求选择合适的安全配置。 总之,RCC模块的配置对于STM32微控制器的正常运行至关重要,需要根据实际需求进行详细的配置。STM32CubeMX提供了图形化的配置界面,可以方便地进行配置。 ### 回答2: STM32CubeMX是针对ST微电子系列产品的可视化配置软件,可以帮助大家快速生成C代码,从而更轻松地开发应用。在使用STM32CubeMX进行开发时,RCC(Reset and Clock Control)是一个非常重要的配置部分,它相关的配置会对程序的运行和性能产生很大影响。下面我们对STM32CubeMX RCC配置进行详解。 1.时钟源选择:在RCC配置中,首先要确定芯片使用哪个时钟源。STM32芯片通常有多个时钟源可供选择,包括HSE(外部高速晶振)、HSI(内部高速时钟)、LSE(外部低速晶振)和LSI(内部低速时钟)。 2.时钟分频:时钟分频决定了时钟的频率,决定了外设、总线等的工作时钟速度。常见的分频方式有PLL、HSE/PREDIV、SYSCLK、AHBCLK和APBCLK。各个分频的含义分别如下: (1)PLL:PLL分频器能够将从时钟源获得的低频率信号升至芯片设定的高频率。通常可以将低频的HSE或HSI时钟分频输入PLLM,再通过PLLN倍频后输出高频的PLLCLK,进行芯片内部时钟的配置。 (2)HSE/PREDIV: 外部高速晶振时钟直接输入HSE,如果需要的话可以通过PREDIV对其进行一个低频分频,从而得到符合设定的芯片时钟条件。 (3)SYSCLK: SYSCLK分频影响微处理器的时钟系统时钟即SYSCLK,其由HSE或HSI或PLLCLK分频得到。通常SYSCLK和PLLCLK配合工作,即系统时钟是由PLL倍频后的PLLCLK通过SYSCLK分频系数得到的。 (4)AHBCLK: AHBCLK为高速总线时钟,一般时钟源为SYSCLK,并经过AHB预分频器进行低频分频得到。这个时钟用来驱动系统总线和内存控制器等高速模块。 (5)APBCLK: APBCLK为低速外设时钟,它可以是AHBCLK的分频输出,也可以是HCLK的分频输出。APBCLK是芯片中所有低速外设所共用的总线时钟,将APBCLK设置为较低的时钟频率能在保证外设运行需要的性能下降低功耗。 3.外设时钟使能:在使用外设之前,需要先开启其对应的时钟。通过STM32CubeMX,我们可以快速开启或关闭所需的外设时钟。 4.时钟源错误处理:当芯片使用的时钟源出现错误时,芯片性能和工作稳定性可能会受到很大影响,因此,需要对时钟源错误进行判断。STM32芯片有时钟源错误标志,可以在程序中进行错误处理和保护。 综上所述,STM32CubeMX RCC配置对于芯片的正常运行和程序性能具有重要影响,合理配置是确保程序稳定性和性能优异的必要步骤。 ### 回答3: STM32CubeMX是一款可视化图形化配置工具,用于配置STM32微控制器的外设和时钟系统。在使用STM32CubeMX进行外设配置时,RCC(Reset and Clock Control)配置是其中的重要一部分。RCC模块是STM32芯片的一个重要模块,它负责产生系统时钟和各个外设需要的时钟信号,同时还提供控制低功耗模式、软件复位功能等。因此,在使用STM32CubeMX进行外设配置时,需要仔细理解RCC的配置方式。 在STM32CubeMX中进行RCC配置时,需要注意以下几个方面: 1.时钟源的选择:在RCC配置中,需要选择SYSCLK的时钟源,通常可选的时钟源有HSI、HSE、PLL等。HSI为内部高速时钟源,HSE为外部高速时钟源,而PLL将HSI或HSE的时钟频率倍频后输出。选择合适的时钟源可以根据应用场景来定,通常来说,外部高速时钟源更稳定,可靠性更高。 2.时钟分频器的设置:在RCC配置中,可以设置多个时钟分频器,以产生各个外设需要的时钟信号。常见的分频器有APB1、APB2、AHB分频器等,分别用于控制不同的总线时钟频率和各个外设时钟频率。需要根据实际使用情况来设置分频器。 3.低功耗模式的设置:在RCC配置中,还可以设置低功耗模式。在STM32芯片中,低功耗模式包括Run、Sleep、Stop、Standby等模式。选择合适的低功耗模式可以在保证系统需求的情况下,有效降低功耗。 4.时钟安全相关设置:在RCC配置中,还需要设置时钟安全相关的参数。例如可选择的时钟源、时钟源的稳定性等。 总之,STM32CubeMX中的RCC配置十分重要,对于STM32芯片的使用和应用具有重要意义。需要仔细研究各个参数的含义,灵活掌握配置方式。同时,在RCC配置完成后,需要进行整个工程的编译和调试,以保证配置的正确性和系统的稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值