006 - STM32学习笔记 - RCC时钟树

news/2025/4/1 14:12:06/

006 - STM32学习笔记 - RCC时钟树

本节内容一定要结合RCC时钟树和官方手册学习,如果看不明白的话,建议看一下野火官方的教程,火哥讲这节讲的很详细,看一遍基本就能理解了。

上节内容中分析了启动代码,在启动代码中看到开发板上电后,会先执行Reset_Handler复位程序,里面会调用SystemInit程序

; Reset handler
Reset_Handler    PROCEXPORT  Reset_Handler             [WEAK]IMPORT  SystemInitIMPORT  __mainLDR     R0, =SystemInit				;此处调用了SystemInit,此函数的实现实在system_stm32f4xx.c中BLX     R0LDR     R0, =__mainBX      R0ENDP

SystemInit函数原型


void SystemInit(void)
{#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */#endif/* 设置RCC_CR中HSION位,即启用HSI时钟*/RCC->CR |= (uint32_t)0x00000001;/* 复位CFGR寄存器*/RCC->CFGR = 0x00000000;/* 复位RCC_CR中HSEON、CSSON、PLLON位,在后面会用SetSysClock在重新设置*/RCC->CR &= (uint32_t)0xFEF6FFFF;/* 复位锁相环时钟配置器*/RCC->PLLCFGR = 0x24003010;/* 复位HSE旁路时钟 */RCC->CR &= (uint32_t)0xFFFBFFFF;/* 关闭所有中断 */RCC->CIR = 0x00000000;#if defined(DATA_IN_ExtSRAM) || defined(DATA_IN_ExtSDRAM)SystemInit_ExtMemCtl(); #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */       /* 配置系统时钟,锁相环时钟及分频因子,AHB/APBx预分频及Flash设置 */SetSysClock();		//着重看这个函数实现,代码太长,这个函数原型就不往这贴了,下节会再把这个函数原型的学习笔记贴上来/* 配置向量表*/#ifdef VECT_TAB_SRAMSCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */#elseSCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */#endif
}

在这里插入图片描述

stm32时钟树

1、HSE时钟

HSE:High Speed External Clock Signal,外部高速时钟。一般来源为有源晶振或无源晶振,其中有源晶振频率可以达到1-50M,而无源晶振频率在4-26M之间。在429芯片上,通过OSC_OUT和OSC_IN两个引脚输入。我用的野火F429开发板使用的是无源晶振(25MHz),启用HSE需要在RCC时钟控制器(RCC_CR)中将HSE_ON置位,如果此位未写1,则系统默认启动HSI时钟

2、HSI时钟

HSI:High Speed Internal Clock Signal,内部高速时钟,当设置使用HSE后,如果HSE发生故障没有起振,系统会自动切换到HSI,等到HSE启动成功后,则会切换回HSE,429的HSI是集成到芯片内部,频率为16HHz。启用HSI需要在RCC时钟控制器(RCC_CR)中将HSI_ON置位(未选择启用HSE或者HSE故障时,系统会强制启动,所以实际此位不用操作)。
在这里插入图片描述

3、PLL锁相环

不论是HSE还是HSI时钟,作为系统时钟来说远远不够,而外部晶振频率越高,其功耗也会增加,且误差也会增大,因此需要经过一系列操作,将HSE或HSI经过分频因子M分频后,在通过倍频因子N,之后在经过分频因子P,最后计算出锁相环时钟PLLCLK。
P L L C L K = ( H S E / M ) ∗ N / P PLLCLK = ( HSE / M ) * N / P PLLCLK=(HSE/M)N/P
在这里插入图片描述
锁相环通过RCC_PLLCFGR中PLLSRC寄存器进行配置,写0:选择HSI时钟作为PLL和PLLI2S时钟输入,写1:选择HSE振荡器作为PLL和PLLI2S时钟输入。
在这里插入图片描述

M:主PLL和PLLI2S输入时钟分频系数,通过PLLM寄存器进行配置,可选配置数值可以从2-63;

在这里插入图片描述

这里需要注意在官方手册中,关于M的配置中有提示项,建议将VCO输入控制在1M-2M之间,因此此处M我们设置在选择为25,计算后25M/25 = 1MHz;

N:用于控制VCO的主PLL的倍频系数,通过PLLN寄存器配置,可选配置数值为2-432

在这里插入图片描述

这里官方提示VCO输出频率应该介于192-432MHz之间,后续计算方便,选择配置为360。

P:主系统时钟的主PLL分频系数
在这里插入图片描述

官方提示最终输出频率上限不能超过180MHz,因此这里选择分频因子p的值为2。

在以上数据选择完后,经过计算,最终PLLCLK的值为180MHz。
P L L C L K = 25 / 25 ∗ / 360 / 2 = 180 M H z PLLCLK = 25 / 25 * / 360 / 2 = 180MHz PLLCLK=25/25/360/2=180MHz

4、系统时钟

在这里插入图片描述

SYSCLK,在429中,系统时钟最高为180MHz,F407最高为168MHz,其来源主要由HSI、HSE以及PLLCLK提供,当HSE以及PLLCLK发生故障时,硬件强制会自动强制使用HSI为SYSCLK提供时钟,此时系统运行将特别慢。此项选择由RCC时钟配置寄存器RCC_CFGR中SW位1:0选择可选配置如下:

  • 00:选择由HSI振荡器作为系统时钟;

  • 01:选择由HSE振荡器作为系统时钟;

  • 10:选择由PLL作为i系统时钟

  • 11:不选择。

    这里由于配置了锁相环(PLLCLK),则选择配置为10。

在这里插入图片描述

HCLK时钟

