打印
[应用相关]

STM32系统时钟配置

[复制链接]
1316|41
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
学习系统时钟之前先问大家一个问题?

这是一个跑马灯的程序,为什么我们没有在主函数中配置系统时钟,却可以正常的执行流水灯代码呢?

使用特权

评论回复
评论
hehhehee 2023-7-23 13:10 回复TA
———————————————— 版权声明:本文为CSDN博主「果果小师弟」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_39400113/article/details/105058085 
沙发
hehhehee|  楼主 | 2023-7-23 13:10 | 只看该作者
我想大多数人都会说,已经配置了系统时钟,不需要在主函数中调用了。如果你回答不上来或者不清楚系统时钟是怎样配置的就好好看下文了。至此引出系统时钟的概念。

所有数字计算机系统都是由某种形式的震荡时钟电路驱动的。这种电路被称为系统的“脉搏”,是系统正确运行的关键。如果振荡器失灵,系统将完全无法运行,如果振荡器运行不规律,系统执行的所有时间有关的计算都会有误差。

所有微控制器的启动流程都不通用。由于硬件的复杂性,必须运行一段由厂家定义的短小的“复位程序”来使硬件处于一种正确的状态,然后再开始执行用户程序。运行这个复位程序需要时间并且要求微控制器的振荡器已经运行。

当系统由可靠的电源供电时,一旦通电,电源迅速地达到额定输出电压,一旦关电,电源迅速地下降到 0V,并且在接通的时候,电压不会降低。这时能够可靠地使用基于一个电容和一个电阻的低成本硬件复位。这种形式的复位电路称为阻容复位。如果电源不够可靠,而涉及安全性,这种简单的阻容解决方案就不合适了。

使用特权

评论回复
板凳
hehhehee|  楼主 | 2023-7-23 13:11 | 只看该作者
我这里以STM32F429为例,其他的芯片的原理都是一样的。

STM32F429主板上有两个无源晶振。第一个是主晶振,频率为8MHz,经过内部PLL倍频到168MHz,作为CPU内核的时钟使用。第二个晶振频率为32.768kHz,用于内部RTC电路。第二个晶振不是必须的,当需要使用STM32内部RTC时钟功能时才需要安装32.768k晶振。
CPU的内核时钟可以高达180MHz,但并不是说我们就必须要设置为最高180MHZ。你可以设置为小于等于180MHZ都可以。但是CPU内部的外设,比如ADC,GPIO,部分TIM是达不到这么高的速度的。CPU的时钟管理电路有好几个分频器,不同速度的外设给定不同的时钟。
主时钟选择的是HSE高速外部时钟。

使用特权

评论回复
地板
hehhehee|  楼主 | 2023-7-23 13:11 | 只看该作者
系统时钟 SYSCLK =PLLCLK= 168MHz
AHB总线时钟HCLK = SYSCLK=168MHz
APB1外设时钟PCLK1 = HCLK /4=42MHz
APB2外设时钟PCLK2 = HCLK /2=84MHz

使用特权

评论回复
5
hehhehee|  楼主 | 2023-7-23 13:11 | 只看该作者
时钟树单纯讲理论的话会比较枯燥,如果选取一条主线,并辅以代码,先主后次讲解的话会很容易,而且**还更深刻。我们这里选取库函数时钟系统时钟函数:SetSysClock();这个函数在system_stm32f4xx.c中,以这个函数的编写流程来讲解时钟树,这个函数也是我们用库的时候默认的系统时钟设置函数。该函数的功能是利用HSE把时钟设置为:

系统时钟 SYSCLK =PLLCLK= 168MHz
AHB总线时钟HCLK = SYSCLK=168MHz
APB1外设时钟PCLK1 = HCLK /4=42MHz
APB2外设时钟PCLK2 = HCLK /2=84MHz

使用特权

评论回复
6
hehhehee|  楼主 | 2023-7-23 13:11 | 只看该作者
有人会问F4不是主频180MHZ,APB1=90MHZ,APB2=180MHZ吗?确实你看到的大部分程序中F4都是这样配置的,但是并不代表必须这样配置,你可以想配置多少就是多少。只要不超多系统最高时钟的限制180MHZ。当然又会有人说了,不是可以超频吗?是可以超频但是99%都不会超频。

使用特权

评论回复
7
hehhehee|  楼主 | 2023-7-23 13:12 | 只看该作者
下面我们来看时钟树:

使用特权

评论回复
8
hehhehee|  楼主 | 2023-7-23 13:12 | 只看该作者
在 STM32F429 中,有 5 个最重要的时钟源,按照上图的顺序为LSI、LSE、 HSE、HSL、PLL。H开头的是高速时钟、L开头的是低速时钟。其中 PLL分为三个时钟源,分别为主 PLL 和 I2S 部分专用 PLLI2S 和 SAI 部分专用 PLLSAI。其中 HSE 和 LSE 是外部时钟源就是从外部通过接晶振的方式获取时钟源(就是需要外界晶振),其他的是内部时钟源(不需要外接晶振)。下面我们看看 STM32F429 的这 5 个时钟源,我们讲解顺序是按图中红圈标示的顺序:

使用特权

评论回复
9
hehhehee|  楼主 | 2023-7-23 13:12 | 只看该作者
①LSI 是低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。
②LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。
③HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。当使用有源晶振时,时钟从 OSC_IN 引脚进入,OSC_OUT 引脚悬空,当选用无源晶振时,时钟从 OSC_IN 和 OSC_OUT进入,并且要配谐振电容。HSE 我们使用 8M的无源晶振。如果我们使用 HSE或者 HSE经过 PLL倍频之后的时钟作为系统时钟 SYSCLK。野火和正点原子的F429开发板接的是 25M 的晶振。安富莱的开发板是8M外接晶振。HSE 也可以直接做为系统时钟或者 PLL 输入。————————————————

使用特权

评论回复
10
hehhehee|  楼主 | 2023-7-23 13:13 | 只看该作者
④HSI 是高速内部时钟,RC 振荡器,频率为 16MHz。可以直接作为系统时钟或者用作 PLL输入。
⑤PLL 为锁相环倍频输出。STM32F4 有三个 PLL:
主 PLL(PLL)由 HSE 或者 HSI 提供时钟信号,并具有两个不同的输出时钟。
第一个专用 PLL(PLLI2S)用于生成精确时钟,在 I2S 和 SAI1 上实现高品质音频性能。(很少用先不看)

使用特权

评论回复
11
hehhehee|  楼主 | 2023-7-23 13:13 | 只看该作者
第二个专用 PLL(PLLSAI)同样用于生成精确时钟,用于 SAI1 输入时钟。(很少用先不看)
这里我们着重看看主 PLL 时钟第一个高速时钟输出 PLLP 的计算方法。是主 PLL 的时钟图。

使用特权

评论回复
12
hehhehee|  楼主 | 2023-7-23 13:13 | 只看该作者

使用特权

评论回复
13
hehhehee|  楼主 | 2023-7-23 13:13 | 只看该作者
主 PLL 时钟的时钟源要先经过一个分频系数为 M 的分频器,然后经过倍频系数为 N 的倍频器出来之后还需要经过一个分频系数为 P(第一个输出 PLLP)或者 Q(第二个输出 PLLQ)的分频器分频之后,最后才生成最终的主 PLL 时钟。例如我们的外部晶振选择 8MHz。同时我们设置相应的分频器 M=8,倍频器倍频系数 N=336,分频器分频系数 P=2,那么主 PLL 生成的第一个输出高速时钟 PLLP 为:8MHZ/8*336/2=168

使用特权

评论回复
14
hehhehee|  楼主 | 2023-7-23 13:13 | 只看该作者
PLL=8MHz * N/ (M*P)=8MHz* 336 /(8*2) = 168MHz

使用特权

评论回复
15
hehhehee|  楼主 | 2023-7-23 13:14 | 只看该作者
如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为 168MHz。
看下面的程序也是这样的,说明计算无误。







助记:因为2大于1,随所以APB2外设时钟也一定要大于APB2外设时钟、

使用特权

评论回复
16
hehhehee|  楼主 | 2023-7-23 13:15 | 只看该作者
具体的实现请看下图:



单纯地讲解系统的时钟框图的,请看具体的数据手册,我们这里只是简单的介绍这个系统时钟是怎么来的。比如告诉你,我现在的外接晶振是25M。但是我想要配置成系统时钟是180MHZ的你会吗?你会自己去配置吗?

使用特权

评论回复
17
hehhehee|  楼主 | 2023-7-23 13:16 | 只看该作者
看到这里我想你已经会配置了。比如我这设置PLL_M=25,PLL_N=360,PLL_P=2。那么我的系统时钟SYSCLK就是:
 PLL=25MHz * N/ (M*P)=25MHz* 330 /(25*2) = 180MHz。

使用特权

评论回复
18
hehhehee|  楼主 | 2023-7-23 13:16 | 只看该作者
如果我们选择HSE为PLL时钟源,同时SYSCLK时钟源为PLL,那么SYSCLK时钟为 180MHz。

HCLK=SYSCLK=PLLCLK=180M,只需要设置AHB Prescaler分频因子为1就可以了。
PCLK1=HCLK/2=90M,只需要设置AHB1 Prescaler分频因子为2就可以了。
PCLK2=HCLK=180M。只需要设置AHB2 Prescaler分频因子为1就可以了。

使用特权

评论回复
19
hehhehee|  楼主 | 2023-7-23 13:16 | 只看该作者
代码分析
至此我们已经大概的了解到了系统时钟是怎么一回事。现在我们来分析具体的代码。不然值分析没代码,学起来效果不好。

还记得我在前面我提到的问题吗?

其实在按下单片机上面的复位按键之后。根据我么上一篇文章说的。系统会这些首先执行启动代码的里面的程序。

使用特权

评论回复
20
hehhehee|  楼主 | 2023-7-23 13:16 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

934

帖子

0

粉丝