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