搜档网
当前位置:搜档网 › 晶振时钟基本

晶振时钟基本

晶振时钟基本
晶振时钟基本

晶体、晶振、时钟概念详解

1。晶体(crystal),有的RD称其为晶振: 石英晶体,是无源的两个脚的,没有方向,需要IC或其它外部晶体振荡器输入,才产生频率,是无方向的。晶体还需要反向器, 负载电容(loading capacitor)才可组成振荡器.石英晶体元件由石英晶体片和外壳组成一种无源压电元件,俗称晶体、晶振,我国早期称晶体谐振器。由此可见正常石英晶体元件(两脚),是无方向性的,但当一个引出端(引脚)与外壳相连导通时就有可能有方向性了。

crystal是一种机电器件,是用电损耗很小的石英晶体经精密切割磨削并镀上电极焊上引线做成。这种晶体有一个很重要的特性,如果给他通电,他就会产生机械振荡,反之,如果给他机械力,他又会产生电,这种特性叫机电效应。他们有一个很重要的特点,其振荡频率与他们的形状,材料,切割方向等密切相关。由于石英晶体化学性能非常稳定,热膨胀系数非常小,其振荡频率也非常稳定,由于控制几何尺寸可以做到很精密,因此,其谐振频率也很准确。

-请问反向器, 负载电容(loading capacitor) 是做什么用的??为什么要?

-形成正反馈啊,这样才能起振啊

谐振器和钟振他们的却别在于谐振器是最简单的没有任何补偿的振荡器,而我们通常说的钟振是由一个谐振器加上ic组成一个回路而实现其自身的功能。以VCXO为例:压控晶体振荡器(VCXO)是通过红外加控制电压使振荡效率可变或是可以调制的石英晶体振荡器。VCXO主要由石英谐振器、变容二极管和振荡电路组成,其工作原理是通过控制电压来改变变容二极管的电容,从而“牵引”石英谐振器的频率,以达到频率调制的目的。VCXO大多用于锁相技术、频率负反馈调制的目的。而决定如何选用也应该很清楚了吧?

2。钟振(oscillator),有的RD也称其为晶振,一般有四个脚,是有方向的,有电源、地和时钟输出引脚,内部有晶体和振荡电路,不需要输入输入信号源,直接可产生频率。出厂时频率已校准。特点:应用方便、频率稳定、电磁辐射少。但价格比晶体贵些。石英晶体振荡器简称晶振,一般是由石英晶体元件、IC和阻容及外壳组成有源功能组件,加电即可输出稳定频率信号。对晶振一般为4脚(引出端),都有方向性,样本或说明书中有标注。

谐振器(Resonator):在电路中等效作用是一个具有选频作用的网络,是振荡电路核心元器件,决定了振荡器的频率稳定度(Frequency stability)种类有:石英晶体,陶瓷,LC,介质等材料的谐振器。石英晶体与放大电路配合如果行成正反馈,并且回路放大系数大于一则产生自激振荡信号。这就是石英晶体器的基本原理。

选用-------根据你所用的IC的具体要求, 1) 只能用外部时钟, 则选钟振, 或用晶振+反相器+电容来组成振荡器, 按价钱和方便来取。 2)若可用外部时钟, 也可用晶振,那就用晶振。3)若只能用晶振, 就选晶振。

无源晶体与有源晶振的区别、应用范围及用法:

1、无源晶体——无源晶体需要用DSP片内的振荡器,在datasheet上有建议的连接方法。无源晶体没有电压的问题,信号电平是可变的,也就是说是根据起振电路来决定的,同样的晶体可以适用于多种电压,可用于多种不同时钟信号电压要求的DSP,而且价格通常也较低,因此对于一般的应用如果条件许可建议用晶体,这尤其适合于产品线丰富批量大的生产者。无源晶体相对于晶振而言其缺陷是信号质量较差,通常需要精确匹配外围电路(用于信号匹配的电容、电感、电阻等),更换不同频率的晶体时周边配置电路需要做相应的调整。建议采用精度较高的石英晶体,尽可能不要采用精度低的陶瓷警惕。

2、有源晶振——有源晶振不需要DSP的内部振荡器,信号质量好,比较稳定,而且连接方式相对简单(主要是做好电源滤波,通常使用一个电容和电感构成的PI型滤波网络,输出端用一个小阻值的电阻过滤信号即可),不需要复杂的配置电路。有源晶振通常的用法:一脚悬空,二脚接地,三脚接输出,四脚接电压。相对于无源晶体,有源晶振的缺陷是其信号电平是固定的,需要选择好合适输出电平,灵活性较差,而且价格高。对于时序要求敏感的应用,个人认为还是有源的晶振好,因为可以选用比较精密的晶振,甚至是高档的温度补偿晶振。有些DSP内部没有起振电路,只能使用有源的晶振,如TI 的6000系列等。有源晶振相比于无源晶体通常体积较大,但现在许多有源晶振是表贴的,体积和晶体相当,有的甚至比许多晶体还要小。

几点注意事项:

1、需要倍频的DSP需要配置好PLL周边配置电路,主要是隔离和滤波;

2、20MHz以下的晶体晶振基本上都是基频的器件,稳定度好,20MHz以上的大多是谐波的(如3次谐波、5次谐波等等),稳定度差,因此强烈建议使用低频的器件,毕竟倍频用的PLL电路需要的周边配置主要是电容、电阻、电感,其稳定度和价格方面远远好于晶体晶振器件;

3、时钟信号走线长度尽可能短,线宽尽可能大,与其它印制线间距尽可能大,紧靠器件布局布线,必要时可以走内层,以及用地线包围;

4、通过背板从外部引入时钟信号时有特殊的设计要求,需要详细参考相关的资料。此外还要做一些说明:总体来说晶振的稳定度等方面好于晶体,尤其是精密测量等领域,绝大多数用的都是高档的晶振,这样就可以把各种补偿技术集成在一起,减少了设计的复杂性。试想,如果采用晶体,然后自己设计波形整形、抗干扰、温度补偿,那样的话设计的复杂性将是什么样的呢?我们这里设计射频电路等对时钟要求高的场合,就是采用高精度温补晶振的,工业级的要好几百元一个。特殊领域的应用如果找不到合适的晶振,也就是说设计的复杂性超出了市场上成品晶振水平,就必须自己设计了,这种情况下就要选用晶体了,不过这些晶体肯定不是市场上的普通晶体,而是特殊的高端晶体,如红宝石晶体等等。更高要求的领域情况更特殊,我们这里在高精度测试时采用的时钟甚至是原子钟、铷钟等设备提供的,通过专用的射频接插件连接,是个大型设备,相当笨重。

晶振:即所谓石英晶体谐振器和石英晶体时钟振荡器的统称。不过由于在消费类电子产品中,谐振器用的更多,所以一般的概念中把晶振就等同于谐振器理解了。后者就是通常所指钟振。

**************************************************************

Lacewood International Corp.

Mail:Flex_zhang@https://www.sodocs.net/doc/074071340.html,

Msn: zhang_hui_vip@https://www.sodocs.net/doc/074071340.html,

Web: https://www.sodocs.net/doc/074071340.html,

我来打分回复主题引用本帖关注推荐

晶振、晶体、时钟概念详解2,请多跟贴,提出自己的看法发布时间: 2007-5-15 下午5:06

提问者: flex_zhang

等级:初入江湖

积分: 182分

本文介绍了一些足以表现出一个晶体振荡器性能高低的技术指标,了解这些指标的含义,将有助于通讯设计工程师顺利完成设计项目,同时也可以大大减少整机生产厂家的采购成本。

----总频差:在规定的时间内,由于规定的工作和非工作参数全部组合而引起的晶体振荡器频率与给定标称频率的最大频差。

----说明:总频差包括频率温度稳定度、频率温度准确度、频率老化率、频率电源电压稳定度和频率负载稳定度共同造成的最大频差。一般只在对短期频率稳定度关心,而对其他频率稳定度指标不严格要求的场合采用。例如:精密制导雷达。

----频率温度稳定度:在标称电源和负载下,工作在规定温度范围内的不带隐含基准温度或带隐含基准温度的最大允许频偏。

----fT=±(fmax-fmin)/(fmax+fmin)

----fTref=±MAX[|(fmax-fref)/fref|,|(fmin-fref)/fref|]fT:频率温度稳定度(不带隐含基准温度) ----fTref:频率温度稳定度(带隐含基准温度)

----fmax:规定温度范围内测得的最高频率

----fmin:规定温度范围内测得的最低频率

----fref:规定基准温度测得的频率

----说明:采用fTref指标的晶体振荡器其生产难度要高于采用fT指标的晶体振荡器,故fTref指标的晶体振荡器售价较高。

----几种电子系统使用的晶体振荡器典型频率温度稳定度指标见下表:

----表中有一部分频率温度稳定度指标应是带隐含基准温度的频率温度稳定度指标,但没表示出来。

(1ppm=1×10-6;1ppb=1×10-9)。

----频率稳定预热时间:以晶体振荡器稳定输出频率为基准,从加电到输出频率小于规定频率允差所需要的时间。

----说明:在多数应用中,晶体振荡器是长期加电的,然而在某些应用中晶体振荡器需要频繁的开机和关机,这时频率稳定预热时间指标需要被考虑到(尤其是对于在苛刻环境中使用的军用通讯电台,当要求频率温度稳定度≤±0.3ppm(-45℃~85℃),采用OCXO作为本振,频率稳定预热时间将不少于5分钟,而采用DTCXO只需要十几秒钟)。

----频率老化率:在恒定的环境条件下测量振荡器频率时,振荡器频率和时间之间的关系。这种长期频率漂移是由晶体元件和振荡器电路元件的缓慢变化造成的,可用规定时限后的最大变化率(如±10ppb/天,加电72

小时后),或规定的时限内最大的总频率变化(如:±1ppm/(第一年)和±5ppm/(十年))来表示。

----说明:TCXO的频率老化率为:±0.2ppm~±2ppm(第一年)和±1ppm~±5ppm(十年)(除特殊情况,TCXO很少采用每天频率老化率的指标,因为即使在实验室的条件下,温度变化引起的频率变化也将大大超过

温度补偿晶体振荡器每天的频率老化,因此这个指标失去了实际的意义)。OCXO的频率老化率为:±0.5ppb~±10ppb/天(加电72小时后),±30ppb~±2ppm(第一年),±0.3ppm~±3ppm(十年)。

----频率压控范围:将频率控制电压从基准电压调到规定的终点电压,晶体振荡器频率的最小峰值改变量。

----说明:基准电压为+2.5V,规定终点电压为+0.5V和+4.5V,压控晶体振荡器在+0.5V频率控制电压时频率改变量为-110ppm,在+4.5V频率控制电压时频率改变量为+130ppm,则VCXO电压控制频率压控范围表

示为:≥±100ppm(2.5V±2V)。压控频率响应范围:当调制频率变化时,峰值频偏与调制频率之间的关系。通常用规定的调制频率比规定的调制基准频率低若干dB表示。

----说明:VCXO频率压控范围频率响应为0~10kHz。

----频率压控线性:与理想(直线)函数相比的输出频率-输入控制电压传输特性的一种量度,它以百分数表示整个范围频偏的可容许非线性度。

----说明:典型的VCXO频率压控线性为:≤±10%,≤±20%。简单的VCXO频率压控线性计算方法为(当频率压控极性为正极性时):

----频率压控线性=±((fmax-fmin)/f0)×100%

----fmax:VCXO在最大压控电压时的输出频率

----fmin:VCXO在最小压控电压时的输出频率

----f0:压控中心电压频率----单边带相位噪声£(f):偏离载波f处,一个相位调制边带的功率密度与载波功率之比。

晶体振荡器概述

一、晶体振荡器类型:

1、普通晶体振荡器PackagedCrystalOscillator(PXO)最简单和最适用的、其基本控制元件为晶体元件的振荡器。由于不采用温度控制和温度补偿方式,它的频率-温度特性主要由所采用的晶体元件来确定。

2、电压控制晶体振荡器VoltageControlledCrystalOscillator(VCXO)用外加控制电压偏置或调制其频率输出的晶体振荡器。VCXO的频率-温度特性类似于PXO,主要由所采用的晶体元件来确定。

3、温度补偿晶体振荡器TemperatureCompensatedCrystalOscillator(TCXO)包括数字补偿晶体振荡器(DCXODigitallyCompensatedCrystalOscillator)和微机补偿晶体振荡器(MCXOMicrocomputerCompensatedCrystalOscillator)。器件内部采用模拟补偿网络或数字补偿方式、利用晶体负载电抗随温度的变化而补偿晶体元件的频率-温度特性,以达到减少其频率-温度偏移的晶体振荡器。

4、恒温控制晶体振荡器OvenControlledCrystalOscillator(OCXO)至少是将晶体元件置于隔热罩里(如恒温槽)控制其温度,以使晶体温度基本维持不变的晶体振荡器。

