STM32时钟树解析

本人之前其实也用STM32做过一些小东西,但因为时钟的初始化一般是直接在SystemInit时钟系统初始化函数里直接配置为72MHz,所以对于STM32的时钟框图并没有怎么理会,今天刚好有空就重新看了一下并写一篇博客记录一下吧,以免以后又忘了。

 

STM32 有5个时钟源:HSI、HSE、LSI、LSE、PLL。   
①、HSI(High Speed Internal Clock signal)是高速内部时钟,RC振荡器,频率为8MHz,精度不高,受温度影响。 
②、HSE(High Speed External Clock signal)是高速外部时钟,为外接晶振提供的时钟,晶振频率范围为4MHz~16MHz,常用8MHz的外部晶振。
③、LSI(Low Speed Internal Clock signal)是低速内部时钟,RC振荡器,频率为40kHz,可配置为RTC的时钟来源,但RTC时钟对时钟精度要求较高,故较少用于RTC,常用于独立看门狗时钟。
④、LSE是低速外部时钟,接频率为32.768kHz的外部晶振,用于RTC时钟。
⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。  倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。我们常用8M的外部晶振的9倍频,即72MHz作为系统时钟(SYSCLK)。

如图,
红框1中的OSC_OUT和OSC_IN接外部8M晶振(范围为4到16MHz)作为HSE(外部高速时钟),通过PLLXTPRE位可控制选择器②是输出HSE还是HSE/2,选择器①通过PLLSRC位控制,用来选择是HSI/2还是选择器②的输出作为倍频锁相环(PLLMUL控制倍频的倍数)的输入,我们一般都是(系统默认)配置为8Mhz的HSE作为倍频器的输入并选择9倍频产生72MHz的时钟PLLCLK作为系统时钟(SYSCLK),系统时钟经AHB预分频器(默认分频系数为1)得到HCLK,可作为部分外设的时钟,如SDIO,FSMC等,再经APB1,APB2预分频器可得到PCLK1、PCLK2

PCLK1:APB1低速总线时钟,最高为36M。为APB1总线时钟的外设提供时钟。但又经过2倍频作为定时器2~7的时钟,所以定时器2~7即使是在APB1下,也为72M的时钟。

PCLK2:APB2高速总线时钟,最高为72M。为APB2总线时钟的外设(包含定时器1和8)提供时钟。

PCLK2经ADC预分频器(/2,4,6,8)作为ADCCLK(最大为14M),我们常选择6分频(72/6=12M)

(上图看看到挂载在APB1,2下的外设)

红框2表示RTC的时钟来源为:①HSE/128;②LSE;③LSI。我们通常选择LSE(频率为32.768KHz的外部晶振),而LSI精度较低,并不太适合RTC时钟,而常作为独立看门狗的时钟。

 


红框3表示STM32可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL 输出的2分频、HSI、HSE、或者系统时钟。


上面还漏了一点,关于CSS,CSS为时钟安全系统,在STM32参考手册6.2.7小节有提到,开发者可以通过CSS中断设置HSE故障后的系统时钟,比如HSI/2(4MHz)的16倍频,如果开发者未开启CSS中断或者在中断中没有进行相应
配置,则硬件默认使用HSI(8MHz)作为系统时钟。

另外关于如何配置以上所讲的时钟,可以看STM32参考手册6.3小节RCC寄存器描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

S3C2440时钟体系

S3C2440在默认情况下,整个系统全靠一个12MHz的外部晶振提供频率来工作运行的,也就是说CPU、内存、UART、ADC等所有需要用到时钟频率的硬件都工作在12MHz下,但是通过查阅芯片手册我们知道CPU时钟最高可为400MHZ,那么怎么设置时钟让…

关于MCU、CPU扩展SDRAM的一个小知识

像上图这种硬件电路图上的16个数据位和我们在初始化SDRAM的时候设置的16位数据位宽是指我们读写SDRAM的时候可以同时读写16个数据位,数据线越多肯定越快,但是数据线也不可能无限增加,我们在程序里是可以读写8位,16位,3…

S3C2440扩展SDRAM

本文主要目的是记录一下S3C2440扩展SDRAM的一些知识,方便以后查阅。 通过查阅手册我们知道,2440有8个可以用来扩展内存的BANK,其中第6和第7还可用来扩展SDRAM 下面我们来看一下2440扩展SDRAM需要设置哪些寄存器。 一、BWSCON寄存器 该寄存器…

汇编语言的相对跳转和绝对跳转以及反汇编代码解析

上图第一行的b1 main为相对跳转,即跳转到pcoffset,其中pc为当前pc值,offset可以理解为偏移地址,也就是根据当前所在地址加上偏移地址实现跳转,为相对跳转。 我们来看看它的反汇编代码 上图清除完bss区后使用b1指令跳转到30000668…

韦东山嵌入式第一期14课第004节_und异常模示程序示例_P笔记

本节课的第一个程序韦老师是想让大家见识一下未定义异常,而第二个程序是对第一个程序进行改进,防止在某些条件下执行不了,下面就来讲一下第2个程序改进了哪些地方并且有什么用。 程序在此路径中:源码文档图片\源码\源码_20180321…

关于NOR FLASH地址左右移的问题

