STM32时钟树

系统时钟

①HSE 高速外部时钟信号

HSE 是高速外部时钟信号,可以由有源晶振或者无源晶振提供,频率为4~16MHz。当使用有源晶振时,时钟从OSC_IN引脚进入,OSC_OUT引脚悬空;当使用无源晶振时,时钟从OSC_IN和OSC_OUT进入,并且要配谐振电容。

HSE最常使用的是8MHz的无源晶振。当确定PLL时钟来源的时候,HSE 可以不分频或者2分频,这个由时钟配置寄存器CFGR的位17,即PLLXTRE设置。



②PLL时钟源

PLL时钟来源可以有两个:一个是HSE,另一个是HSI/2。由时钟配置寄存器CFGR的位16,即PLLSRC设置具体用哪个。HSI是内部高速的时钟信号,频率为8MHz,这里我们选择HSE作为PLL的时钟来源。

③PLL时钟PLLCLK

通过设置PLL的倍频因子,可以对PLL的时钟来源进行倍频,倍频因子可以是2至16,由时钟配置寄存器CFGR的位21~18,即PLLMUL[3:0]设置,这里设置为9倍频,因为上一步设置PLL的时钟来源为HSE=8MHz,所以PLLCLK=8M*9=72M。72M是ST官方推荐的稳定运行时钟,可以增大倍频因子实现超频,最大为128MHz。

④系统时钟SYSCLK

由图可知系统时钟的来源可以是HSI,PLLCLK,HSE,具体由时钟配置寄存器CFGR的为1~0,即SW[1:0]设置。这里设置系统时钟:SYSCLK=PLLCLK=72MHz。

⑤AHB总线时钟HCLK

系统时钟SYSCLK经过AHB预分频器分频之后得到的时钟叫APB总线时钟,即HCLK,分频因子可以是[1,2,4,8,16,64,128,256,512],具体由时钟配置寄存器CFGR的位7~4,即HPRE[3:0]设置。这里设置为1分频,即HCLK=SYSCLK=72MHz。

⑥APB1总线时钟HCLK1

APB1总线时钟PCLK1由HCLK经过低速APB2预分频器得到,分频因子可以是[1,2,4,8,16],具体由时钟配置寄存器CFGR的位10~8,即PRRE1[2:0]设置。HCLK1属于低速的总线时钟,最高为36MHz。片上低速外设就挂载到这条总线上,比如USART2/3/4/5,SPI2/3,IIC1/IIC2等。这里设置2分频,即PCLK1=HCLK/2=36MHz。

⑦APB2总线时钟HCLK2

APB2总线时钟PCLK2由HCLK经过高速APB2预分频器得到,分频因子可以是[1,2,4,8,16],具体由时钟配置寄存器CFGR的位13~11,即PPRE2[2:0]设置。HCLK2属于高速的总线时钟,片上高速外设就挂载到这条总线上,比如全部GPIO,USART1,SPI1等。这里设置1分频,即PCLK2=HCLK=72MHz。
上面的7个步骤对应的设置系统时钟的库函数,该函数截取自system_stm32f10x.c。

其他时钟

A.USB时钟

由STM32时钟树可知,USB时钟是由 PLLCLK经过USB预分频器得到分频因子可以是1或1.5,具体由时钟配置寄存器CFGR的位22,即USBPRE配置。USB的时钟最高是48MHz,所以PLLCLK只能是48MHz或者72MHz。PLLCLK只能是由HSE倍频得到,不能使用HSI倍频。

B.Cortex系统时钟

Cortex系统时钟由HCLK 8 分频得到,等于9MHz,Cortex系统时钟用来驱动内核的系统定时器SysTick,SysTick一般用于操作系统的时钟节拍,或普通定时。

C.ADC时钟

ADC时钟由PCLK2经过预分频得到,分频因子可以是[2,4,6,8],具体由时钟配置寄存器CFGR的位15~14,即ADCPRE[1:0]决定。

D.RTC时钟,独立看门狗时钟

RTC时钟可由HSE/128分频得到,也可由低速外部时钟信号LSE提供,频率为32.768kHz,也可由低速内部时钟信号HSI提供,由备份域控制寄存器BDCR的位9~8,即RTCSEL[1:0]配置。独立看门狗的时钟只能由LSI提供,LSI是低速的内部时钟信号,频率为30至60kHz,一般取40kHz。

E.MCO时钟输出

MCO是Microcontrolller Clock Output 的缩写,是微控制器时钟输出引脚,在STM32F1系列中由PA8复用所得,主要作用是对外提供时钟,相当于有源晶振。MCO的时钟来源可以是:PLLCLK/2,HSI,HSE,SYSCLK,具体选哪一个由时钟配置寄存器CFGR的位26~24,即MCO[2:0]决定。

