STM32F103学习笔记 —RCC(时钟)
2026/6/13 15:49:56 网站建设 项目流程

RCC

RCC —— 复位和时钟控制器。专门负责管理和生成所有时钟信号,包括:系统时钟SYSCLK、AHB 分频因子(决定 HCLK 等于多少)、 APB2 分频因子(决定 PCLK2 等于多少)、 APB1 分频因子(决定 PCLK1 等于多少)、设置各个外设的分频因子。

框图

各个时钟源

STM32 有4个独立时钟源:HSI、HSE、LSI、LSE。
①、HSI是高速内部时钟,RC振荡器,频率为8MHz,精度不高。
②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz,常用8M。
③、LSI是低速内部时钟,RC振荡器,频率为40kHz,提供低功耗时钟。
④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

系统时钟

1.PLL 时钟源:来源----HSE或者HSI/2。
2.PLL 时钟 PLLCLK:可以设置PLL的倍频因子对PLL时钟源倍频,倍频因子可以是:[2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],常设置9倍频,因72M是官方推荐的稳定运行时钟。如果要超频,最大设置128M。
3.系统时钟 SYSCLK:来源可以是:HSI、PLLCLK、HSE,常用SYSCLK = PLLCLK

外设时钟

1.AHB 总线时钟 HCLK:系统时钟 SYSCLK 经过 AHB 预分频器分频之后得到的时钟,分频因子可以是:[1,2,4,8,16,64,128,256,512]。AHB分频器分频后送给各模块使用。
2.APB2 总线时钟 HCLK2:由 HCLK 经过高速 APB2 预分频器得到,分频因子可以是:[1,2,4,8,16],最大为72M。
3.APB1 总线时钟 HCLK1:由 HCLK 经过低速 APB 预分频器得到,分频因子可以是:[1,2,4,8,16],最大为36M。

其他时钟

1.USB时钟:由 PLLCLK 经过 USB 预分频器得到,分频因子可以是:[1,1.5],最高是 48M。
2.Cortex 系统时钟:由 HCLK 8 分频得到,等于 9M。用来驱动内核的系统定时器 SysTick,SysTick 一般用于操作系统的时钟节拍,也可以用做普通的定时。
3.ADC 时钟:由 PCLK2 经过 ADC 预分频器得到,分频因子可以是[2,4,6,8]。。ADC时钟最高只能是 14M,如果采样周期设置成最短的 1.5 个周期的话,ADC 的转换时间可以达到最短的 1us。如果真要达到最短的转换时间 1us 的话,那 ADC 的时钟就得是 14M,反推 PCLK2 的时钟只能是:28M、56M、84M、112M,鉴于 PCLK2 最高是 72M,所以只能
取 28M 和 56M。
4.RTC 时钟、独立看门狗时钟:来源 — HSE/128 分频、LSE、HSI

软件设计

新建一个.c和.h文件,一般不直接修改系统文件,自己新建,方便升级、移植
编程要点:
1、开启 HSE/HSI ,并等待 HSE/HSI 稳定
2、设置 AHB、APB2、APB1 的预分频因子
3、设置 PLL 的时钟来源,和 PLL 的倍频因子,设置各种频率主要就是在这里设置
4、开启 PLL,并等待 PLL 稳定
5、把 PLLCK 切换为系统时钟 SYSCLK
6、读取时钟切换状态位,确保 PLLCLK 被选为系统时钟
代码:

//bsp_clkconfig.c文件#include"bsp_clkconfig.h"#include"stm32f10x_rcc.h"/* 使用HSE时,设置系统时钟的步骤 1.开启HSE,并等待HSE稳定 2.设置AHB、APB2、APB1的预分频因子 3.设置PLL的时钟来源,和pLL的倍频因子,设置各种频率主要就是在这里设置 4.开启PLL,并等待PLL稳定 5.把PLLCK切换为系统时钟SYSCLK 6.读取时钟切换状态位,确保PLLCLK被选为系统时钟 设置系统时钟:SYSCLK,AHB总线时钟:HCLK,APB2总线时钟:PCLK2,APB1总线时钟:PCLK1 PCLK2 = HCLK = SYSCLK PCLK1=HCLK/2,最高只能是36M HSE作为时钟来源,经过PLL倍频作为系统时钟,这是通常的做法 */voidHSE_SetSysClock(uint32_tpllmul){__IOuint32_tStartUpCounter=0,HSEStartUpStatus=0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSE,开启外部晶振RCC_HSEConfig(RCC_HSE_ON);//等待HSE启动稳定HSEStartUpStatus=RCC_WaitForHSEStartUp();//只有HSE稳定之后则继续往下执行if(HSEStartUpStatus==SUCCESS){//----------------------------------------------------------------------////使能FLASH预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成o或者1的时候,如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了 0: 0 < SYSCLK <= 24M 1: 24 < SYSCLK <= 48M 2:48 < SYSCLK <= 72M*/FLASH_SetLatency(FLASH_Latency_2);//----------------------------------------------------------------------//// AHB预分频因子设置为1分频,HCLK = SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);// APB2预分频因子设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);// APB1预分频因子设置为2分频,PCLK1 = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这里设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因子// PLLCLK = 8MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSE_Div1,pllmul);//------------------------------------------------------------------//// 开启PLLRCC_PLLCmd(ENABLE);// 等待 PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//读取时钟切换状态位,确保PLLCLK被选为系统时钟while(RCC_GetSYSCLKSource()!=0x08){}}else{/*如果HSE开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理,当HSE开启失败或者故障的时候,单片机会自动把HsI设置为系统时钟,HSI是内部的高速时钟,8MHz*/while(1){}}}/* 使用HSI时,设置系统时钟的步骤 1.开启HSI,并等待HSI稳定 2.设置AHB、APB2、APB1的预分频因子 3.设置PLL的时钟来源,和pLL的倍频因子,设置各种频率主要就是在这里设置 4.开启PLL,并等待PLL稳定 5.把PLLCK切换为系统时钟SYSCLK 6.读取时钟切换状态位,确保PLLCLK被选为系统时钟 设置系统时钟:SYSCLK,AHB总线时钟:HCLK,APB2总线时钟:PCLK2,APB1总线时钟:PCLK1 PCLK2 = HCLK = SYSCLK PCLK1=HCLK/2,最高只能是36M HSI作为时钟来源,经过PLL倍频作为系统时钟,这是在HsE故障的时候才使用的方法 HSI会因为温度等原因会有漂移,不稳定,一般不会用HsI作为时钟来源,除非是追不得已的情况 如果HSI要作为PLL时钟的来源的话,必须二分频之后才可以,即HSI/2,而PLL倍频因子最大只能是16,所以当使用HSI的时候,SYSCLK最大只能是4M*16=64M */voidHSI_SetSysClock(uint32_tpllmul){__IOuint32_tHSIStartUpStatus=0;// 把RCC外设初始化成复位状态,这句是必须的RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);//等待HSI就绪HSIStartUpStatus=RCC->CR&RCC_CR_HSIRDY;// 只有HSE稳定之后则继续往下执行if(HSIStartUpStatus==RCC_CR_HSIRDY){//----------------------------------------------------------------------//// 使能FLASH预存取缓冲区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);/*SYSCLK周期与闪存访问时间的比例设置,这里统一设置成2 设置成2的时候,SYSCLK低于48M也可以工作,如果设置成o或者1的时候,如果配置的SYSCLK超出了范围的话,则会进入硬件错误,程序就死了 0: 0 < SYSCLK <= 24M 1: 24 < SYSCLK <= 48M 2:48 < SYSCLK <= 72M*/FLASH_SetLatency(FLASH_Latency_2);//----------------------------------------------------------------------//// AHB预分频因子设置为1分频,HCLK = SYSCLKRCC_HCLKConfig(RCC_SYSCLK_Div1);// PB2预分频因子设置为1分频,PCLK2 = HCLKRCC_PCLK2Config(RCC_HCLK_Div1);// APB1预分频因子设置为2分频,PCLK1 = HCLK/2RCC_PCLK1Config(RCC_HCLK_Div2);//-----------------设置各种频率主要就是在这里设置-------------------//// 设置PLL时钟来源为HSE,设置PLL倍频因子// PLLCLK = 4MHz * pllmulRCC_PLLConfig(RCC_PLLSource_HSI_Div2,pllmul);//------------------------------------------------------------------//// 开启PLLRCC_PLLCmd(ENABLE);// 等待 PLL稳定while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET){}//当PLL稳定之后,把PLL时钟切换为系统时钟SYSCLKRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//读取时钟切换状态位,确保PLLCLK被选为系统时钟while(RCC_GetSYSCLKSource()!=0x08){}}else{/*如果HSI开启失败,那么程序就会来到这里,用户可在这里添加出错的代码处理,当HSE开启失败或者故障的时候,单片机会自动把HsI设置为系统时钟,HSI是内部的高速时钟,8MHz*/while(1){}}}
//bsp_clkconfig.h文件#ifndef__CLKCONFIG_H#define__CLKCONGIF_H#include"stm32f10x.h"voidHSE_SetSysClock(uint32_tpllmul);voidHSI_SetSysClock(uint32_tpllmul);#endif

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询