96SEO 2026-02-19 23:24 39
钟树框图LSI与LSEHSI、HSE与PLL系统时钟的产生举例AHB、APBx的时钟配置时钟树相关寄存器介绍1.时钟控制寄存器RCC_CR2.RCC

(RCC_CIR)修改系统时钟配置为内部时钟代码流程编程代码验证**使用NDK的Debug仿真查看STM32的系统频率的操作方式**总结前言
在之前的所有代码编程的过程中似乎每次都绕不开一个叫做时钟使能的东西当时我们是在数据手册上直接看其挂接在那条时钟线上的那么STM32内部的时钟到底是怎么一个构型呢本文来对此做一个介绍。
老规矩一个新的名词出现首先需要搞清楚它是个啥下图中对时钟树给出了定义STM32的时钟树是由多个时钟源和时钟分频组成的为STM32芯片提供各种时钟信号。
也就是说在使用STM32的时候所有的频率和时钟都是通过时钟树产生的。
在之前的嵌入式学习笔记——STM32硬件基础知识中的晶振电路部分提到过一嘴STM32的基础时钟源有4个HSI振荡器时钟
然后是上图中提到的PLL锁相环和SYSCLK系统时钟前面提到过此系列使用的STM32F407VE的主频是168Mhz这个主频对应的就是SYSCLK系统时钟而PLL锁相环就是这个系统时钟的直接来源。
在硬件篇介绍的时候我们知道外部晶振也就是外部高速时钟HSE的频率是25MHZ内部振荡电路对应内部高速时钟HSI的频率是16Mhz显然这两者都不能直接提供168MHZ的主频那么系统时钟的168Mhz是怎么来的呢
其实就是将HSI或者HSE接入PLL通过PLL倍频产生的具体的产生过程在后面的结构框图和寄存器介绍中描述。
大致了解了时钟树的构成后就可以来研究它的框图了这是一张很复杂的图还是按照之前的思路对其进行一个拆分把暂时不用的先排除此图的下方红框里面的是一个I2S的音频处理专用的时钟独立于其他的所有时钟所以暂时不看它绿框里面的是一个以太网的时钟也是独立于其他所有模块所以暂时也先不看最下面的橙色框里的USB2.0时钟也是这三个暂时都不需要看。
简化下半部分后如下图所示橙色框内的MCO1和MCO2使用来做测试脚的使用示波器进行测量测量频率是否正常的所以这部分暂时也可以不看进一步简化。
我们先来看上半部分的内部低速时钟LSI和外部低速时钟LSE根据框图可以发现紫色框的内部低速时钟频率为32KHZ有两个分支一个是为独立看门狗提供时钟另一个是为RTC提供时钟。
而绿色的框是外部低速时钟外接引脚OSC32_IN和OSC32_OUT就是接外部晶振的引脚进来的频率是32.768KHZ进来后只有一个走向就是为RTC提供时钟。
然后需要注意的是蓝色框的四选一数据选择器一共有三个输入前两个是上面的LSI和LSE还有一个来自下方的HSE中间经过了一个/2到31的分频器也就是说看门狗智能由内部低速时钟提供时钟RTC可以由LSI、LSE、或者是HSE经过分频后来提供时钟具体使用哪一个需要我们在代码里面配置。
丢掉了下面看完了上面删除了测试接口接下来就到了本文的重头戏了百分之90的片上外设的时钟都与这部分有关系。
首先看图中的系统时钟红色椭圆框可以放发现系统时钟也是通过一个选择器来选择的输入源有三个分别是来自橙色框的HSI内部高速时钟绿色框的HSE外部高速时钟以及蓝色框的PLL锁相环也就是说系统时钟可以有三个选择。
这里有一个问题上面也提到过系统时钟的直接来演应该选择哪一个输入
由于内部高速时钟和外部高速时钟都无法提供168Mhz的频率所以系统时钟的直接来源应该是PLLCLK也就是说在配置的时候需要将系统时钟选择到锁相环上。
那么问题来了PLLCLK又是怎么产生168Mhz的频率的呢我们放大这部分电路来做个解析
HSE会来到绿色框的选择器由我们编程控制具体选择HSI还是HSE经过选择器选择后会有一个分频器
举个栗子我们选择外部高速时钟作为锁相环的输入此时的外部时钟频率是8MHZ那么此处的分配就会采用8分频将频率分频为1Mhz输入方便后面的计算。
同样的如果板子上没有外接晶振只能选择内部高速时钟作为PLL的输入此时内部高速时钟的频率是16Mhz那么此处的分频系数就要配置为16总之就是将对应输入的频率在此处转化为1Mhz当然也可以是其他的值只是1Mhz方便计算而已。
再经过选择器和分频器后就正式进入了PLL锁相环了这里我们结合寄存器的描述来解析
首先1的位置就是VCO也就是经过分频后的1Mh频率在其正下方有一个xN这个xN是倍频的意思此处的xN是需要我们编程时进行控制的它的具体位置就是RCC
(RCC_PLLCFGR)的第6到14位但是其写入值不是随意的注意看下方的描述我们写入的数据必须是192-432之间的值
经过倍频后会来到3的位置这里有一个/P根据上面的经验这个肯定也是一个分频器那么它的配置有没有要求呢还是来看看寄存器的相关描述它是由RCC
(RCC_PLLCFGR)的第16和17位控制的注意最低分频也是2分频。
经过/P后就输出到SYSCLK的选择器了至于下面的4和5暂时我们没有用上所以这里不做介绍想要了解的自己去中文编程手册查看。
第一种选择外部时钟作为PLL的输入外部时钟是8MHZ主频是168MHZ那么有关PLL的配置流程应该是怎样的
{1.绿框选择器选择HSE作为输入2.橙框的分频系数设置为8分频输出1Mhz的信号到VCO3.配置2号位置的倍频系数系数要求是192-433由于后面还有个最低的2分频所以此处要配置为336168*24.配置3号位置分频器为00二分频这样就实现了一个168MHZ的系统频率
}第二种没有外部接晶振电路或者说板子的外接晶振电路挂逼了此时应该如何配置系统的时钟为200MHZ对于F407来说200MHZ的频率算超频如非特殊需求必要不建议这么操作会拉高功耗而且造成不稳定
{1.绿框选择器选择HSI作为输入2.橙框的分频系数设置为16分频输出1Mhz的信号到VCO内部高速时做的频率为16MHZ3.配置2号位置的倍频系数系数要求是192-433由于后面还有个最低的2分频所以此处要配置为400200*24.配置3号位置分频器为00二分频这样就实现了一个200MHZ的系统频率
上面一段主要是介绍了系统时钟的具体生成过程这个时钟框图还剩下最后一块就是我们前面配置时经常使用到的AHB、APB1、APB2这些。
如上图所示经左侧的选择器选择后最终的SYSCLK的频率是168MHZ紧接着往右就分成了两条路线一条向上直接是给到了以太网时钟这个暂时用不上可以暂时性忽略另一路则是来到了AHB下面有一个分频器意思是可以配置AHB分频为124816分频这个具体的我们也看一眼对应的寄存器描述其具体的控制是由RCC
然后再往后走又分成了两路这次先看下面的这一路可以看见首先来到了2位置的APBx的分频控制关于它的具体配置也是有对应的寄存器位的如下图其中APB1占RCC
然后还有对应的要求APB1不能超过42MHZAOB2不能超过84Mhz。
通过这个就可以为大多是外设提供所需的时钟了但是下面还有个框4里面是一个判断语句如果APBx是1分频则×1给到定时器如果APBx不是1分频则需要×2后再给到定时器。
最后还有一个遗留的就是经过AHB后向上去的那个最后是给内核提供时钟了还有个是经过8分频后位系统时钟提供时钟也就是下一篇会介绍的系统滴答SYS_Tick,这个到下一篇再说。
整个时钟相关的寄存器都在中文编程手册的第6.3章主要包括三大类1.时钟配置寄存器部分
这里重点是如何配置时钟所以需要使用到的是第一大类时钟配置相关的寄存器。
PLL的锁相环具备写保护在PLL锁相环运行状态的时候不能进行相关配置
这个寄存器在上面介绍PLL的流程的时候已经大致看过了其作用就是配置PLL的各项参数产生系统所需的168MHZ的频率。
功能配置PLL锁相环,注意配置过程中需要先操作上一个寄存器关闭锁相环
此位就是上面框图中的绿色选择框选择HSI或者是HSE作为PLL的输入。
此寄存器的主要作用就是对AHB、APB1、APB2等进行时钟配置也就是上面框图讲解的最后一部分的控制内容。
功能在上面各个配置过程中各类时钟准备就绪就会进入中断执行操作默认不操作在这里一般不需要执行中断。
所以这个寄存器基本上不操作的。
在搞清楚了框图以及对应的寄存器后就可以尝试配置一个时钟了这里实现这样一个需求使用HSI作为基础时钟源配置系统时钟200MhzAPB2为50MHZAPB1为25MHZ。
这类需求一般不常用但是一旦拿到的板子没有外接晶振或者说自己画的板子外接晶振挂了不工作就可以采用类似的操作将PLL时钟源选择为HSI进而为整个系统提供时钟源。
{打开HSI的时钟振荡器等待HSI准备就绪先切换系统时钟到HSI//由于系统运行过程中不能没有时钟而配置PLL又需要先将PLL关闭所以需要执行此操作现将系统时钟暂时切换到HSI。
等待系统时钟切换成功关闭锁相环选择锁相环需要的时钟源配置M分频配置N倍频配置P分频打开PLL锁相环等待PLL锁相环锁定系统时钟切换回PLL锁相环等待系统时钟准备就绪
Hsi.h/*******************************************
*********************************************/
|(10);//打开HSI的适中振荡器while(!(RCC-CR
~(30);//将系统时钟暂时切换至HSIwhile(RCC-CFGR
~(122);//PLL选择HSI为输入时钟源RCC-PLLCFGR
|(124);//打开锁相环while(!(RCC-PLLCFGR
(125)));//等待锁相环锁定//切换回PLL作为系统时钟RCC-CFGR
(11);//将系统时钟暂时切换回PLLwhile(!(RCC-CFGR
~(0xf4);//清零将AHB时钟设置为不分频200MHZRCC-CFGR
|(0x610);//将APB1的时钟设置为25MHZ8分频RCC-CFGR
|(0x513);//将APB2的时钟设置为50MHZ//4分频}//.H:
效果由于APB2的时钟变成了50MHZ所以一种检验方式如下图修改BRR内对应的频率为50MHZ然后编译下载串口助手可以正常打印就说明正常。
修改后的主频是200MHZAPB1的频率是25MHZAPB2的频率是50MHZ。
和对应的stm32f4xx_rcc.c到自己工程目录下并添加进工程使用库函数的同学可以直接在自己的库里面找将其添加进工程即可。
3.在main.h包含头文件“stm32f4xx_rcc.h”然后再main.c声明一个结构体变量
//声明一个结构体变量获取系统时钟状态4.在单次运行代码的位置添加
RCC_GetClocksFreq(Get_Rcc_Clock);
//仿真的时候就可以在结构体get_rcc_clock中看见各个外设的时钟了5.编译通过后点击Debug按钮来到如下界面在右下角底部找到“Call
Locals”选中然后点击2位置的全速运行等待3秒然后点击叛变的停止运行4对应的框会出现对应的频率。
此时频率还是16进制的数为了方便查看随便选择一个变量选中然后右键弹出2位置的16进制显示把这个复选框取消即可。
STM32F4获取并查看当前系统时钟频率——http://t.csdn.cn/E9ATa
STM32获取当前系统时钟——http://t.csdn.cn/uPwvO
此法是仿真的频率并不是实际采集的频率只是理论值实际最好还是采用上一种串口修改频率不乱码的方案来解决。
本文主要是介绍了STM32的是时钟树捋了一下时钟的配置流程文中如有不足还请指出。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback