首页 > 其他分享 >STM32时钟详解(基于STM32F429)

STM32时钟详解(基于STM32F429)

时间:2024-07-10 14:56:55浏览次数:19  
标签:分频 系数 HSE 时钟 STM32 详解 PLL STM32F429 RCC

目录

前言

一、时钟源组成

二、时钟树

三、时钟代码分析


前言

STM32的时钟就像是这个微控制器(MCU)的“心跳”或者“节拍器”。它决定了STM32内部各个部分(比如CPU、GPIO端口、串口通信等)的运行速度和时序。想象一下,如果你有一个机器人在做动作,时钟就是控制它每一步动作的速度和时间点的。如果时钟快了,机器人的动作就会加速;如果时钟慢了,机器人的动作就会变慢。同样地,在STM32中,如果时钟频率设置得高,MCU就会运行得更快,能够更快地处理数据;如果时钟频率设置得低,MCU就会运行得慢一些。

一、时钟源组成

1. HSI(高速内部时钟):一个内部RC(Resistor-Capacitor)振荡器,其频率为16MHz。HSI可以直接作为系统时钟或者用作PLL(锁相环)的输入。

2. HSE(高速外部时钟):一个外部时钟源,可以接石英/陶瓷谐振器或外部时钟源,频率范围为4MHz到26MHz。HSE也可以直接作为系统时钟或PLL的输入。

3. LSI(低速内部时钟):一个内部RC振荡器,频率为32kHz左右,主要用于独立看门狗和自动唤醒单元。

4. LSE(低速外部时钟):一个外部时钟源,通常接频率为32.768kHz的石英晶体,主要用于RTC(实时时钟)的时钟源。

5. PLL(锁相环):PLL实际分为三个时钟源,包括主PLL和专用的PLLI2S、PLLSAI。PLL用于倍频输入时钟信号,以产生更高的时钟频率。

(1)主PLL(PLL):由HSE或HSI提供时钟信号,并有两个不同的输出时钟。第一个输出PLLP用于生成高速的系统时钟(最高180MHz),第二个输出PLLQ为48MHz时钟,用于USB OTG FS时钟、随机数发生器的时钟和SDIO时钟。

(2)PLLI2S(专用PLL):用于生成精确时钟,在I2S和SAI1上实现高品质音频性能。

(3)PLLSAI(专用PLL):同样用于生成精确时钟,用于SAI1输入时钟,并为LCD_TFT接口提供精确时钟。

二、时钟树

由上图所示,①②③④⑤分别代表着stm32f429的五个时钟源,其频率和描述在上面我们都讲过了,所以不再赘述,下面带*为常用时钟。

A* 这是独立看门狗的时钟,实际时钟是一个 15~47kHz之间不精确的时钟,因为看门狗不需要那么高的精度,所以并不影响使用,我们将其默认为32kHz。

B* 这是RTC的输入时钟,RTC 的时钟源可以选择 LSI,LSE,以及HSE 分频后的时钟,HSE 分频系数为 2~31,一般我们默认使用LSE。

C* 在STM32F429中,MCO用来输出时钟,MCO1是一个特定的引脚(如PA8),它有四个时钟来源分别为:HSI,LSE,HSE 和 PLL 时钟,MCO2也是一个特定的引脚(如PA9),它同样有四个时钟来源分别为:HSE,PLL,SYSCLK 以及 PLLI2S时钟。

D* 这是系统时钟,可来源于HSI、HSE、PLL这三个时钟源其中之一,我们默认一般用PLL作为系统时钟的默认时钟源。

E* 这里指的是以太网PTP时钟、AHB 总线时钟,APB2 高速时钟,APB1 低速时钟,其中PTP时钟与系统时钟相同,AHB时钟、APB2时钟、APB1时钟是经过 SYSCLK 时钟分频得到的,AHB时钟最大为180MHz,APB2最大是90MHz,APB1最大是45MHz。

 这里是指 PLLI2S_R 时钟,可以作为 I2S 时钟源。

G  这里是指 PLLI2S_Q 时钟,可以作为 SAI1_A 和 SAI1_B 时钟来源。

H  这里是指 PLLSAI_Q 时钟,可以作为 SAI1_A 和 SAI1_B 时钟来源。

I  这里是指 PLLSAI_R 时钟,是 LCD-TFT(LTDC)接口时钟唯一来源。

J  这里是 I2S 的时钟,通过寄存器 I2SSRC 设置内部 PLLI2SCLK 还是外部 I2SCKIN作为时钟。

K  这里是 SAI1_A 的时钟,通过寄存器 SAI1ASRC 选择内部 PLLSAI_Q、PLLI2S_Q
还是外部 I2SCKIN 作为时钟。

