时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行。时钟系统犹如人的心脏,一旦有问题整个系统就崩溃。我们知道STM32属于高级单片机,其内部有很多的外设,但不是所有外设都使用同一时钟频率工作,比如内部看门狗和RTC,它只需30KHz的时钟频率即可工作,所以内部时钟源就有多种选择。在前面章节的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,将STM32F1系统时钟设置为72MHz,然后进入主函数。那么这个系统时钟大小如何得来,其他外设的时钟又如何划分,可以通过一张时钟树图找到答案,只要理解好时钟树,STM32一切时钟的来龙去脉就会非常清楚。下面就来了解下时钟树,如下图所示。

在STM32时钟系统中,有5个重要的时钟源,分别是LSI、LSE、HSI、HSE、PLL。按照时钟频率分可分为高速时钟源和低速时钟源,在这5个中HSI、HSE以及PLL属于高速时钟,LSI和LSE属于低速时钟。按照时钟来源可分为外部时钟源和内部时钟源,外部时钟源就是在STM32晶振管脚处接入外部晶振的方式获取时钟源,其中HSE和LSE是外部时钟源,其他的是内部时钟源。下面我们就按照上图中数字顺序来介绍。
(1)图标1中HSI是内部高速时钟,RC振荡器,频率为8MHz。可作为系统时钟或PLL锁相环的输入。
(2)图标2中HSE是外部高速时钟,可通过外接一个频率范围是4-16MHz的时钟或者晶振,HSE可以作为系统时钟和PLL锁相环输入,还可以经过128分频后输入给RTC。
(3)图标3中LSI是内部低速时钟,RC振荡器,频率大约为40K,可供独立看门狗和RTC使用,并且独立看门狗只能使用LSI时钟。
(4)图标4的LSE是外部低速时钟,通常在外部低速时钟管脚上外接一个32.768KHz的晶振,供RTC使用。

(5)图标5的PLL是锁相环,用于倍频输出,因为开发板外部高速晶振也只有8M,如果要使芯片的最大时钟频率是72M,可通过PLL锁相环来倍频。从图标5中可以看到,PLL时钟输入源可选择为HSI/2、HSE或者HSE/2,时钟源经过2-16倍频后输入给PLLCLK,如果系统时钟选择由PLLCLK提供,则PLLCLK最大值不要超过72M。

那么它是怎么倍频产生72MHz系统时钟的呢?我们看到在主PLL内有倍频器和分频器,PLL时钟源的输入信号要先经过一个PLLMUL倍频器,将HSE或HSI倍频2-16后输入给PLLCLK,如果系统时钟源SYSCLK选择PLLCLK作为它的来源,则最大值不能超过72M。虽然可以做超频处理,但会打破系统的稳定性,这个是不划算的。假如PLLSRC的时钟来源由HSE提供,开发板使用的HSE是8M晶振,经过PLLMUL的9倍频后可以输出72M时钟频率给PLLCLK。
  如果我们选择的HSE是PLL的时钟源,PLL是SYSCLK的时钟源,即SYSCLK为72MHz,这个也是我们库函数模板中SystemInit所配置的最终系统时钟。

上面简单介绍了下STM32的5个时钟源,那么它们是怎么给其他外设和系统提供时钟的呢?在上面时钟树图中常用的时钟用字母框起来,按照它们顺序依次介绍。
(A)MCO是STM32的一个时钟输出IO(PA8),它可以选择一个时钟信号输出,可以选择为PLL输出的2分频、HSI、HSE或者系统时钟。这个时钟可以用来给外部其他系统提供时钟源。
(B)RTC时钟。从图中线的流向可知,RTC时钟来源可以是内部低速的LSI时钟,外部低速LSE时钟(32.768K),还可以通过HSE的128分频后得到。
(C)USB时钟。STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源,该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是当需要使用USB模块时,PLL必须使能,并且PLLCLK时钟频率配置为48MHz或72MHz。
(D)SYSCLK系统时钟。它是STM32中绝大部分部件工作的时钟源。它的时钟来源可以由HSI、HSE、PLLCLK提供,相信大家选择STM32F1这种高级芯片,都希望有一个比较大的时钟频率,因此选择PLLCLK作为系统时钟。PLLCLK又是从HSE或HSI经过PLL倍频得到。根据前面PLL计算关系大家就可以算出系统时钟是多少。
(E)其他所有外设。从时钟图上可以看出,其他所有外设的时钟最终来源都是 SYSCLK。SYSCLK通过AHB分频器分频后送给各模块使用。这些模块包括:
①AHB总线、内核、内存和DMA使用的HCLK时钟。
②通过8分频后送给Cortex系统定时器时钟,即SysTick。
③直接送给Cortex的空闲运行时钟FCLK。
④送给APB1分频器。APB1分频器输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)1、2倍频使用。
⑤送给APB2分频器。APB2分频器分频输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。
⑥送给ADC分频器。ADC分频器经过2、4、6、8分频后送给ADC1/2/3使用,ADC最大频率为14M。
⑦二分频后送给SDIO使用。
  其中需要理解的是APB1和APB2的区别,APB1上面连接的是低速外设,包括电源接口、备份接口、CAN、USB、I2C1、I2C2、UART2、UART3等。APB2上面连接的是高速外设包括UART1、SPI1、Timer1、ADC1、ADC2、GPIO等。
  在时钟树图中我们还可以得到一个重要信息,大多数有关时钟输出部分都有一个使能控制,比如AHB总线、APB1外设、APB2外设、内核时钟等。当需要使用某个时钟的时候一定要开启它的使能,否则将不工作。在前面使用库函数点亮一个LED实验的时候就使能了GPIO的外设时钟,如果不开启,LED 将不工作。