软件设计

编程要点:

  1. 开启HSE/HSI,并等待HSE/HSI稳定。
  2. 设置AHB,APB2,APB1的分频因子。
  3. 设置PLL的时钟来源和 PLL的倍频因子。
  4. 开启PLL,等待PLL稳定。
  5. 把PLLCK切换为系统时钟SYSCLK。
  6. 读取时钟切换状态位,确保时钟被选为系统时钟。
① 使用HSE配置系统时钟
void HSE_SetSysClock(uint32_t pllmul)
{__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;//把RCC外设初始化成复位状态RCC_DeInit();//使能HSE,开启外部晶振,RCC_HSEConfig(RCC_HSE_ON);//等待SHE启动稳定HSEStartUpStatus = RCC_WaitForHSEStartUp();//当HSE稳定之后继续往下执行if(HSEStartUpStatus == SUCCESS){//使能Flash预存取缓存区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置SYSCLK周期与Flash访问时间的比例,这里统一设置成2//0: 0<SYSCLK<24M   1:  24M<SYSCLK<48M    2:   48M<SYSCLK<72MFLASH_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);RCC_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{while(1){}}
}

这个函数使用库函数编写,有个形参pllmul,用来设置PLL的倍频因子。
函数调用举例:HSE_SetSysClock(RCC_PLLMul_9); 设置时钟为:8MHz * 9 = 72MHz
HSE_SetSysClock(RCC_PLLMul_16); 设置时钟为:8MHz * 16 = 128MHz

② 使用HSI配置系统时钟
void HSI_SetSysClock(uint32_t pllmul)
{__IO uint32_t HSIStartUpStatus = 0;//把RCC外设初始化成复位状态RCC_DeInit();//使能HSIRCC_HSICmd(ENABLE);//等待SHI启动稳定HSIStartUpStatus = RCC->CR & RCC_CR_HSIRDY;//当HSI稳定之后继续往下执行if(HSIStartUpStatus == RCC_CR_HSIRDY){//使能Flash预存取缓存区FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//设置SYSCLK周期与Flash访问时间的比例,这里统一设置成2//0: 0<SYSCLK<24M   1:  24M<SYSCLK<48M    2:   48M<SYSCLK<72MFLASH_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);RCC_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{while(1){}}
}

HSI设置系统时钟函数与SHE设置系统时钟函数原理上一样,但HSI必须2分频之后才能作为PLL的时钟来源。所以使用HSI时,最大系统时钟SYSCL只能是HSI/216=416=64MHz.函数调用举例:HSI_SetSysClock(RCC_PLLMul_9);设置系统时钟为:4MHz * 9=36MHz。

③ 软件延时
void Delay(__IO uint32_t nCount)
{for(;nCount !=0; nCount--);
}
④ MCO输出

在STM32F103系列中,PA8可以复用为MCO引脚,对外提供时钟输出。

void MCO_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;//开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//选择GPIO8引脚GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置为复用推挽输出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//设置IO的反转速率为50MHzGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//初始化GPIOA8GPIO_Init(GPIOA,&GPIO_InitStructure);
}
//MCO引脚输出可以是HSE,HSI,PLLCL/2,SYSCLK
//RCC_MCOConfig(RCC_MCO_HSE);
//RCC_MCOConfig(RCC_MCO_HSI);
//RCC_MCOConfig(RCC_MCO_PLLCLK_Div2);
RCC_MCOConfig(RCC_MCO_SYSCLK);
⑤ Main函数
int main(void)
{//程序来到main函数之前,启动文件statup_stm32f10x_hd.s已经调用//SystemInit()函数把系统时钟初始化成72MHz//SystemInit()在system_stm32f10x.c中定义//重新设置系统时钟,这时候可以选择是使用HSE还是HSI//使用HSE时,SYSCLK = 8MHz * RCC_PLLMul_x,x为2~16,最高是128MHZHSE_SetSysClock(RCC_PLLMul_9);//使用HSI时,SYSCLK = 4MHz * RCC_PLLMul_x,x为2~16,最高是64MHZ//HSI_SetSysClock(RCC_PLLMul_16);//MCO引脚初始化MCO_GPIO_Config();RCC_MCOConfig(RCC_MCO_SYSCLK);//LED端口初始化LED_GPIO_Config();while(1){LED1(ON);Delay(0x0FFFFF);LED1(OFF);Delay(0x0FFFFF);}
}

实验:

① MCO输出使用HSE时,SYSCLK = 8MHz * RCC_PLLMul_9=72MHz,HSE_SetSysClock(RCC_PLLMul_9);