L  这里是 SAI1_B 接口的时钟,通过寄存器 SAI1BSRC 选择内部 PLLSAI_Q、
PLLI2S_Q 还是外部 I2SCKIN 作为时钟。阿波罗没用到 SAI1_B 输出,所以这里
不用设置。

M  这里是 LTDC 接口的时钟,LTDC 的时钟,固定为 PLLSAI_R。

N  这是 STM32F4 内部以太网 MAC 时钟的来源。对于 MII 接口来说,必须向外部
PHY 芯片提供 25Mhz 的时钟,这个时钟,可以由 PHY 芯片外接晶振,或者使用
STM32F4 的 MCO 输出来提供。然后,PHY 芯片再给 STM32F4 提供ETH_MII_TX_CLK 和 ETH_MII_RX_CLK 时钟。对于 RMII 接口来说,外部必须提供 50Mhz 的时钟驱动 PHY 和 STM32F4 的 ETH_RMII_REF_CLK,这个 50Mhz时钟可以来自 PHY、有源晶振或者  MCO。

O  这里是指外部 PHY 提供的 USB_OTG_HS(60MHZ)时钟。

APB1与APB2根据时钟速率不同,主要连接以下外设:

APB1(低速外设总线)

  • 电源接口
  • 备份接口
  • CAN(控制器局域网)
  • USB
  • I2C1和I2C2(双向串行接口)
  • UART2和UART3(通用异步收发器)
  • SPI2(串行外设接口)
  • 窗口看门狗
  • Timer2、Timer3和Timer4(定时器)

APB2(高速外设总线)

  • GPIO_A到GPIO_E(通用输入/输出端口)
  • USART1(通用同步/异步收发器)
  • ADC1、ADC2和ADC3(模数转换器)
  • TIM1和TIM8(高级定时器)
  • SPI1(串行外设接口)

三、时钟代码分析

void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
{
    HAL_StatusTypeDef ret = HAL_OK;
    RCC_OscInitTypeDef RCC_OscInitStructure; 
    RCC_ClkInitTypeDef RCC_ClkInitStructure;
    
    __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟
    
    //下面这个设置用来设置调压器输出电压级别,以便在器件未以最大频率工作
    //时使性能与功耗实现平衡,此功能只有STM32F42xx和STM32F43xx器件有,
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);//设置调压器输出电压级别1
    
    RCC_OscInitStructure.OscillatorType=RCC_OSCILLATORTYPE_HSE;    //时钟源为HSE
    RCC_OscInitStructure.HSEState=RCC_HSE_ON;                      //打开HSE
    RCC_OscInitStructure.PLL.PLLState=RCC_PLL_ON;//打开PLL
    RCC_OscInitStructure.PLL.PLLSource=RCC_PLLSOURCE_HSE;//PLL时钟源选择HSE
    RCC_OscInitStructure.PLL.PLLM=pllm; //主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
    RCC_OscInitStructure.PLL.PLLN=plln; //主PLL倍频系数(PLL倍频),取值范围:64~432.  
    RCC_OscInitStructure.PLL.PLLP=pllp; //系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
    RCC_OscInitStructure.PLL.PLLQ=pllq; //USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
    ret=HAL_RCC_OscConfig(&RCC_OscInitStructure);//初始化
	
    if(ret!=HAL_OK) while(1);
    
    ret=HAL_PWREx_EnableOverDrive(); //开启Over-Driver功能
    if(ret!=HAL_OK) while(1);
    
    //选中PLL作为系统时钟源并且配置HCLK,PCLK1和PCLK2
    RCC_ClkInitStructure.ClockType=(RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStructure.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK;//设置系统时钟时钟源为PLL
    RCC_ClkInitStructure.AHBCLKDivider=RCC_SYSCLK_DIV1;//AHB分频系数为1
    RCC_ClkInitStructure.APB1CLKDivider=RCC_HCLK_DIV4; //APB1分频系数为4
    RCC_ClkInitStructure.APB2CLKDivider=RCC_HCLK_DIV2; //APB2分频系数为2
    ret=HAL_RCC_ClockConfig(&RCC_ClkInitStructure,FLASH_LATENCY_5);//同时设置FLASH延时周期为5WS,也就是6个CPU周期。
		
    if(ret!=HAL_OK) while(1);
}

plln是主 PLL 倍频系数(PLL 倍频),取值范围:64~432。

pllm是主 PLL 和音频 PLL 分频系数(PLL 之前的分频),取值范围:2~63。

pllp是系统时钟的主 PLL 分频系数(PLL 之后的分频),取值范围:2,4,6,8。

pllq是USB/SDIO/随机数产生器等的主 PLL 分频系数(PLL 之后的分频),取值范围:2~15。