5、电压控制-温补晶体振荡器(VCTCXO)温度补偿晶体振荡器和电压控制晶体振荡器结合。

6、电压控制-恒温晶体振荡器(VCOCXO)恒温晶体振荡器和电压控制晶体振荡器结合。

二、晶体振荡器主要参数

★频率准确度:在标称电源电压、标称负载阻抗、基准温度(252℃)以及其他条件保持不变,晶体振荡器的频率相对与其规定标称值的最大允许偏差,即(fmax-fmin)/f0;

★温度稳定度:其他条件保持不变,在规定温度范围内晶体振荡器输出频率的最大变化量相对于温度范围内输出频率极值之和的允许频偏值,即(fmax-fmin)/(fmax+fmin);

★频率调节范围:通过调节晶振的某可变元件改变输出频率的范围。频率调节的作用是:

①将输出频率调节到该频率范围内的某一预定值;

②由于老化或其他原因,晶体振荡器的输出频率产生偏移,将输出频率调到规定值。

★调频(压控)特性:包括调频频偏、调频灵敏度、调频线性度。

①调频频偏:压控晶体振荡器控制电压由标称的最大值变化到最小值时输出频率差。

②调频灵敏度:压控晶体振荡器变化单位外加控制电压所引起的输出频率的变化量。

③调频线性度:是一种与理想直线(最小二乘法)相比较的调制系统传输特性的量度。通常是以在规定范围内偏离理想直线的百分数表示

★负载特性:其他条件保持不变,负载在规定变化范围内晶体振荡器输出频率相对于标称负载下的输出频率的

最大允许频偏。

★电压特性:其他条件保持不变,电源电压在规定变化范围内晶体振荡器输出频率相对于标称电源电压下的输出频率的最大允许频偏。

★杂波:输出信号中与主频无谐波(副谐波除外)关系的离散频谱分量与主频的功率比,用dBc表示。

★谐波:谐波分量功率Pi与载波功率P0之比,用dBc表示。

★频率老化:在规定的环境条件下,由于元件(主要是石英谐振器)老化而引起的输出频率随时间的系统漂移过程。通常用某一时间间隔内的频差来量度。对于高稳定晶振,由于输出频率在较长的工作时间内呈近似线性的单方向漂移,往往用老化率(单位时间内的相对频率变化)来量度。如:10-8/日或10-6/年等。

★日波动:指振荡器经过规定的预热时间后,每隔一小时测量一次,连续测量24小时,将测试

数据按S=(fmax-fmin)/f0式计算,得到日波动。

★开机特性:在规定的预热时间内,振荡器频率值的最大变化,用V=(fmax-fmin)/f0表示。

★相位噪声:短期稳定度的频域量度。用单边带噪声与载波噪声之比£(f)表示,£(f)与噪声起伏的频谱密度Sφ(f)和频率起伏的频谱密度Sy(f)直接相关,由下式表示:

f2S(f)=f02Sy(f)=2f2£(f)

f—傅立叶频率或偏离载波频率;f0—载波频率如何选择晶振晶振的选择注意某些参数,设计工程师即可选择到适合应用的振荡器

----今天无数电子线路和应用需要精确定时或时钟基准信号。晶体时钟振荡器极为适合这方面的许多应用。

----时钟振荡器有多种封装,它的特点是电气性能规范多种多样。它有好几种不同的类型:电压控制晶体振荡器(VCXO)、温度补偿晶体振荡器(TCXO)、恒温箱晶体振荡器(OCXO),以及数字补偿晶体振荡器(DCXO)。每种类型都有自己的独特性能。

----频率稳定性的考虑

----晶体振荡器的主要特性之一是工作温度内的稳定性,它是决定振荡器价格的重要因素。稳定性愈高或温度范围愈宽,器件的价格亦愈高。

----设计工程师要慎密决定对特定应用的实际需要,然后规定振荡器的稳定度。指标过高意味着花钱愈多。

----对于频率稳定度要求±20ppm 或以上的应用,可使用普通无补偿的晶体振荡器。对于成于±1 至±20ppm 的稳定度,应该考虑TCXO。对于低于±1ppm 的稳定度,应该考虑OCXO 或DCXO 。

----输出----必需考虑的其它参数是输出类型、相位噪声、抖动、电压稳定度、负载稳定性、功耗、封装形式、冲击和振动、以及电磁干扰(EMI)。晶振器可HCMOS/TTL 兼容、ACMOS 兼容、

ECL 和正弦波输出。每种输出类型都有它的独特波形特性和用途。应该关注三态或互补输出的要求。对称性、上升和下降时间以及逻辑电平对某些应用来说也要作出规定。许多DSP 和通信芯片组往往需要严格的对称性(45% 至55%)和快速的上升和下降时间(小于5ns )。

----相位噪声和抖动----在频域测量获得的相位噪声是短期稳定度的真实量度。它可测量到中央频率的1Hz 之内和通常测量到1MHz 。

----振荡器的相位噪声在远离中心频率的频率下有所改善。TCXO 和OCXO 振荡器以及其它利用基波或谐波方式的晶体振荡器具有最好的相位噪声性能。采用锁相环合成器产生输出频率的振荡器比采用非锁相环技术的振荡器一般呈现较差的相位噪声性能。

----抖动与相位噪声相关,但是它在时域下测量。以微微秒表示的抖动可用有效值或峰

—峰值测出。许多应用,例如通信网络、无线数据传输、ATM 和SONET 要求必需满足严格的拌动指标。需要

密切注意在这些系统中应用的振荡器的抖动和相位噪声特性。

----电源和负载的影响----振荡器的频率稳定性亦受到振荡器电源电压变动以及振荡器负载变动的影响。正确选择振荡器可将这些影响减到最少。设计者应在建议的电源电压容差和负载下检验振荡器的性能。不能期望只能额定驱动15pF 的振荡器在驱动50pF 时会有好的表现。在超过建议的电源电压下工作的振荡器亦会呈现坏的波形和稳定性。

----对于需要电池供电的器件,一定要考虑功耗。引入3.3V 的产品必然要开发在3.3V 下工作的振荡器。----较低的电压允许产品在低功率下运行。现今大部分市售的表面贴装振荡器在3.3V 下工作。许多采用传统5V 器件的穿孔式振荡器正在重新设计,以便在3.3V 下工作。

----封装----与其它电子元件相似,时钟振荡器亦采用愈来愈小型的封装。例如,M-tron 公司的M3L/M5L 系列表面贴装振荡器现在采用3.2×5.0×1.0mm 的封装。通常,较小型的器件比较大型的表面贴装或穿孔封装器件更昂贵。小型封装往往要在性能、输出选择和频率选择之间作出折衷。