② MCO输出使用HSE时,SYSCLK = 8MHz * RCC_PLLMul_16=128MHz,HSE_SetSysClock(RCC_PLLMul_16);

STM32使用HSE/HSI配置时钟(六)相关推荐

  1. STM32系统学习——RCC(使用HSE/HSI配置时钟)

    ** STM32系统学习--RCC(使用HSE/HSI配置时钟) ** RCC :reset clock control 复位和时钟控制器.主要讲解时钟部分,特别是要着重理解时钟树,理解了时钟树,ST ...

  2. 野火学习笔记(8) —— RCC —— 使用 HSE/HSI 配置时钟

    文章目录 1. RCC 主要作用--时钟部分 2. RCC 框图剖析-时钟部分 2.1 系统时钟 ① HSE 高速外部时钟信号 ② PLL 时钟源 ③ PLL 时钟 PLLCLK ④ 系统时钟 SYS ...

  3. RCC—使用 HSE/HIS 配置时钟

    RCC :reset clock control  复位和时钟控制器:特别是要着重理解时钟树,理解了时钟树,F429 的一切时钟的来龙去脉都会了如指掌. STM32F4系列有5个时钟源: LSIRC( ...

  4. stm32 HSE HSI

    stm32 HSE HSI 时钟树 main.c clkconfig.h clkconfig.c 时钟树 HSE_SetSysClock和HSI_SetSysClock这两个函数就是根据上面这个时钟树 ...

  5. STM32|HSE/HSI调频

    目录 什么是HSE 什么是HSI 配置HSE外部高速时钟 HSE配置 HSI配置 什么是HSE               HSE 是高速的外部时钟信号,可以由有源晶振或者无源晶振提供,频率从 4-1 ...

  6. STM32学习之总线与时钟

    前言 上一篇博客复习了C语言,这一篇博客主要是学习STM32F407中的总线与时钟,这一部分对计算机组成原理的知识有一定的要求, 这一部分极其枯燥,但是十分重要,望仔细学习 学习资料来自:STM32F ...

  7. 【STM32】HAL库 STM32CubeMX教程六----定时器中断

    前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等.是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将 ...

  8. Stm32 CubeMx安装和配置Cube.ai教程

    目录 前言 下载ST CubeMx IDE 安装过程 配置Cube.AI Cube.AI背景知识 CubeMX配置Cube.AI 在项目中使用Cube.AI扩展库 验证AI 结尾小谈 前言 Stm32 ...

  9. STM32F7配置时钟的方法(keil)

    关于时钟的基本知识,可参考此大佬的博客: https://blog.csdn.net/as480133937/article/details/98845509 首先是选择系统时钟的来源,可以是HSI, ...

最新文章

  1. HLR、VLR及AUC三网元概述
  2. 如何才能使用内存小或者显存小的设备训练神经网络
  3. Android之自定义瀑布流式的标签列表
  4. angular路由笔记_Angular2学习笔记——路由器模型(Router)
  5. powerbi python词云图_使用Power BI制作可爱的词云图
  6. SAP HR人力资源管理
  7. STM8S103 LCD5110例程带字库
  8. html网页特效代码笔记,一个js实现的网页鼠标点击特效代码
  9. 树莓派安装基地Debian-Pi-Aarch64系统 SSD启动
  10. 电压比较器的介绍和工作原理
  11. wgs84坐标系拾取工具_百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具...
  12. CISSP考试回忆录 | 考试契机、曲折备考、考试现场回顾
  13. 小学-综合素质【3】
  14. 大数据工具千千万,到底谁才是最强王者?
  15. 用IntelliJ IDEA开发Python
  16. 2019年丰巢科技Java面试题
  17. 高校微信小程序开发心得
  18. Implement a customized pin code input control
  19. 实在智能RPA@你:再赢双12,店铺转化率靠这些
  20. 仙之侠道2玖章各个任务详情_仙之侠道2玖章任务地点 | 手游网游页游攻略大全...

热门文章

  1. 网页获取到的图片bease64编码,转化为二进制,进而保存为图片
  2. sketch插件 android,30个值得拥有的sketch插件(4)完结篇
  3. 双排桩弯矩Matlab求解程序,考虑开挖过程椅式双排桩内力及变形分析
  4. 脑子笨的人可以学计算机吗,学理科吃力,我真的很笨吗
  5. [1][python基础]条件判断[4]
  6. 四、redi性能测试、协议、事务
  7. 【余压监控系统】实时性、数字化、智能化,自动化,连续动态监控
  8. 周总结20170925学习C,接触GMM和ML
  9. Policy Center > Permissions and APIs that Access Sensitive Information
  10. linux qt 找不到 lgl,Linux Qt cannot find -lGL错误完美解决方案(亲测有效)