、概述

对于系统时钟应该都知道它的作用,就是驱动整个芯片工作的心脏,如果没有了它,就等于人没有了心跳。

对于使用开发板学习的朋友来说,RCC系统时钟这一块知识估计没怎么去配置过,原因在于开发板提供的晶振基本上都是官方标准的时钟频率,使用官方的标准库,这样系统时钟就是默认的配置,也就是默认的频率。但对于自己设计开发板,或者想要改变系统时钟频率(如:降低功耗就需要降频)的朋友来说,配置系统时钟就有必要了。

关于时钟这一块对定时器(TIM、RTC、WDG等)相关的外设也比较重要,因为要求精准,就需要时钟频率精准。

该文将描述关于系统时钟配置及注意的相关事项,更多详情内容,请往下看。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

 

 

Ⅱ、关于时钟

1.时钟分类

STM32芯片(所有型号)的时钟包含4类:

HSE(High Speed External)高速外部时钟

HSI(High Speed Internal)高速内部时钟

LSE(Low  Speed External)低速外部时钟

LSI(Low  Speed Internal)低速内部时钟

 

2.时钟源

STM32芯片(所有型号)驱动系统时钟的时钟源:

HSI 内部高速时钟

HSE 外部高速时钟

PLLCLK倍频时钟

STM32具有以下两个次级时钟源:

32 kHz 低速内部 RC (LSI RC),该 RC 用于驱动独立看门狗,也可选择提供给 RTC 用于停机/待机模式下的自动唤醒。

32.768 kHz 低速外部晶振( LSE 晶振),用于驱动 RTC 时钟 (RTCCLK)。对于每个时钟源来说,在未使用时都可单独打开或者关闭,以降低功耗。

3.时钟树(框图)

关于STM32的时钟树针对不同系列芯片可能存在差异。F0、F1和F3系列芯片(主流芯片,频率相对较低)有很多相似的地方,F2和F4(高性能芯片)系列芯片有很多相似的地方。但是,F3芯片和F4芯片的时钟树之间却存在很大差异,具体请看参考手册RCC相关章节。

STM32时钟控制器为应用带来了高度的灵活性,用户在运行内核和外设时可选择使用外部晶振或者使用振荡器,既可采用最高的频率,也可为以太网、 USB OTG FS 以及 HS、 I2S 和 SDIO等需要特定时钟的外设保证合适的频率。

以F417芯片为例:可通过多个预分频器配置 AHB 频率、高速 APB (APB2) 和低速 APB (APB1)。 AHB 域的最大频率为 168 MHz。高速 APB2 域的最大允许频率为 84 MHz。低速 APB1 域的最大允许频率为 42 MHz。实际上输出的最大时钟可以适当提高一点,但为了保证在多种环境下,最好还是不要超过标准的最大值。

STM32F4xx 器件具有两个 PLL:

主 PLL (PLL) 由 HSE 或 HSI 振荡器提供时钟信号,并具有两个不同的输出时钟:

第一个输出用于生成高速系统时钟(最高达 168 MHz)

第二个输出用于生成 USB OTG FS 的时钟 (48 MHz)、随机数发生器的时钟

专用 PLL (PLLI2S) 用于生成精确时钟,从而在 I2S 接口实现高品质音频性能。

由于在 PLL 使能后主 PLL 配置参数便不可更改,所以建议先对 PLL 进行配置,然后再使能(选择 HSI 或 HSE 振荡器作为 PLL 时钟源,并配置分频系数 M、 N、 P 和 Q)。

PLLI2S 使用与 PLL 相同的输入时钟( PLLM[5:0] 和 PLLSRC 位为两个 PLL 所共用)。但是, PLLI2S 具有专门的使能/禁止和分频系数( N 和 R)配置位。在 PLLI2S 使能后,配置参数便不能更改。

Ⅲ、代码分析

以STM32F4x5、x7系列芯片为例来分析一下系统时钟的配置。

参考软件工程:

https://yunpan.cn/cRepWDShSK4yc  访问密码 65b1

1.倍频参数

结合上面时钟树和源代码可以看得出来,系统时钟PLLCLK的计算主要是配置PLL_M、PLL_N、PLL_P这三个参数,最后168M是通过分频、倍频得出来的。

2.验证时钟频率

对于STM32芯片来说,验证系统时钟最终运行多大的速度,最准确的验证方法的用示波器测试它的系统时钟。

这里描述一下怎样用示波器来测试系统时钟。其实很简单,就是在软件代码里面配置时钟输出(这里可以输出多种类型的时钟HSE、HSI、PLLCLK等),根据代码配置不同,相应输出的时钟就不同。请看源代码:

我提供的代码里面就有这一选项,将定义配置为1,就打开了这个功能。时钟输出的参数有两个,时钟源,分频值。注意:这里的最大输出时钟是100M,所以PLLCLK时钟分频之后才能输出,不然你用示波器检测不到波形(我测试过了)。