----工作环境----振荡器实际应用的环境需要慎重考虑。例如,高的振动或冲击水平会给振荡器带来问题。----除了可能产生物理损坏,振动或冲击可在某些频率下引起错误的动作。这些外部感应的扰动会产生频率跳动、增加噪声份量以及间歇性振荡器失效。----对于要求特殊EMI 兼容的应用,EMI 是另一个要优先考虑的问题。除了采用合适的P C 母板布局技术,重要的是选择可提供辐射量最小的时钟振荡器。一般来说,具有较慢上升/下降时间的振荡器呈现较好的EMI 特性。

----对于70MHz 以下的频率,建议使用HCMOS 型的振荡器。对于更高的频率,可采用ECL 型的振荡器。ECL 型振荡器通常具有最好的总噪声抑制,甚至在10 至100MHz 的较低频率下,ECL 型也比其它型的振荡器略胜一筹。

stm32时钟详细说明

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。其实是四个时钟源,如下图所示(灰蓝色),PLL是由锁相环电路倍频得到PLL时钟。 ①、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LSE,或者是HSE的128分频。RTC的时钟源通过RTCSEL[1:0]来选择。 STM32中有一个全速功能的USB模块,其串行接口引擎需要一个频率为48MHz的时钟源。该时钟源只能从PLL输出端获取,可以选择为1.5分频或者1分频,也就是,当需要使用USB模块时,PLL必须使能,并且时钟频率配置为48MHz或72MHz。 另外,STM32还可以选择一个时钟信号输出到MCO脚(PA8)上,可以选择为PLL输出的2分频、HSI、HSE、或者系统时钟。 系统时钟SYSCLK,它是供STM32中绝大部分部件工作的时钟源。系统时钟可选择为PLL输出、HSI或者HSE。系统时钟最大频率为72MHz,它通过AHB分频器分频后送给各模块使用,AHB分频器可选择1、2、 4、8、16、64、128、256、512分频。其中AHB分频器输出的时钟送给5大模块使用: ①、送给AHB总线、内核、内存和DMA使用的HCLK时钟。 ②、通过8分频后送给Cortex的系统定时器时钟。 ③、直接送给Cortex的空闲运行时钟FCLK。 ④、送给APB1分频器。APB1分频器可选择1、2、4、8、16分频,其输出一路供APB1外设使用(PCLK1,最大频率36MHz),另一路送给定时器(Timer)2、3、4倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤、送给APB2分频器。APB2分频器可选择1、2、4、8、16分频,其输出一路供APB2外设使用(PCLK2,最大频率72MHz),另一路送给定时器(Timer)1倍频器使用。该倍频器可选择1或者2倍频,时钟输出供定时器1使用。另外,APB2分频器还有一路输出供ADC分频器使用,分频后送给ADC模块使用。ADC分频器可选择为2、4、6、8分频。

STM32时钟初始化函数SysInit详解

花了一天的时间,总算是了解了SystemInit()函数实现了哪些功能,初学STM32,,现记录如下(有理解错误的地方还请大侠指出):使用的是3.5的库,用的是STM32F107VC,开发环境RVMDK4.23 我已经定义了STM32F10X_CL,SYSCLK_FREQ_72MHz 函数调用顺序: startup_stm32f10x_cl.s(启动文件)→SystemInit() → SetSysClock () →SetSysClockTo72() 初始化时钟用到的RCC寄存器复位值: RCC_CR = 0x0000 xx83; RCC_CFGR = 0x0000 0000;RCC_CIR = 0x0000 0000; RCC_CFGR2 = 0x0000 0000; SystemInit() 在调用SetSysClock()之前RCC寄存器的值如下(都是一些与运算,或运算,在此就不赘述了): RCC->CR = 0x0000 0083; RCC->CIR = 0x00FF0000; RCC->CFGR2 = 0x00000000;至于这些寄存器都代表着什么意思,详见芯片资料RCC寄存器,该文重点不在此处;SetSysClock()函数如下: static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif defined SYSCLK_FREQ_36MHz SetSysClockTo36(); #elif defined SYSCLK_FREQ_48MHz SetSysClockTo48(); #elif defined SYSCLK_FREQ_56MHz SetSysClockTo56(); #elif defined SYSCLK_FREQ_72MHz//我的定义的是SYSCLK_FREQ_72MHz,所以调用SetSysClockTo72() SetSysClockTo72(); #endif } SetSysClockTo72()函数如下: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/ /* Enable HSE */ RCC->CR |= ((uint32_t)RCC_CR_HSEON); /* Wait till HSE is ready and if Time out is reached exit */ do

stm32如何配置时钟

学习STM32笔记2 如何配置时钟 学习STM32笔记2 如何配置时钟 /************************************************************* 该程序目的是用于测试核心板回来后是否能正常工作。包括 两个按键、两个LED现实。按键为PC4、PC5,LED为PA0\PA1。LED为 低电平时点亮。按键为低电平时触发。 ************************************************************/ #i nclude "stm32f10x_lib.h" void RCC_Configuration(void);//设置系统主时钟 void GPIO_Configuration(void);//设置邋邋IO参数 void NVIC_Configuration(void);//设置中断表地址 void delay(void);//延时函数 int main(void) { #ifdef DEBUG debug(); #endifRCC_Configuration(); NVIC_Configuration(); GPIO_Configuration(); while (1) { delay(); //设置指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_0); //设置指定的数据端口位 delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_0); //清除指定的数据端口位 GPIO_SetBits(GPIOA,GPIO_Pin_1); delay(); GPIO_ResetBits(GPIOA,GPIO_Pin_1); delay(); /********************************************* 使用setbits 与resetbits 是比较简单,其实还是可以使用 其它函数。例如可以使用GPIO_WriteBit GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET);对于好像流水灯呀这些一个整段IO,可以使用GPIO_Write(GPIOA, 0x1101); *********************************************/

05_STM32F4通用定时器详细讲解

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) 作用:1使能自动重载TIM3_ARR 2定时器的计数器递增或递减计数。 3 事件更新。 4 计数器使能 2 TIM 3 控制寄存器 2 (TIM3_CR2) 3 TIM3 从模式控制寄存器 (TIM3_SMCR) 4 TIM3 DMA/中断使能寄存器 (TIM3_DIER) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

STM32时钟系统与软件配置