本函数我们传参,plln=360,pllm=25,pllp=2,pllq=8。

我们选择了,HSE外部晶振作为我们系统的基础时钟源,HSE的时钟频率为25MHz,所以系统时钟为25*360/25/2=180MHz。AHB分频系数是1,所以AHB时钟也是180MHz。APB1的分频系数是4,所以APB1的时钟是45MHz。APB2的分频系数是2,所以APB2的时钟是90MHz。

标签:分频,系数,HSE,时钟,STM32,详解,PLL,STM32F429,RCC
From: https://blog.csdn.net/qq_38072731/article/details/140266702

相关文章

  • Nuxt框架中内置组件详解及使用指南(五)
    title:Nuxt框架中内置组件详解及使用指南(五)date:2024/7/10updated:2024/7/10author:cmdragonexcerpt:摘要:本文详细介绍了Nuxt框架中和组件的使用方法与配置,包括安装、基本用法、属性详解、示例代码以及高级功能如事件处理、自定义图片属性和图片格式回退策略。同时,还......
  • STM32系统嘀嗒Systick定时器
    目录STM32系统嘀嗒Systick定时器基本概念基本应用时钟分析时钟选择(1) 内部时钟(2) 外部时钟原理分析控制方式STM32系统嘀嗒Systick定时器基本概念定时器是STM32中常用的外设,一般定时器的基本功能就是定时,而在CortexM3/M4内核中也包含一个简单的定时器,就是系统嘀嗒定时器(Sy......
  • 基于STM32的气体检测系统--有上位机小程序
            毕设搞完了,来分享一下,第一次搞,多包涵!设计要求:        技术要求:1、原始数据:采集的气体浓度数据,包括CO2、可燃气体、有毒气体等;系统运行时的各种状态数据。2、选择合适的气体传感器,并进行性能测试和评估;设计稳定且精确的模拟信号采集电路;嵌入式程......
  • stm32时钟源
    stm32时钟源目录stm32时钟源MCU提供5种时钟源(1) HSE高速外部时钟(2) HSI高速内部时钟(3) LSE低速外部时钟(4) LSI低速内部时钟(5) PLL倍频锁相环定时器是挂载在总线下,而不同的总线的频率是不同的,而总线的频率是由时钟提供,而时钟的提供者又各不相同,所以必须要提前了解时钟源的......
  • 机器学习策略篇:详解如何使用来自不同分布的数据,进行训练和测试(Training and testing o
    如何使用来自不同分布的数据,进行训练和测试深度学习算法对训练数据的胃口很大,当收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的数据量更大,即使有些数据,甚至是大部分数据都来自和开发集、测试集不同的分布。......
  • 静态路由综合实验(详解)
    一、实验拓扑二、实验需求1.除了R5的环回地址固定5.5.5.0/24,其他网段基于192.168.1.0/24进行合理划分;2.R1-R4每个路由器存在两个环回接口,模拟PC,地址也在192.168.1.0/24网络内;3.R1-R4不能直接编写到达5.5.5.0/24的静态路由,但依然可以访问;4.全网可达,尽量减少每台路由器路......
  • 移植stm32库函数应对不同形式或者不同的时钟源
    移植stm32库函数应对不同形式或者不同的时钟源如果是stm32F407ZET6,晶振是8MHZ,时钟是168MHz修改system_stm32f4xx.c的316行,需要把PLL_M的值从25修改为8修改stm32f4xx.h的123行,需要把宏HSE_VALUE的值从25修改为8MCU主频的计算=(HSE_VALUE/PLL_M*PLL_N)/PL......
  • Java中的SpringAOP、代理模式、常用AspectJ注解详解
      这篇文章主要介绍了Java中的SpringAOP、代理模式、常用AspectJ注解详解,Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务,例如审计和事务管理进行内聚性的开发,需要的朋友可以参考下 +目录一、AOP简述回到主题,何为AOP?AOP即面向切面编......
  • 正则表达式详解
    1.正则表达式的作用(1)文本搜索和匹配:可以用来搜索、匹配和替换特定模式的文本。          比如,查找所有符合特定格式的邮箱地址、电话号码等。(2)数据验证:可以用来验证用户输入是否符合特定的格式要求。     比如,验证电子邮件地址、密码复杂度等。(3)数据......
  • each()详解
    each()方法能使DOM循环结构简洁,不容易出错。each()函数封装了十分强大的遍历功能,使用也很方便,它可以遍历一维数组、多维数组、DOM,JSON等等在javaScript开发过程中使用$each可以大大的减轻我们的工作量。下面提一下each的几种常用的用法each处理一维数组vararr1=["aaa",......