打印
[STM32F1]

STM32F10X系列时钟配置

[复制链接]
1344|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
什么是时钟?为什么需要时钟?如果突然某天有人问大家这个问题,大家会如何回答呢?有人对时钟做了一个定义:时钟是从一个共同的起点开始,对定期事件计数的设备。在我的理解中,时钟就如同生物的脉搏一样,维持着万物最基本的生存。将单片机与人类类比,那么人类心脏的舒张与收缩对应着TTL电平信号的逻辑0与1。隐隐约约感觉到,时钟对单片机(Single Chip Microcomputer)而言是至关重要的。

        1971年以英特尔4004为代表的微处理器(MPU)诞生,4004使用了晶体振荡器作为系统时钟发生器。随后微机朝着运算和控制两个方向蓬勃发展,也就出现了后来的微控制器(MCU,全称Microcontroller Unit,与单片机意思相近),可以说单片机数字电路时代的产物。单片机的核心部分是CPU,图1-1展示出CPU由寄存器、控制器、运算器和时钟四个部分组成的内部结构。从这可以看出,CPU离不开时钟信号,自然而然单片机也就离不开时钟信号。




使用特权

评论回复
沙发
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者
    不过到目前为止,好像仍然只是知其然而不知所以然。想要知道这个问题的答案,只能从其真实的内部电路入手了。图1-2为4004内核微处理器的内部结构,片内由2250个晶体管组成。

使用特权

评论回复
板凳
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者
    图片有些庞大,我们随便放大一处看看,放大后的图片如图1-3所示。可以看出其内部结构是由各种晶体管构成的,没有任何运算放大电路,妥妥的数字电路结构。

使用特权

评论回复
地板
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者
学过数字电子技术的我们知道,与、或、非、与非、或非、与或非、异或等各种门电路是数字电路的基本单元,虽然他们结构多样且复杂,但通常可以分为组合逻辑电路和时序逻辑电路两大类。同时我们也知道单片机是由运算器、控制器、存储器以及输入输出设备构成,其内部具体电路是由逻辑函数化简而来,不太好直接分析。曲线救国,那我们看看MicroChip设计的PIC16F877单片机的GPIO内部结构,如图1-4所示。

使用特权

评论回复
5
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者

使用特权

评论回复
6
rzjvv|  楼主 | 2024-4-30 22:23 | 只看该作者
  PIC16F877单片机的GPIO包含输出锁存器D1、方向锁存器D2这两个边沿触发的同步D触发器(边沿D触发器),触发器的输出不仅和D口有关,还受到时钟边沿CK的控制,从这可以看出单片机连要控制最基本的GPIO都需要时钟边沿。那么单片机最基本的定时又是如何实现的呢,我们来看看他的外设Timer1的基本结构,如图1-5所示。


使用特权

评论回复
7
rzjvv|  楼主 | 2024-4-30 22:24 | 只看该作者

使用特权

评论回复
8
rzjvv|  楼主 | 2024-4-30 22:24 | 只看该作者
  当PIC16F877单片机的Timer1工作在定时模式时,TMRON被置1使能Timer1,TMR1CS (T1CON<1>) bit被置为0,数据选择器(MUX,全称Multiplexer)选择将4分频的晶振时钟信号(Focs/4)传递到预分配器Prescaler中进一步分频。定时时钟源(Fosc/4)是系统时钟系统时钟Fsys(Fsys=Fosc)分频而来,在每个上升沿时钟到来时系统时钟也是一致上升的,T1SYNC为0或1是同样的效果(原文:The synchronize control bit T1SYNC (T1CON<2>) has no effect, since the internal clock is always in sync.)。最后寄存器TMR1在定时时钟脉冲的作用下进一,完成定时功能。其他诸如UART、CCP等外设则更是需要精准的时钟信号来稳定工作,时钟对单片机的重要性不言而喻。

使用特权

评论回复
9
rzjvv|  楼主 | 2024-4-30 22:24 | 只看该作者
时钟是如何产生的?
        时钟其实就是一个不断振荡的电路产生周期性的高低电平,不过单片机对这个振荡电路频率的稳定性有着很高的要求。从原理出发,振荡电路有很多种类,常见的有RC正弦波振荡电路、LC正弦波振荡电路、石英晶体振荡电路、陶瓷振荡电路等。

        STM32F103C8T6单片机内部集成了一个8MHz的RC振荡电路(HSI)和一个40KHz的RC振荡电路(LSI),不过RC振荡电路的时钟频率与电阻和电容的精度、制造工艺、环境温湿度、供电电压都有关系,通常只用在低频下使用,STM32官方在技术手册中也直言实际LSI实际频率介于30-60KHz之间。RC振荡电路由放大电路、选频网络、正反馈网络、稳幅环节四个部分组成,根据选频网络的不同又可分为RC相移振荡电路和文氏电桥振荡电路。

使用特权

评论回复
10
rzjvv|  楼主 | 2024-4-30 22:24 | 只看该作者
由于RC振荡电路一般被集成在片内,石英晶体振荡电路可能才是大家见过最多的振荡电路。有给STC89C52RC单片机焊接过的小伙伴应该都有在单片机XTAL1和XTAL2引脚焊接一个晶振和22pF电容的经历,焊接的晶振可能在图2-1中出现过,其实这就是石英晶体振荡电路最外面的部分。


使用特权