STM32时钟系统与软件配置 在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法 如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: 1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。 使用HSE时钟,程序设置时钟参数流程: 1、将RCC寄存器重新设置为默认值RCC_DeInit; 2、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 3、等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); 4、设置AHB时钟RCC_HCLKConfig; 5、设置高速AHB时钟RCC_PCLK2Config; 6、设置低速速AHB时钟RCC_PCLK1Config;

STM32滴答时钟

关于STM32 滴答时钟 相信不论是初学者还是高手,都会被STM32的滴答时钟所吸引。STM32有很多计数器,也有很多计数器中断。当别人还在用计数器做定时扫描的时候,我们就默默的开始了滴答时钟做扫描了。让他们去任意的浪费资源吧,我们节约资源,把计数器发挥更大的作用。 Systick定时器属于cortex内核部件,在芯片介绍的datasheet中没有提到过,可以参考 《CortexM3权威指南》或《STM32xxx-Cortex编程手册》。 首先来看Systick的时钟来源,如图一。可以看出在STM32中Systick以HCLK(AHB 时钟)或HCLK/8作为运行时钟。 图1 另外要注意Systick是一个24位的定时器,即一次最多可以计数224个时钟脉冲,这个脉冲计数值被保存到当前计数值寄存器STK_VAL中,这个计数器只能向下计数,每接收到一个时钟脉冲STK_VAL的值就向下减1,直至0,当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD中保存的数据加载到STK_VAL,意思就是它会自动重装。当STK_VAL 的值被倒计至0时,触发中断,就可以在中断服务函数中处理定时事件了。 要让Systick正常工作,必须要对Systick进行配置。它的配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CRL中,见图二。

图二 ENABLE: 为Systick timer的使能位,此位为1的时候开始计数,为0则关闭Systick timer。 TICKINT: 为中断触发使能位,此位为1的时候并且STK_VAL倒计至0的时候会触发Systick 中断,此位为0的时候不触发中断。 CLKSOURCE: 为Systick的时钟选择位,此位为1的时候Systick的时钟为AHB时钟,此位为0 的时候Systick的时钟为AHB/8(AHB的8分频)。 COUNTFLAG: 为Systick的标志位,当STK_VAL倒计至0,此标志位会被置1。 现在我们不会再为滴答时钟而感到迷惑了吧! 下面将详细描述如何去设置计数器,我们在很多地方看到这样一个函数: SysTick_Config(SystemCoreClock / 1000) 配置为1ms中断一次 SysTick_Config(SystemCoreClock / 100000) 配置为10us中断一次 SysTick_Config(SystemCoreClock / 1000000) 配置为10us中断一次 我们将细说一下,SystemCoreClock/100000 为什么是10us 我们从图1时钟数可以看出Systick的时钟和AHB有关,从图2中了解到滴答时钟可设置,结合两处就能看明白。若不去设置,系统默认为AHB时钟,即72MHz。 系统文件中可查找出以下描述: /************************************************************************** ***** * Clock Definitions *************************************************************************** ****/ #ifdef SYSCLK_FREQ_HSE uint32_t SystemCoreClock = SYSCLK_FREQ_HSE; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_24MHz uint32_t SystemCoreClock = SYSCLK_FREQ_24MHz; /*!< System Clock Frequency (Core Clock) */ #elif defined SYSCLK_FREQ_36MHz uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz; /*!< System

图文详解stm32时钟树

对于广大初次接触STM32的读者朋友(甚至是初次接触ARM器件的读者朋友)来说,在熟悉了开发环境的使用之后,往往“栽倒”在同一个问题上。这问题有个关键字叫:时钟树。 众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。 而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,本文将来详细解析STM32微控制器的时钟树。

图1是STM32微控制器的时钟树,表1是图中各个标号所表示的部件。 标号图1标号释义 1 内部低速振荡器(LSI,40Khz) 2 外部低速振荡器(LSE,32.768Khz) 3 外部高速振荡器(HSE,3-25MHz) 4 内部高速振荡器(HIS,8MHz) 5 PLL输入选择位 6 RTC时钟选择位 7 PLL1分频数寄存器 8 PLL1倍频寄存器 9 系统时钟选择位 10 USB分频寄存器 11 AHB分频寄存器 12 APB1分频寄存器 13 AHB总线 14 APB1外设总线 15 APB2分频寄存器 16 APB2外设总线 17 ADC预分频寄存器 18 ADC外设 19 PLL2分频数寄存器 20 PLL2倍频寄存器 21 PLL时钟源选择寄存器 22 独立看门狗设备 23 RTC设备 图1 STM32的时钟树 在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部8MHz 晶振作为STM32的时钟输入源(这也是最常见的一种做法),则这个8MHz便是“主干”,而“分支”很显然是最终的外部设备比如通用输入输出设备(GPIO)。这样可以轻易找出第一条时钟的“脉络”:3——5——7——21——8——9——11——13 对此条时钟路径做如下解析: 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于13,时钟到达AHB总线; 在上一章节中所介绍的GPIO外设属于APB2设备,即GPIO的时钟来源于APB2总线,同样在图1中也可以寻获GPIO外设的时钟轨迹:

STM32 时钟详解及范例