HCLK:AHB高速总线时钟,在F429中频率最高为180MHz,其主要为AHB总线外设、系统定时器(Systick)、内核(FCLK)提供时钟。可配置为不分频/2/4/8/16/64/128/258/512分频。

在这里插入图片描述

PCLK1时钟

APB低速预分频器,最高为45MHz,主要为APB1总线外设提供时钟,2倍频后为APB1总线的定时器提供时钟,最大可达到90MHz。由RCC_CFGR时钟配置寄存器PPRE1位控制。可配置为不分频/2/4/8/16分频。

在这里插入图片描述

PCLK2时钟

APB高速预分频器,最高为90MHz,主要为APB2总线外设提供时钟,2倍频后为APB1总线的定时器提供时钟,最大可达到180MHz。由RCC_CFGR时钟配置寄存器PPRE2位控制。可配置为不分频/2/4/8/16分频。

在这里插入图片描述

在时钟树中,看到除了P之外,还有两个分频因子Q和R,其中Q主要为PLL48CK提供时钟,主要用于全速USB和随机数发生器以及SDIO提供时钟。

而R主要是在F446芯片中使用到,这里不做说明。

5、其他时钟

RTC时钟

RTC:为芯片内部的RTC提供时钟,来源于HSE_RTC(HSE分频得到)、LSE(外部32.768KHz晶振提供)、LSI(32KHz),由RCC备份域控制寄存器RCC_BDCR:RTCSEL位控制。

在这里插入图片描述

后面学到的看门狗时钟IWDGCLK就是由LSI提供的。

I2S时钟

由外部引脚I2S_CKIN或者PLLI2SCLK提供。

以太网PHY时钟

F429中没有集成PHY,所以只能外接PHY,野火F429上外接的是LAN8720,大小为50MHz。这里研究了一下野火的原理图,看到PHY芯片是由一个外部25MHz的晶振提供时钟,进入PHY芯片后,经过2倍频变为50HMz,在经过PA1引脚输入429中。

USB PHY时钟

同样429中没有集成PHY,野火上外接的是USB33000,USB PHY就由USB33000提供。

MCO时钟输出

MCO是将控制器的时钟通过外部的引脚输出,可以给外部设备提供时钟,在429上引脚为MCO1为PA8,由HSI、LSE、HSE、PLLCLK提供,MCO2为PC9,由HSE、PLLCLK、SYSCLK、PLLI2SCLK提供。这里可以通过MCO输出时钟到PHY芯片,可以省掉PHY所需的晶振,节约成本。软件中设置MCO输出后,可用示波器检测系统时钟是否配置正确。


http://www.ppmy.cn/news/85452.html

相关文章

【工作记录】基于docker-compose快速部署springboot应用的实践

前言 毋庸置疑&#xff0c;容器化部署已经是近两年的大趋势了。 本文介绍基于docker-compose快速实现springboot单体应用的容器化部署操作实践&#xff0c;应用使用开源的可视化爬虫spiderflow。 当然也可以通过其他方式可以完成部署&#xff0c;本文也只是提供一种思路。 …

保姆级教程:手把手教你拿下雅思写作7分

在留学路上&#xff0c;雅思考试是绕不开的一道坎。然而&#xff0c;众所周知&#xff0c;雅思学习热度高&#xff0c;学习难度大&#xff0c;而且很多人找不到合适的学习方法。在这里&#xff0c;我们以雅思写作中的大作文为例&#xff0c;从大作文的结构拆解、学习的任务拆分…

【杂记】平方和公式及其证明

根据等差数列求和公式&#xff0c;我们知道 ∑ i 1 n i n ( n − 1 ) 2 \sum\limits_{i1}^n i\dfrac {n(n-1)}{2} i1∑n​i2n(n−1)​。那么 ∑ i 1 n i 2 \sum\limits_{i1}^ni^2 i1∑n​i2 的公式是什么呢&#xff1f; 平方和公式&#xff1a; ∑ i 1 n i 2 n ( n 1 …

每位软件测试工程师都应了解的风险管理知识

软件测试是软件开发的重要组成部分&#xff0c;软件测试需要的不仅仅是发现和修复默认设置&#xff0c;还需要识别和管理风险&#xff0c;由此&#xff0c;在整个测试计划阶段制定风险管理计划至关重要。 软件测试风险管理计划的要点 在软件测试中&#xff0c;风险管理是发现、…

字节8年测试经验,从功能测试到自动化测试,我整理了这一份2000字进阶学习指南

随着软件行业的不断发展&#xff0c;软件测试技术也在不断地更新&#xff0c;出现了众多的自动化功能测试工具&#xff0c;如HP的Quick Test Professional&#xff08;最新版本名为UFT&#xff09;及开源的Selenium。性能测试工具如LoadRunner、JMeter等。 所谓自动化测试&…

C++中stack的用法(超详细,入门必看)

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;CSTL 前言&#xff1a;Hello各位小伙伴们好&#xff01;欢迎来到本专栏CSTL的学习&#xff0c;本专栏旨在帮助大家了解…

1.java高级之文件和Io流

1.什么是流 java程序到系统文件的通道(以java程序为参照物)java<--input--文件-output-->如果以文件为参照物java--input-->文件<--output--2.File类 文件/目录 //定义文件夹 File pathnew File("E:\\data"); \\(用于文件夹) 要区分于\,\是通常用在\n \…

安科瑞电力监控系统和五防系统在锡林郭勒项目的应用

摘要&#xff1a;随着电力、计算机、信息和网络等技术的不断发展&#xff0c;推动了电力监控的快速发展&#xff0c;人们对电力系统运行的安全性以及稳定性的要求越来越高。本文针对锡林郭勒供配电系统特点及供配电系统高可靠性的要求&#xff0c;提出了保护类、监测类和防误闭…