评论回复
11
rzjvv|  楼主 | 2024-4-30 22:24 | 只看该作者
  石英晶体振荡器的特点是高精度和高稳定度,其振荡频率和晶体的切片方向有关,常规电路连接如图2-2所示。在一般情况下,晶片机械振动的振幅和交变电场的振幅非常微小,但当外加交变电压的频率为某一特定值时,振幅明显加大,比其他频率下的振幅大得多,这种现象称为压电谐振。晶振两端一般要通过两个负载电容接地,负载电容的容值与晶振频率相关。这个值一般厂家会给出,MicroChip就在PIC16F877的datasheet中给出建议,其中LP指低功率石英晶体、XT指晶体/共振器、HS指高速晶体/共振器,详细数据如图2-2所示。



使用特权

评论回复
12
rzjvv|  楼主 | 2024-4-30 22:25 | 只看该作者
     此外,常在晶振两端引脚并联一个1MΩ的反馈电阻,串联一个1KΩ的限流电阻来使得振荡电路更加稳定地工作,接线如图2-3所示。

使用特权

评论回复
13
rzjvv|  楼主 | 2024-4-30 22:25 | 只看该作者
STM32时钟结构框架
        STM32F10X系列的微控制器根据是否片内集成时钟发生器可分为内部集成的RC振荡电路和外部时钟电路。外部时钟可由接在单片机OSC32_OUT和OSC32_IN、OSC_OUT和OSC_IN引脚的石英/陶瓷振荡产生,也可由外部时钟发生器从OSC32_IN、OSC_IN输入。

        若根据时钟速度可划分为高速时钟电路和低速时钟电路。高速时钟电路包括高速内部时钟(HSI)和高速外部时钟(HSE)。HSE通常是由接在OSC_OUT和OSC_IN引脚两端的8MHz晶振产生的,LSE通常是由接在OSC32_OUT和OSC32_IN引脚两端的32.768KHz晶振产生,时钟引脚位置可参考图3-1。

使用特权

评论回复
14
rzjvv|  楼主 | 2024-4-30 22:25 | 只看该作者
专有名词解释:

HSE(High Speed External Clock signal):高速外部时钟信号,4-16MHz外部晶体/陶瓷谐振器或有源时钟

HSI(High Speed Internal Clock signal):高速内部时钟信号,8MHz RC振荡器

LSE(Low Speed External Clock signal):低速外部时钟信号,32.768KHz外部晶体振荡器

LSI(Low Speed Internal Clock signal):低速内部时钟信号,40KHz内部RC振荡器

PLL(Phase-Locked Loop):锁相环,由时钟树可知可以倍频HSI、HSE

使用特权

评论回复
15
rzjvv|  楼主 | 2024-4-30 22:25 | 只看该作者



图 3-1 STM32F103C8T6引脚分布

使用特权

评论回复
16
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者
  有了上面知识的铺垫,下面我们来看STM32F10X系列微控制器的内部时钟电路(俗称时钟树,初学看起来确实太复杂,不过这也是STM32实现低功耗的制胜法宝),如图3-2所示。


  初次看这张图会很烦躁,不知从何下手,我当时也是这样的。不过当我们将关注点放在时钟来源HSI、HSE、LSI、LSE这四个上面,从左往右捋,就会简单很多,反正时钟是从这儿出发的嘛。

使用特权

评论回复
17
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者
我们先看低速的LSI和LSE,就给RTC(Real Time Clock,实时时钟)提供时钟,LSI除了给RTC供时钟外还给独立看门狗IWDT提供时钟。

        然后我们再关注一下系统时钟SYSCLK,我们看HSI和HSE是怎么到他那儿去的。通过观察发现系统时钟SYSCLK由数据选择器SW从HSI、HSE、PLLCLK中选择一个,记住这一点,灰常重要。HSI、HSE不说了,选择他做时钟源的话,他是多少频率,系统时钟就是多少频率,重点关注PLLCLK。从HSI这条路来看,它可以由HSI(8MHz)2分频后(变4MHz)进入数据选择器PLLSCR,再经过锁相环PLLMUL倍频(x4,x5,x9什么的,自己看)成PLLCLK。值得注意的是,由HSI经锁相环倍频后的最高频率为64MHz(8/2*16)。从HSE这条路来看,它可以由HSE先进入数据选择器PLLDIV1预分频(/1,2,3,4....,16中选择一个来除),再经过锁相环PLLMUL倍频,最高可到系统时钟上限72MHz。有一个好玩的地方,很多资料喜欢说STM32F103C8T6支持72MHz的系统时钟,然后有人傻傻的以为接了个72MHz的晶振,现在知道为什么板子接的8MHz晶振但是系统主频却是72MHz了吧。

使用特权

评论回复
18
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者
最后关注一下AHB、APB1、APB2这3个时钟总线,上面我们关注的是系统时钟,我们顺延下来就可以看到其他外设的时钟是什么样子的了。之所以这样,我猜也是平衡性能和降低功耗哦,我们每次用一个外设都得开一次对应的时钟就是这个原因。你想嘛,外设与外设工作频率肯定不一样啊,都跟系统时钟一样快容易出问题的,比说说ADC采集模拟信号时时间越长越精准嘛。不同外设挂载到不同时钟总线上,总结如图3-3所示。

使用特权

评论回复
19
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者

使用特权

评论回复
20
rzjvv|  楼主 | 2024-4-30 22:26 | 只看该作者
从源代码上分析时钟是如何选择的
这里我就用标准库给大家讲啦,寄存器太难了[呜呜呜~]。相信大家用的标准库大多都是V3.5.0了吧,毕竟2011年就推出了,然后就不维护更新了。什么?你不知道标准库用的哪个版本的?好吧,我们找到并打开stm32f10x.h,对了这个x表示无关项,意思就是stm32f100啊、stm32f103啊、stm32f107啊什么的都适用。打开了吧,然后我们拉到最前面就能看到@version了,图4-1中的库版本就是3.0.0的,不是3.5.0的哦。

使用特权

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

本版积分规则

17

主题

204

帖子

1

粉丝