一、综述: 1、时钟源 在STM32 中,一共有5 个时钟源,分别是HSI 、HSE 、LSI 、LSE 、PLL 。 ①HSI 是高速内部时钟,RC 振荡器,频率为8MHz ; ②HSE 是高速外部时钟,可接石英/ 陶瓷谐振器,或者接外部时钟源,频率范围是4MHz –16MHz ; ③LSI 是低速内部时钟,RC 振荡器,频率为40KHz ; ④LSE 是低速外部时钟,接频率为32.768KHz的石英晶体; ⑤PLL 为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL 的输入可以接HSI/2 、HSE 或者HSE/2 。PLL倍频可选择为2– 16 倍,但是其输出频率最大不得超过72MHz 。 其中,40kHz 的LSI 供独立看门狗IWDG 使用,另外它还可以被选择为实时时钟RTC 的时钟源。另外,实时时钟RTC 的时钟源还可以选择LSE ,或者是HSE 的128 分频。 STM32 中有一个全速功能的USB 模块,其串行接口引擎需要一个频率为48MHz 的时钟源。该时钟源只能从PLL 端获取,可以选择为 1.5 分频或者1分频,也就是,当需使用到USB 模块时,PLL 必须使能,并且时钟配置为48MHz 或72MHz 。 另外STM32 还可以选择一个时钟信号输出到MCO 脚(PA.8) 上,可以选择为PLL 输出的2分频、HSI 、HSE 或者系统时钟。 系统时钟SYSCLK ,它是提供STM32 中绝大部分部件工作的时钟源。系统时钟可以选择为PLL 输出、HSI 、HSE 。系系统时钟最大频率为72MHz ,它通过AHB 分频器分频后送给各个模块使用,AHB 分频器可以选择 1 、2 、4 、8 、16 、64 、128 、256 、512 分频,AHB分频器输出的时钟送给5大模块使用: ①送给AHB 总线、内核、内存和DMA 使用的HCLK 时钟; ②通过8分频后送给Cortex 的系统定时器时钟STCLK; ③直接送给Cortex 的空闲运行时钟FCLK ; ④送给APB1 分频器。APB1 分频器可以选择1 、2 、4 、8 、16 分频,其输出一路供APB1 外设使用(PCLK1 ,最大频率36MHz ),另一路送给定时器(Timer)2 、3 、4 倍频器使用。该倍频器根据PCLK1的分频值自动选择1或者2倍频,时钟输出供定时器2、3、4使用。 ⑤送给APB2 分频器。APB2 分频器可以选择1 、2 、4 、8 、16 分频,其输出一路供APB2 外设使用(PCLK2 ,最大频率72MHz ),另外一路送给定时器(Timer)1 倍频使用。该倍频器根据PCLK2的分频值自动选择1 或2 倍频,时钟输出供定时器1使用。另外APB2 分频器还有一路输出供ADC 分频器使用,分频后送给ADC 模块使用。ADC 分频器可选择为 2 、4 、6 、8 分频。 需要注意的是定时器的倍频器,当APB 的分频为1 时,它的倍频值为1 ,否则它的倍频值就为2 。file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg 2、APB1和APB2连接的模块 ①连接在APB1( 低速外设)上的设备有:电源接口、备份接口、CAN 、USB 、I2C1 、I2C2 、UART2 、UART3 、SPI2 、窗口看门狗、Timer2 、Timer3 、Timer4 。注意USB 模块虽然需要一个单独的48MHz 的时钟信号,但是它应该不是供USB 模块工作的时钟,而只是提供给串行接口引擎(SIE) 使用的时钟。USB 模块的工作时钟应该是由APB1 提供的。 ②连接在APB2 (高速外设)上的设备有:UART1 、SPI1 、Timer1 、ADC1 、ADC2 、GPIOx(PA~PE) 、第二功能IO 口。 file:///C:/DOCUME~1/LU/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg 二、寄存器介绍: typedefstruct { __IO uint32_t CR;

STM32时钟简述教学文稿

在STM32F4中,有5个重要的时钟源,为 HSI、 HSE、 LSI、 LSE、 PLL。其中 PLL 实际是分为两个时钟源,分别为主 PLL 和专用 PLL。从时钟频率来分可以分为高速时钟源和低速时钟源,在这 5 个中 HSI, HSE 以及 PLL 是高速时钟, LSI 和 LSE 是低速时钟。从来源可分为外部时钟源和内部时钟源,外部时钟源就是从外部通过接晶振的方式获取时钟源,其中 HSE 和LSE 是外部时钟源,其他的是内部时钟源。下面我们看看 STM32F4 的这 5 个时钟源,我们讲解顺序是按图中红圈标示的顺序: ①、LSI 是低速内部时钟,RC 振荡器,频率为32kHz 左右。供独立看门狗和自动唤醒单元使用。 ②、LSE 是低速外部时钟,接频率为32.768kHz 的石英晶体。这个主要是RTC 的时钟源。 ③、HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz。核心板接的是8M 的晶振。HSE 也可以直接做为系统时钟或者PLL 输入。 ④、HSI 是高速内部时钟,RC 振荡器,频率为16MHz。可以直接作为系统时钟或者用作PLL输入。 ⑤、PLL 为锁相环倍频输出。STM32F4 有两个PLL:

1)主PLL(PLL)由HSE 或者HSI 提供时钟信号,并具有两个不同的输出时钟。第一个输出PLLP 用于生成高速的系统时钟(最高168MHz) 第二个输出PLLQ 用于生成USB OTG FS 的时钟(48MHz),随机数发生器的时钟和SDIO时钟。 2)专用PLL(PLLI2S)用于生成精确时钟,从而在I2S 接口实现高品质音频性能。

超透彻的STM32讲解资料——RTC时钟

这部分的内容实现的功能是将时间传输到上位机。 第一:串口的配置,前面已经详细的讲过,这里不再讲解。 第二:中断的配置,由于我们需要时间每秒自加一次,一次需要用到中断,在中断服务程序中实现秒的自加,前面也已讲过中断的配置,这里就不详细讲解,只给出代码 /* * 函数名:NVIC_Configuration * 描述:配置RTC秒中断的主中断优先级为1,次优先级为0 * 输入:无 * 输出:无 * 调用:外部调用 */ void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /*设置先占优先级1位,从占优先级3位*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /*选择RTC的IRQ通道*/ NVIC_InitStructure.NVIC_IRQChannel =RTC_IRQn; /*设置中断先占优先级为1*/ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; /*设置中断从占优先级为1*/ NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; /*使能RTC的IRQ通道*/ NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE; NVIC_Init(&NVIC_InitStructure); }

