STM32F407ZGT的时钟深入剖析(32M_40M_72M灵活切换)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

6.2时钟...............................................................................................................................26.1.1什么是时钟.......................................................................................................26.1.2STM32的时钟..................................................................................................26.1.3STM32的时钟深入分析..................................................................................46.1.4例程01STM32芯片32MHZ频率下跑点灯程序..........................................76.1.1例程02STM32芯片40MHZ频率下跑点灯程序........................................146.1.2例程03STM32芯片72MHZ频率下跑点灯程序........................................156.2时钟6.1.1什么是时钟从CPU的时钟说起。计算机是一个十分复杂的电子设备。它由各种集成电路和电子器件组成,每一块集成电路中都集成了数以万计的晶体管和其他电子元件。这样一个十分庞大的系统,要使它能够正常地工作,就必须有一个指挥,对各部分的工作进行协调。各个元件的动作就是在这个指挥下按不同的先后顺序完成自己的操作的,这个先后顺序我们称为时序。时序是计算机中一个非常重要的概念,如果时序出现错误,就会使系统发生故障,甚至造成死机。那么是谁来产生和控制这个操作时序呢?这就是“时钟”。“时钟”可以认为是计算机的“心脏”,如同人一样,只有心脏在跳动,生命才能够继续。不要把计算机的“时钟”等同于普通的时钟,它实际上是由晶体振荡器产生的连续脉冲波,这些脉冲波的幅度和频率是不变的,这种时钟信号我们称为外部时钟。它们被送入CPU中,再形成CPU时钟。不同的CPU,其外部时钟和CPU时钟的关系是不同的,下表列出了几种不同CPU外部时钟和CPU时钟的关系。CPU时钟周期通常为节拍脉冲或T周期,它是处理操作的最基本的单位。在微程序控制器中,时序信号比较简单,一般采用节拍电位——节拍脉冲二级体制。就是说它只要一个节拍电位,在节拍电位又包含若干个节拍脉冲(时钟周期)。节拍电位表示一个CPU周期的时间,而节拍脉冲把一个CPU周期划分为几个叫较小的时间间隔。根据需要这些时间间隔可以相等,也可以不等。指令周期是取出并执行一条指令的时间。指令周期常常有若干个CPU周期,CPU周期也称为机器周期,由于CPU访问一次内存所花费的时间较长,因此通常用内存中读取一个指令字的最短时间来规定CPU周期。这就是说,这就是说一条指令取出阶段(通常为取指)需要一个CPU周期时间。而一个CPU周期时间又包含若干个时钟周期(通常为节拍脉冲或T周期,它是处理操作的最基本的单位)。这些时钟周期的总和则规定了一个CPU周期的时间宽度。6.1.2STM32的时钟系统时钟的选择是在启动时进行,复位时内部16MHZ的RC振荡器被选为默认的CPU时钟,随后可以选择外部的、具失效监控的4-26MHZ时钟;当检测到外部时钟失效时,它将被隔离,系统将自动地切换到内部的RC振荡器。在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供的来源:1.HSI是高速内部时钟,RC振荡器,频率默认为16MHz,可以从STM32时钟树中看到2.HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为3MHz~25MHz,时钟树的截图如下:3.LSI是低速内部时钟,RC振荡器,频率为32kHz,可以用于驱动独立看门狗和通过程序选择驱动RTC(RTC用于从停机/待机模式下自动唤醒系统),时钟树的截图如下:4.LSE是低速外部时钟,接频率为32.768kHz的石英晶体,也可以被用来驱动RTC,时钟树的截图如下:5.PLL为锁相环输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2等。但是其输出频率最大不得超过120MHz,时钟树的截图如下::6.1.3STM32的时钟深入分析众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时钟树”。在一些传统的低端8位单片机诸如51,AVR,PIC等单片机,其也具备自身的一个时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在某种不可更改的状态(假设单片机处于正常工作的状态)。比如51单片机使用典型的12MHz晶振作为时钟源,则外设如IO口、定时器、串口等设备的驱动时钟速率便已经是固定的,用户无法将此时钟速率更改,除非更换晶振。而STM32微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速率不再有固定的关系,下面来详细解析STM32微控制器的时钟树。下图是STM32微控制器的时钟树:下表是结合图表明出来的:标号释义1内部低速振荡器(LSI,40Khz)2外部低速振荡器(LSE,32.768Khz)3外部高速振荡器(HSE,3-25MHz)4内部高速振荡器(HSI,8MHz)5PLL输入选择位6RTC时钟选择位7PLL1分频数寄存器8PLL1倍频寄存器9系统时钟选择位10USB分频寄存器11AHB分频寄存器12APB1分频寄存器13AHB总线14APB1外设总线15APB2分频寄存器16APB2外设总线17ADC预分频寄存器18ADC外设19PLL2分频数寄存器20PLL2倍频寄存器21PLL时钟源选择寄存器22独立看门狗设备23RTC设备在认识这颗时钟树之前,首先要明确“主干”和最终的“分支”。假设使用外部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总线,同样在上图中也可以寻获GPIO外设的时钟轨迹:3——5——7——21——8——9——11——15——16 对于3,首先是外部的3-25MHz(前文已假设为8MHz)输入; 对于5,通过PLL选择位预先选择后续PLL分支的输入时钟(假设选择外部晶振); 对于7,设置外部晶振的分频数(假设1分频); 对于21,选择PLL倍频的时钟源(假设选择经过分频后的外部晶振时钟); 对于8,设置PLL倍频数(假设9倍频); 对于9,选择系统时钟源(假设选择经过PLL倍频所输出的时钟); 对于11,设置AHB总线分频数(假设1分频); 对于15,设置APB2总线分频数(假设1分频) 对于16,时钟到达APB2总线;现在来计算一下GPIO设备的最大驱动时钟速率(各个条件已在上述要点中假设):1)由3所知晶振输入为8MHz,由○5——○21知PLL的时钟源为经过分频后的外部晶振时钟,并且此分频数为1分频,因此首先得出PLL的时钟源为:8MHz/1=8MHz。2)由8、9知PLL倍频9,且将PLL倍频后的时钟输出选择为系统时钟,则得出系统时钟为8MHz*9=72MHz。3)时钟到达AHB预分频器,由11知时钟经过AHB预分频器之后的速率仍为72MHz。4)时钟到达APB2预分频器,由15经过APB2预分频器后速率仍为72MHz。5)时钟到达APB2总线外设上面是原理的剖析,如果再不明白的,可以接下来看例程代码,理论联系实践是最好的老师。6.1.4例程01STM32芯片32MHZ频率下跑点灯程序1.示例简介让点灯程序在时钟主频32MHz下面运行,LED灯的正极接的是3.3V电源,所以我们编程让LED负极拉低即GPIO引脚端口F的管脚10拉低,即PD2拉低,那么LED灯就会变亮,相关电路图如下图所示:2.调试说明:下载代码,并且按下【复位】键,在神舟王407板上找到LED2,可以看到该LED1灯一亮一灭。3.关键代码:/***************程序总共2部分之第1部分时钟频率的配置{开始*********************************//*******************/intmain(void){/****程序总共2部分之第1部分时钟频率的配置********************//*****以下是关于RCC时钟详细请见《STM32F20XXX参考手册》5.3节RCC寄存器描述*******/unsignedcharsws=0;RCC-CR|=0X00010000;//使能外部高速时钟HSEONwhile(!(RCC-CR17));//将RCC_CR寄存器的值右移17位,等待HSERDY就绪,即外部时钟就绪我们在这里,因为STM32神舟王207开发板上的晶振是25MHZ的,我们先25分频,再128倍频,再4分频,输出就能达到STM32的32MHZ工作频率,分别先后用到了,PLLCFGR中的0-5位、6-14位、16-17位。*/RCC-PLLCFGR|=0x19;//25分频RCC-PLLCFGR|=0x113;//128倍频RCC-PLLCFGR|=0x116;//4分频FLASH-ACR|=0x1;//CPU和FLASH的频率不一样,所以需要等待RCC-CR|=124;//将PLL使能while(!(RCC-CR25));//监控寄存器CR的PLLRDY位,等待PLL时钟就绪RCC-CFGR|=11;//将时钟切换寄存器配置成用PLL输出作为系统时钟while(sws!=0x2)//等待CFGR寄存器的2,3位为10,系统正式切换到了PLL输出作为时钟{sws=RCC-CFGR2;//将CFGR寄存器右移2位,将2,3位SWS状态移出来,//详情请见《STM32F20XXX参考手册》97页sws&=0x3;//这里的0x3为二进制的11,这个whlie循环设计的一个算法,为了判断sws是不是为10}/***************程序总共2部分之第1部分时钟频率的配置结束*********************************//*使能AHB1总线的时钟,对GPIO的端口F时钟使能*/RCC-AHB1ENR|=RCC_AHB1Periph_GPIOF;/*配置输入输出模式和输入输出的速度*/GPIOF-MODER&=0xFFCFFFFF;/*模式*/GPIOF-MODER|=0x00100000;GPIOF-OTYPER&=0xFFFFBFFF;/*类型*/GP

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功