STM32入门系列-STM32时钟系统,STM32时钟树的更多相关文章

  1. STM32入门系列-STM32时钟系统,自定义系统时钟

    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...

  2. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  3. STM32入门系列-学习STM32要掌握的内容

    STM32芯片架构 STM32F103系列芯片的系统架构如下: STM32芯片基于ARM公司的Cortex-M3内核,由ST公司设计生产,内核与总线矩阵之间有I(指令).S(系统).D(数据)三条信号 ...

  4. STM32必学的时钟系统

    STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图:   上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一 ...

  5. STM32学习笔记:【001】时钟树与RCC

    导言 如果学过单片机的同学应该不会陌生,学习51单片机时最经常听到的就是“最小系统”. 最小系统里面少不了晶振,否则单片机无法工作. 单片机需要晶振(时钟源)来工作,那么对于STM32芯片同样如此. ...

  6. linux入门系列17--邮件系统之Postfix和Dovecot

    前文演示了通过Samba和NFS实现文件共享,本篇演示使用Postfix和Dovecot在局域网实现电子邮件收发系统. 电子邮件系统是我们日常生活和工作中非常重要的一个网络服务,在windows下收发 ...

  7. STM32入门系列-STM32时钟系统,时钟使能配置函数

    之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...

  8. STM32入门系列-启动文件介绍

    在启动文件内部使用的都是汇编语言,这个文件的作用是负责执行微控制器从"复位"到"开始执行 main 函数"中间这段启动时间所必须进行的工作.它完成的具体工作有: ...

  9. STM32入门系列-库目录及文件介绍

    已经介绍了过了CMSIS标准,ST公司按照这个标准设计了一套基于STM32F10x的固件库,我们可以直接在ST公司的官网进行下载,现在给大家STM32最新固件库v3.5,在网盘上给大家提供了下载包,链 ...

随机推荐

  1. Python-装饰器中保留被装饰函数元数据

     函数的元数据包括哪些呢? 1. 函数名 .__name__ 2. 函数注释 .__doc__ ... 那,如何保留被装饰函数元数据,通过wraps装饰器保留被装饰函数的元数据 import time ...

  2. Java (二)基于Eclipse配置Commons IO的环境

    上一篇:Java (一)下载APACHE Commons IO 一.新建一个Java Project 二.使用鼠标右键点击工程,选择New > Folder 三.在Folder name输入文件 ...

  3. K-DTree入门

    \(K-D Tree\),一种用来维护\(K\)维数据的数据结构.常用于维护各种高维的数据,或者是邻近搜索等.从另一种意义上说,实际上就是高维的二叉搜索树.对于一些常见的问题,如\(k\)远点对.三位 ...

  4. 编程体系结构(07):JavaEE之Web开发

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.CS与BS架构 CS架构模式 客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软 ...

  5. 「DevOps 转型与实践」沙龙回顾第二讲

    背景介绍 本期分享内容为<平台化 DevOps-云计算与云原生模式下 DevOps 的建设实践>.目前,DevOps 越来越成为大家当前建设的热点,伴随着基础设施的转型和应用框架的转型,更 ...

  6. ansible-playbook安装tomcat

    1. ansible-playbook安装tomcat  1) 编写playbook的tomcat安装配置 1 [root@test-1 bin]# vim /ansible/tomcat/bin/t ...

  7. Oracle和MySql之间SQL区别(等效转换以及需要注意的问题)

    本篇博文是Oracle和MySQL之间的等效SQL转换和不同,目前市面上没有转换两种SQL的工具,小编觉得以后也不一定会有,于是在业余时间整理了一下,如果有什么错误之处请留言告知,小编也是刚入门的小白 ...

  8. Request对象基础应用实例代码一

    输入用户名:<br><input type="text" name="yhm"><br><br>输入密码:< ...

  9. 如何解决Win7,win8无法使用DOS的Debug:

    如何解决Win7,win8无法使用DOS的Debug: 安装dosbox 将含有程序link,masm,edit,debug的文件夹masm放到d盘根目录 打开dosbox,输入mount c d:\ ...

  10. 【博弈论】CF 1215D Ticket Game

    题目大意 洛谷链接 给出一个长度为\(n\)的由数字组成的字符串(\(n\)是偶数).但可能有偶数个位上的数字为?. 现在有两个人\(A\)和\(B\),在?的位置上填\(0\)~\(9\)的数,一直 ...