最后输出的波形如图:

、说明

关于STM32的开发,软件兼容性是很好的,不要觉得你的芯片和我总结的实例有差异就不看了,其实是错误的认识,特别是同一个系列的芯片基本上程序都兼容,也就是可以互相使用。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅴ、最后

关注微信,回复“更多内容”,将获得更多内容(如:UCOS实例等,不断更新中......)。

如果你喜欢我分享的内容,你又想了解更多相关内容,请关注文章开头的微信公众号,新内容持续更新中,后期将会有更多精彩内容出现。

STM32F4_RCC系统时钟配置及描述的更多相关文章

  1. STM32F4系统时钟配置及描述

    STM32F4系统时钟配置及描述 stm32f407时钟配置方法(感觉很好,分享一下) STM32F4_RCC系统时钟配置及描述 STM32F4时钟设置分析 stm32f4 - 时钟树分析配置

  2. 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...

  3. STM32F4时钟配置库函数详解

    在STM32中,所有的应用都是基于时钟,所以时钟的配置就尤为重要了,而不能仅仅只知道使用默认时钟. STM32F4的时钟树如上图所示,HSE为外部接入的一个8M的时钟,然后再给PLL提供输入时钟,经过 ...

  4. STM32之系统时钟

    转载:http://www.openedv.com/posts/list/302.htm 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是必要的,有助于深入理解STM32. ...

  5. STM32—时钟树(结合系统时钟函数理解)

    时钟树的概念: 我们可以把MCU的运行比作人体的运行一样,人最重要的是什么?是心跳! 心脏的周期性收缩将血液泵向身体各处.心脏对于人体好比时钟对于MCU,微控制器(MCU)的运行要靠周期性的时钟脉冲来 ...

  6. STM32F2系列系统时钟默认配置

    新到一家公司后,有个项目要用到STM32F207Vx单片机,找到网上的例子照猫画虎的写了几个例子,比如ADC,可是到了ADC多通道转换的时候就有点傻眼了,这里面的时钟跑的到底是多少M呢?单片机外挂的时 ...

  7. 使用HSI配置系统时钟

    这里我就直接粘代码了.很简单.上节理解了 这也就能简单了. void HSI_SetSysClk( uint32_t RCC_PLLMul_x ) { __IO uint32_t HSIStatus ...

  8. 使用HSE配置系统时钟并用MCO输出监测系统时钟

    使用模板,在User下新建文件夹RCC 新建bsp_rccclkconfig.h和bsp_rccclkconfig.c 工程和魔术棒添加 对照着上节的RCC源文件编写: void HSE_SetSys ...

  9. STM32F030 启用内部晶振并配置系统时钟为48M

    在文件 system_stm32f0xx.c 里的函数 static void SetSysClock(void) { if (HSEStatus == (uint32_t)0x01) // 存在外部 ...

随机推荐

  1. IOS键盘的相关设置(UITextfield)

    一.键盘风格 UIKit框架支持8种风格键盘. typedef enum { UIKeyboardTypeDefault,                // 默认键盘:支持所有字符 UIKeyboa ...

  2. jdk线程常见面试题

    请编写一个多线程程序,实现两个线程,其中一个线程完成对某个对象int成员变量的增加操作,即每次加1,另一个线程完成对该对象成员变量的减操作,即每次减1,同时要保证该变量的值不会小于0,不会大于1,该变 ...

  3. 解决 window server2008 r2 没有注册Ofiice组件的方法

    解决 window server2008  r2 没有注册Ofiice组件的方法   .NET下在用Microsoft.Office.Interop.Excel及word 操作Excel和Word时, ...

  4. 初探接口测试框架--python系列5

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  5. 浅析JNI函数的注册过程

    我们在java中调用Native code的时候,一般是通过JNI来实现的,我们只需要在java类中加载本地.so库文件,并声明native方法,然后在需要调用的地方调用即可,至于java中nativ ...

  6. ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法

    ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法 今天遇到的一个问题: 直接修改数据表中的某些字段数据内容时报错: ORA-01461: 仅可以为插入 LONG 列的 L ...

  7. Android开发-API指南-<manifest>

    <manifest> 英文原文:http://developer.android.com/guide/topics/manifest/manifest-element.html 采集(更新 ...

  8. JS(AS)中的原子操作

    原子操作这是Java多线程编程的老生常谈了.所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程). 当然 ...

  9. 8051学习笔记——AD

    AD.C #include<reg52.h> #include <iic.h> #define PCF8591 0x90 //PCF8591 地址 sbit LS138A=P2 ...

  10. eclipse 弹出智能提示、代码自动换行

    在eclipse 中编写java 程序时,为了快速查找变量或搜索方法调用,在智能窗口的帮助下,程序的编写速度会更快,但eclipse 默认下并不弹出智能窗口,这就需要自己进行配置,设置的步骤如下: 打 ...