第三:对于RTC的使用,首先我们要判断是否是第一次使用RTC,如果是第一次使用那么肯定要设置时间的初始值以及对RTC进行相应的配置,而如果不是第一次使用,那么我们就无需再设置时间的初始值以及对RTC进行相应的配置,只需让RTC计数器继续计数就可以了。那么我们如何才能判断RTC是否为第一次使用呢?STM32中有一个后备寄存器,寄存器中的值不会因为掉电而改变,既然如此那我们肯定会这样想,当我第一次使用RTC时,往后备寄存器中写入一个值,下次再使用RTC时,我只要判断后备寄存器中的值是否为我第一次用RTC时写入的值,如果相等,说明我以前已经用过RTC了,现在我无需再对RTC进行配置了,因为第一次都配置好了(RTC和后备寄存器一样,RTC寄存器中设置的值不会因为掉电而改变),但要注意的是RTC的允许中断这一位在每次复位后会回到默认值,所以每次复位后我们都要再次设置允许RTC中断。下面我们就看看RTC的配置程序: /* * 函数名:RTC_Configuration * 描述:配置RTC * 输入:无 * 输出:无 * 调用:外部调用 */ void RTC_Configuration(void) { /* 使能PWR和BKP时钟*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /*取消后备区域的写保护,因为后备寄存器中放的是重要的数据,默认是不允许往里面写入值的*/ PWR_BackupAccessCmd(ENABLE); /* 将后背寄存器的寄存器值设为默认值*/ BKP_DeInit(); /* 打开外部低速晶振,RTC可以选择的时钟源是外部和内部低速晶振及外部高速晶振,这里我们选择外部低速晶振32768HZ */

单片机STM32时钟图文理解

单片机STM32时钟图文理解 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号. 高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。 高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。 低速外部时钟(LSE):以外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。 低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。 OSC_OUT和OSC_IN开始,这两个引脚分别接到外部晶振8MHz,第一个分频器PLLXTPRE,遇到开关PLLSRC(PLL entry clock source),我们可以选择其输出,输出为外部高速时钟(HSE)或是内部高速时钟(HSI)。这里选择输出为HSE,接着遇到锁相环PLL,具有倍频作用,在这里我们可以输入倍频因子PLLMUL,要是想超频,就得在这个寄存器上做手脚啦。经过PLL的时钟称为PLLCLK。倍频因子我们设定为9倍频,也就是说,经过PLL之后,我们的时钟从原来8MHz的HSE变为72MHz的PLLCLK。紧接着又遇到了一个开关SW,经过这个开关之后就是STM32的系统时钟(SYSCLK)了。通过这个开关,可以切换SYSCLK的时钟源,可以选择为HSI、PLLCLK、HSE。我们选择为PLLCLK 时钟,所以SYSCLK就为72MHz了。PLLCLK在输入到SW前,还流向了USB预分频器,这个分频器输出为USB外设的时钟(USBCLK)。回到SYSCLK,SYSCLK经过AHB 预分频器,分频后再输入到其它外设。如输出到称为HCLK、FCLK的时钟,还直接输出

STM32芯片时钟配置

对STM32进行软件开发时,最基本的就是对STM32芯片进行时钟和端口配置,然后是对项目所用到的片上资源进行配置并驱动,下面给出时钟和端口配置代码,该代码几乎涵盖了片上所有时钟和端口配置项目,可根据自己需要进行删除不必要的配置项: /****************************************************************** * Function Name :RCC_Configuration 复位时钟控制配置 * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************/ void RCC_Configuration(void) { /* system clocks configuration -----系统时钟配置----*/ /* RCC system reset(for debug purpose) */ RCC_DeInit(); //将外设RCC寄存器重设为缺省值 /* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);//开启外部高速晶振(HSE) /* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待HSE起振 if(HSEStartUpStatus == SUCCESS) //若成功起振,(下面为系统总线时钟设置) { /* Enable Prefetch Buffer */

stm32时钟输出

STM32 RCC实验MCO脚输出时钟波形 2012-5-1 08:05|发布者: benben|查看: 1457|评论: 0 摘要: 为了能用示波器看到系统时钟,决定将系统时钟输出到MCO引脚上去。弄了一晚上, 看见波形了。首先建立空的工程,将下面三行代码注释掉:;IMPORT SystemInit ;删除SystemInit自己写RCC初始化函数;LDR R0, =SystemInit ... 为了能用示波器看到系统时钟,决定将系统时钟输出到MCO引脚上去。 弄了一晚上,看见波形了。 首先建立空的工程,将下面三行代码注释掉: ;IMPORT SystemInit ;删除SystemInit自己写RCC初始化函数 ;LDR R0, =SystemInit ;BLX R0 下面是设置函数,使用HSI作为系统时钟,不实用PLL,直接将HSI输出到MCO引脚:void My_RccInitMCOHSI(void) { uint8_t temp; My_Rcc_DeInit(); RCC->CR |= 1<<0; //复位HSION 开启内部时钟;其实内部时钟不用管的,开机自动使用内部时钟。 while(!(RCC->CR>>1)); //检查HSI是否就绪 RCC->CFGR &= (~0x03); //清零CFGR的0、1位HSI作为系统时钟 while(temp!=0x00) //读取CFGR的2、3为,判断是否是HSI作为系统时钟设置

{ temp=RCC->CFGR>>2; temp&=0x03; } //此时HSI已经成为系统时钟 //HSI时钟就绪后,直接输出到MCO(PA8) RCC->APB2ENR |= 1<<2; //使能PA时钟 RCC->APB2ENR|=1<<5; //使能PORTD时钟 GPIOA->CRH&=0XFFFFFFF0; GPIOA->CRH|=0X0000000B;//PA8 推挽输出(MCO) // //设置MCO输出内部HSI时钟 RCC->CFGR |= 5<<24; //MCO输出HSI时钟 //RCC->CFGR |= 4<<24; MCO输出系统时钟SYSCLK //此时就可以在PA8即MCO引脚看见输出波形了对比下,两者是一样的。} 下边是示波器出来的图:

STM32时钟详细配置

STM32时钟配置 STM32时钟配置步骤// 开启HSI时钟寄存器操作 1).开启高速时钟HSE // 设置时钟控制寄存器RCC_CR 位16 置1使能 RCC->CR|= 0x00010000; 位16 :HSEON:外部高速时钟使能 当进入待机和停止模式时,该位由硬件清零,关闭4-16MHz外部振荡器。当外部4-16MHz 振荡器被用作或被选择将要作为系统时钟时,该位不能被清零。 2).等待高速时钟就绪// 读取时钟控制寄存器RCC_CR位17为1就位 while(!(RCC-> CR>>17)); 位17:HSERDY:外部高速时钟就绪标志 由硬件置’1’来指示外部4-16MHz振荡器已经稳定。在HSEON位清零后,该位需要6个外部4-25MHz振荡器周期清零。 3).设置APB1,APB2,AHB分频系数// 设置时钟配置寄存器RCC_CFGR RCC_CFGR=0x00000400; (AHB :位4-7, (低速)APB1 :位8-10, (高速)APB2 :位11-13) 位7:4:HPRE[3:0]:AHB预分频(AHB Prescaler)0xxx:SYSCLK不分频 位10:8:PPRE1[2:0]:低速APB预分频(APB1) 100:HCLK 2分频 位13:11:PPRE2[2:0]:高速APB预分频(APB2) 0xx:HCLK不分频 4).设置PLL倍频// 配置时钟配置寄存器RCC_CFGR 位18-21 RCC_CFGR|=7<<18; 位21:18:PLLMUL:PLL倍频系数0111:PLL 9倍频输出 5).PLL输入时钟源选择// 配置时钟配置寄存器RCC_CFGR 位16 RCC_CFGR|=1<<16; 位16:PLLSRC:PLL输入时钟源(PLL entry clock source) 1:HSE时钟作为PLL输入时钟。由软件置’1’或清’0’来选择PLL输入时钟源。只能在关闭PLL时才能写入此位6).设置FLASH延时周期//48ACR|=0x32; 7).PLL使能// 设置时钟控制寄存器RCC_CR 位24 RCC_CR|=0X01000000; 位24:PLLON:PLL使能1:PLL使能当进入待机和停止模式时,该位由硬件清零。当PLL时钟被用作或被选择将要作为系统时钟时,该位不能被清零。 8).等待PLL就绪// 设置时钟控制寄存器RCC_CR 位25置1锁定 while(!(RCC_CR>>24)); 位25:PLLRDY:PLL时钟就绪标志1:PLL锁定PLL锁定后由硬件置’1’。 9).设置PLL作为system时钟// 配置时钟配置寄存器RCC_CFGR 位0-1 :10 RCC_CFGR|=0X00000002; 位1:0 SW[1:0]:系统时钟切换10:PLL输出作为系统时钟 在从停止或待机模式中返回时或直接或间接作为系统时钟的HSE出现故障时,由硬件强制选择HSI作为系统时钟(如果时钟安全系统已经启动) 10).等待system时钟稳定// 查看时钟配置寄存器RCC_CFGR位2-3 :10 while((RCC->CFGR & (uint32_t)0x0c) != (uint32_t)0x08) 位3:2:SWS[1:0]:系统时钟切换状态10:PLL输出作为系统时钟; 由硬件置’1’或清’0’来指示哪一个时钟源被作为系统时钟

STM32F103时钟部分归纳

学习一款单片机,首先要了解的是它的时钟部分,在网上找到一些stm32F103时钟部分的资料,归纳总结一下。 时钟模块框图如下: 仔细看上面这个框图,就可以对F103的时钟有一个清晰的认识了。 三种不同的时钟源可用作系统时钟(SYSCLOCK): HSI振荡器时钟(由芯片内部RC振荡器提供) HSE振荡器时钟(由芯片外部晶体振荡器提供) PLL时钟(通过倍频HIS或HSE振荡器倍频得到) 另外还有两个时钟源: LSI内部40kHz低速RC振荡器时钟,用于驱动独立看门狗或选择驱动RTC

LSE外部32.768kHz低速外部输入时钟,用于驱动RTC 1.当HSI被用于作为PLL时钟的输入时,系统时钟能得到的最大频率是64MHz。2.用户可通过多个预分频器分别配置AHB、高速APB(APB2)和低速APB(APB1)域的频率。AHB和APB2域的最大频率是72MHz。APB1域的最大允许频率是36MHz。SDIO接口的时钟频率固定为HCLK/2。 3. RCC通过AHB时钟(HCLK)8分频后作为Cortex系统定时器(SysTick)的外部时钟。通过对SysTick控制与状态寄存器的设置,可选择上述时钟或Cortex(HCLK)时钟作为SysTick时钟。ADC时钟由高速APB2时钟经2、4、6或8分频后获得。 定时器时钟频率由APB1(PCLK1)时钟获得,分配由硬件按以下2种情况自动设置: a. 如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。 b. 否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。 4. FCLK是Cortex-M3的自由运行时钟。详情见ARM的Cortex-M3技术参考手册。 关于HSE、HIS、PLL、LSE、LSI时钟特性及校准直接参考STM32相关Datasheet。 系统时钟配置过程: 配置过程主要对RCC_CR、RCC_CFGR、RCC_CIR这三个寄存器,进行读写访问,配置系统时钟完成后,进行对要使用的相应外设时钟进行使能和配置,不用的外设建议关闭相应的外设时钟(降低功耗)。 比较经典的系统时钟选择配置为:使用外部8MHz的HSE时钟源作为PLL时钟输入,PLL再进行9倍频得到72MHZ的时钟作为系统时钟输入,具体实现过程如下: 1、置RCC_CR的HSION[0]位,启动HSI时钟。 2、清RCC_CFGR的 MCO[26:24],ADCPRE[15:14],PPRE2[13:11],PPRE1[10:8],HPRE[7:4],SWS[3:2], SW[1:0]位,选择默认的HSI时钟且设置相应的时钟不分频。 3、清RCC_CR的PLLON[24],CSSON[19],HSEON[16]位,关闭PLL和HSE时钟,且关闭时钟检测。 4、清RCC_CR的HSEBYP[18]位,说明HSE时钟为外部的陶瓷晶体振荡器,并非旁路模式。 5、清RCC_CFGR的USBPRE[22],PLLMUL[21:18],PLLXTPRE[17],PLLSRC[16]位,使HSE不分频作为PLL的时钟输入,PLL的1.5倍频作为USB的时钟。 6、清RCC_CIR所有位,关闭全部的时钟中断。 7、置RCC_CR的HSEON[16]位,开启HSE振荡器。 8、检测RCC_CR的HSERDY[17]位来检测HSE振荡器是否准备就绪,若该位为1则接着往下配置,否则一直等待检测直到该位被硬件置1或等待检测时间结束。 9、清RCC_CFGR的HPRE[7:4]位,设置AHB预分频值使SYSCLCK不分频。 10、清RCC_CFGR的HPRE2[13:11]位,设置APB2时钟(PCLK2)不分频。

STM32时钟配置方法详解

一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理: ①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 ②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性能;第2种:分别重映射OSC_IN 和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面)节省2个外部电阻。 三、用HSE时钟,程序设置时钟参数流程: 01、将RCC寄存器重新设置为默认值RCC_DeInit; 02、打开外部高速时钟晶振HSE RCC_HSEConfig(RCC_HSE_ON); 03、等待外部高速时钟晶振工 作HSEStartUpStatus = RCC_WaitForHSEStartUp(); 04、设置AHB时钟RCC_HCLKConfig; 05、设置高速AHB时钟RCC_PCLK2Config; 06、设置低速速AHB时钟RCC_PCLK1Config; 07、设置PLL RCC_PLLConfig; 08、打开PLL RCC_PLLCmd(ENABLE); 09、等待PLL工 作while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 10、设置系统时钟RCC_SYSCLKConfig; 11、判断是否PLL是系统时钟while(RCC_GetSYSCLKSource() != 0x08) 12、打开要使用的外设时 钟RCC_APB2PeriphClockCmd()/RCC_APB1PeriphClockCmd() 四、下面是STM32软件固件库的程序中对RCC的配置函数(使用外部8MHz晶振) /******************************************************************************* * Function Name : RCC_Configuration

相关主题