问题引入:不知道你会不会有这样的疑问:为什么在发送解锁命令时,我们不用右移一位,而发送扇区地址时却要右移一位(nor_cmd函数内部已经左移一位),这里先补充说明一下说明是cpu角度和nor角度&…

在linux下利用ls命令进行模糊查找

如上图,我们当前路径下有三个文件,分别为helloworld.c以及helloworld和1.c,直接输入命令ls则显示所有文件,我们可以利用ls 加*的方向进行模糊查找。 输入ls 目录名 形式的命令行,则是对该目录名下的文件全部进行显示&a…

Linux下没有包含头文件(不知是哪个)导致编译无法通过的解决心得

最近写程序的时候编译出错了,提示信息为:invalid use of undefined type fb_var_screeninfo。显示根据英文知道是没有定义 fb_var_screeninfo这个类型,明显是缺少了某个头文件,但是缺少哪个头文件以及有什么又快又好的解决方法呢&…

Linux编译程序时加-I指定头文件位置

Linux下编译出现以下错误,错误的原因是在/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/usr/include/freetype/config/下找不到ftheader.h,而我到该目录下看,发现路径是这样的rootubuntu:/usr/local/arm/arm-2009q3/arm-non…

关于源文件用不同的编码方式编写,会导致执行结果不一样的现象及解决方法

如果我们编写以下程序,并分别另存为ANSI和UTF-8两种不同的编码方式保存,放到Linux下编译并运行如下图,两端相同的程序以不同的编码方式保存编译后的运行结果不一样,./ansi采用ANSI编码方式,会自动采用GBK方式来保存中文…

arm-linux-gcc静态编译和动态编译的区别

很多教程会提到加上-static是静态编译,但对于新手来说没有用例子来说明可能不太好理解,今天我就介绍一下关于这方面知识的一个例子: 最近在做一个关于freetype字体的东西,需要依赖freetype官方提供的库,我已经把电脑这…

从0到1写RT-Thread内核——线程定义及切换的实现

从0写RT-Thread内核之线程定义及切换的实现具体可以分为以下六步来实现 一:分别定义线程栈、线程函数、线程控制块; ALIGN(RT_ALIGN_SIZE)//设置4字节对齐 /* 定义线程栈 */ rt_uint8_t rt_flag1_thread_stack[512]; rt_uint8_t rt_flag2_thread_stack…

从0到1写RT-Thread内核——临界段的保护

临界段就是一段在执行的时候不能被中断的代码段,在RT-Thread里,临界段最常出现的就是对全局变量的操作(类似Linux下的锁)。RT-Thread对临界段的保护是直接把中断全部关了,NMI FAULT和硬FAULT除外。下图是3个关于中断屏…

从0到1写RT-Thread内核——空闲线程与阻塞延时的实现

在之前写的另外一篇文章——<从0到1写RT-Thread内核——线程定义及切换的实现>中线程体内的延时使用的是软件延时&#xff0c;即还是让CPU空等来达到延时的效果。RTOS中的延时叫阻塞延时&#xff0c;即线程需要延时的时候&#xff0c;线程会放弃CPU的使用权&#xff0c;C…

从0到1写RT-Thread内核——支持多优先级

在本章之前&#xff0c;RT-Thread还没有支持多优先级&#xff0c;我们手动指定了第一个运行的线程&#xff0c;并在此之后三个线程&#xff08;包括空闲线程&#xff09;互相切换&#xff0c;在本章中我们加入优先级的功能&#xff0c;第一个运行的程序是就绪列表里优先级最高的…

AD软件之模块化原理图

首先我们创建两个原理图文件 然后我们在Sheet2.SchDoc里放置一个页面符并双击绿色的方框 选择目标文件 我们选择我们刚才创建的Sheet4.SchDoc 然后在 视图——>面板——>Navigator选项 里点一下交互式导航 就可以看到Sheet4.SchDoc被添加到Sheet2.SchDoc下面了 通过上面…

AD软件操作技巧

本文介绍一些关于AD软件的实用小操作&#xff0c;这些小技巧可以大大的减少我们的工作量 一.批量操作丝印&#xff08;或者操作别的东西也可以&#xff0c;主要是凸显批量操作的思想&#xff09; 如下图假设我们工程里有很多丝印和焊盘等等&#xff0c;现在我想改批量地修改丝…

V4L2框架分析

V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。v4L2是针对uvc&#xff08;USB Video Class&#xff09;免驱usb设备的编程框架&#xff0c;主要用于采集usb摄像头等。 下图是V4L2的框架&#xff0c;首先系统核心层分配设置注册一个名为cdev结构体变量&#x…

mjpg-streamer框架分析

mjpg-streamer程框架图如下所示&#xff1a; 程序运行起来后&#xff0c;主进程根据传入的参数设置的输入输出通道打开对应的输入输出动态链接库&#xff0c;并依次调用以下函数 1、输入---仓库-----输出&#xff08;mjpg-streamer.h&#xff09; &#xff08;1&#xff09;gl…

linux字符驱动之概念介绍

一、字符驱动框架 问&#xff1a;应用程序open、read、write如何找到驱动程序的open、read、write函数&#xff1f; 答:应用程序的open、read、write是在C库里面实现的&#xff0c;它里面通过swi val指令去触发一个异常&#xff0c;这个异常就会进入到内核空间&#xff0c;在内…