6.3 STM32F107VCT的时钟深入剖析(32M,40M,72M灵活切换)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.1.4 例程01 STM32芯片32MHZ频率下跑点灯程序
1. 示例简介 让点灯程序在时钟主频 32MHz 下面运行,LED 灯的正极接的是 3.3V 电源,所以我们编 程让 LED 负极拉低即 GPIO 引脚端口 D 的管脚 2 拉低,即 PD2 拉低,那么 LED 灯就会 变亮,相关电路图如下图所示:
一下
晶振是 8MHZ
//2 右移动 18 位,即 0010 使得 PLL 获得 4 倍频输出,外部
//乘以 4 就是 32MHZ 了 RCC->CFGR |= 1<<16; //PLLSRC 设置 78 成 1,使得 HSE 时钟作为 PLL 输入时钟 RCC->CR |= 1<<24; //将 PLL 使能
unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟 HSEON while(!(RCC->CR>>17)); //将 RCC_CR 寄存器的值右移 17 位,等待 HSERDY 就绪, 即外部时钟就绪
RCC->CFGR2 |= 4<<4; // 5 分频
4. LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体,也可以被用来驱动 RTC,时钟 树的截图如下:
5. PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2、HSE。倍频可选择为 4~9 倍, 但是其输出频率最大不得超过 72MHz,时钟树的截图如下:
6.1.3 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 总线;
2. 调试说明: 下载代码,并且按下【复位】键,在神舟 IV 号板上找到 LED2,可以看到该 LED1 灯一
亮一灭。
3. 关键代码: /*************** 程 序 总 共 2 部 分 之 第 1 部 分 时 钟 频 率 的 配 置 { 开 始 *********************************/
下表是结合图表明出来的: 标号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
释义 内部低速振荡器(LSI,40Khz) 外部低速振荡器(LSE,32.768Khz) 外部高速振荡器(HSE,3-25MHz) 内部高速振荡器(HSI,8MHz) PLL输入选择位 RTC时钟选择位 PLL1分频数寄存器 PLL1倍频寄存器 系统时钟选择位 USB分频寄存器 AHB分频寄存器 APB1分频寄存器 AHB总线 APB1外设总线 APB2分频寄存器 APB2外设总线 ADC预分频寄存器 ADC外设 PLL2分频数寄存器 PLL2倍频寄存器 PLL 时钟源选择寄存器 独立看门狗设备 RTC 设备
6.1.2 STM32的时钟
系统时钟的选择是在启动时进行,复位时内部 8MHZ 的 RC 振荡器被选为默认的 CPU 时钟,随后可以选择外部的、具失效监控的 3-25MHZ 时钟;当检测到外部时钟失效时,它 将被隔离,系统将自动地切换到内部的 RC 振荡器。
在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供 的来源: 1. HSI 是高速内部时钟,RC 振荡器,频率默认为 8MHz,可以从 STM32 时钟树中看到
1) 由 3 所知晶振输入为 8MHz,由○5——○21 知 PLL 的时钟源为经过分频后的外部 晶振时钟,并且此分频数为 1 分频,因此首先得出 PLL 的时钟源为:8MHz / 1 = 8MHz。
2) 由 8、9 知 PLL 倍频 9,且将 PLL 倍频后的时钟输出选择为系统时钟,则得出系统 时钟为 8MHz * 9 = 72MHz。
2. HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 3MHz~25MHz,时钟树的截图如下:
3. LSI 是低速内部时钟,RC 振荡器,频率为 40kHz,可以用于驱动独立看门狗和通过程序 选择驱动 RTC(RTC 用于从停机/待机模式下自动唤醒系统),时钟树的截图如下:
晶振作为时钟源,则外设如 IO 口、定时器、串口等设备的驱动时钟速率便已经是固定的, 用户无法将此时钟速率更改,除非更换晶振。
而 STM32 微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速 率不再有固定的关系,下面来详细解析 STM32 微控制器的时钟树。下图是 STM32 微控制 器的时钟树:
3) 时钟到达 AHB 预分频器,由 11 知时钟经过 AHB 预分频器之后的速率仍为 72MHz。 4) 时钟到达 APB2 预分频器,由 15 经过 APB2 预分频器后速率仍为 72MHz。 5) 时钟到达 APB2 总线外设 上面是原理的剖析,如果再不明白的,可以接下来看例程代码,理论联系实践是最好的老师。
6.2 时钟...............................................................................................................................2 6.1.1 什么是时钟.......................................................................................................2 6.1.2 STM32 的时钟..................................................................................................2 6.1.3 STM32 的时钟深入分析..................................................................................3 6.1.4 例程 01 STM32 芯片 32MHZ频率下跑点灯程序 ..........................................6 6.1.5 例程 02 STM32 芯片 40MHZ频率下跑点灯程序 ........................................14 6.1.6 例程 03 STM32 芯片 72MHZ频率下跑点灯程序 ........................................15
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周期的时间宽度。
在上一章节中所介绍的 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 设备的最大驱动时钟速率(各个条件已在上述要点中假设):
//FLASH->ACR|=0x32;
while(!(RCC->CR>>25)); //监控寄存器 CR 的 PLLRDY 位,等待 PLL 时钟就绪
众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由 一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种 时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时 钟树”。在一些传统的低端 8 位单片机诸如 51,AVR,PIC 等单片机,其也具备自身的一个 时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在 某种不可更改的状态(假设单片机处于正常工作的状态)。比如 51 单片机使用典型的 12MHz
RCC->CFGR2 |= 6<<8; //8 倍频
RCC->CFGR2 |= 1<<16; //PLL2 作为 PRED2V1 时钟 RCC->CR |= 1<<26; //将 PLL2 使能
while(!(RCC->CR>>27));
RCC->CFGR2 |= 0x00000004; //5 分频 RCC->CFGR |= 1<<16;wenku.baidu.com//PREDIV1 作为 PLL 时钟 RCC->CFGR |= 2<<18; //本例程希望设置成 32MHZ 的工作频率,我们在这里尝试
1. 示例简介 让点灯程序在时钟主频 32MHz 下面运行,LED 灯的正极接的是 3.3V 电源,所以我们编 程让 LED 负极拉低即 GPIO 引脚端口 D 的管脚 2 拉低,即 PD2 拉低,那么 LED 灯就会 变亮,相关电路图如下图所示:
一下
晶振是 8MHZ
//2 右移动 18 位,即 0010 使得 PLL 获得 4 倍频输出,外部
//乘以 4 就是 32MHZ 了 RCC->CFGR |= 1<<16; //PLLSRC 设置 78 成 1,使得 HSE 时钟作为 PLL 输入时钟 RCC->CR |= 1<<24; //将 PLL 使能
unsigned char sws = 0; RCC->CR |= 0X00010000; //使能外部高速时钟 HSEON while(!(RCC->CR>>17)); //将 RCC_CR 寄存器的值右移 17 位,等待 HSERDY 就绪, 即外部时钟就绪
RCC->CFGR2 |= 4<<4; // 5 分频
4. LSE 是低速外部时钟,接频率为 32.768kHz 的石英晶体,也可以被用来驱动 RTC,时钟 树的截图如下:
5. PLL 为锁相环倍频输出,其时钟输入源可选择为 HSI/2、HSE。倍频可选择为 4~9 倍, 但是其输出频率最大不得超过 72MHz,时钟树的截图如下:
6.1.3 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 总线;
2. 调试说明: 下载代码,并且按下【复位】键,在神舟 IV 号板上找到 LED2,可以看到该 LED1 灯一
亮一灭。
3. 关键代码: /*************** 程 序 总 共 2 部 分 之 第 1 部 分 时 钟 频 率 的 配 置 { 开 始 *********************************/
下表是结合图表明出来的: 标号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
释义 内部低速振荡器(LSI,40Khz) 外部低速振荡器(LSE,32.768Khz) 外部高速振荡器(HSE,3-25MHz) 内部高速振荡器(HSI,8MHz) PLL输入选择位 RTC时钟选择位 PLL1分频数寄存器 PLL1倍频寄存器 系统时钟选择位 USB分频寄存器 AHB分频寄存器 APB1分频寄存器 AHB总线 APB1外设总线 APB2分频寄存器 APB2外设总线 ADC预分频寄存器 ADC外设 PLL2分频数寄存器 PLL2倍频寄存器 PLL 时钟源选择寄存器 独立看门狗设备 RTC 设备
6.1.2 STM32的时钟
系统时钟的选择是在启动时进行,复位时内部 8MHZ 的 RC 振荡器被选为默认的 CPU 时钟,随后可以选择外部的、具失效监控的 3-25MHZ 时钟;当检测到外部时钟失效时,它 将被隔离,系统将自动地切换到内部的 RC 振荡器。
在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL,它们都是时钟所提供 的来源: 1. HSI 是高速内部时钟,RC 振荡器,频率默认为 8MHz,可以从 STM32 时钟树中看到
1) 由 3 所知晶振输入为 8MHz,由○5——○21 知 PLL 的时钟源为经过分频后的外部 晶振时钟,并且此分频数为 1 分频,因此首先得出 PLL 的时钟源为:8MHz / 1 = 8MHz。
2) 由 8、9 知 PLL 倍频 9,且将 PLL 倍频后的时钟输出选择为系统时钟,则得出系统 时钟为 8MHz * 9 = 72MHz。
2. HSE 是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为 3MHz~25MHz,时钟树的截图如下:
3. LSI 是低速内部时钟,RC 振荡器,频率为 40kHz,可以用于驱动独立看门狗和通过程序 选择驱动 RTC(RTC 用于从停机/待机模式下自动唤醒系统),时钟树的截图如下:
晶振作为时钟源,则外设如 IO 口、定时器、串口等设备的驱动时钟速率便已经是固定的, 用户无法将此时钟速率更改,除非更换晶振。
而 STM32 微控制器的时钟树则是可配置的,其时钟输入源与最终达到外设处的时钟速 率不再有固定的关系,下面来详细解析 STM32 微控制器的时钟树。下图是 STM32 微控制 器的时钟树:
3) 时钟到达 AHB 预分频器,由 11 知时钟经过 AHB 预分频器之后的速率仍为 72MHz。 4) 时钟到达 APB2 预分频器,由 15 经过 APB2 预分频器后速率仍为 72MHz。 5) 时钟到达 APB2 总线外设 上面是原理的剖析,如果再不明白的,可以接下来看例程代码,理论联系实践是最好的老师。
6.2 时钟...............................................................................................................................2 6.1.1 什么是时钟.......................................................................................................2 6.1.2 STM32 的时钟..................................................................................................2 6.1.3 STM32 的时钟深入分析..................................................................................3 6.1.4 例程 01 STM32 芯片 32MHZ频率下跑点灯程序 ..........................................6 6.1.5 例程 02 STM32 芯片 40MHZ频率下跑点灯程序 ........................................14 6.1.6 例程 03 STM32 芯片 72MHZ频率下跑点灯程序 ........................................15
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周期的时间宽度。
在上一章节中所介绍的 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 设备的最大驱动时钟速率(各个条件已在上述要点中假设):
//FLASH->ACR|=0x32;
while(!(RCC->CR>>25)); //监控寄存器 CR 的 PLLRDY 位,等待 PLL 时钟就绪
众所周知,微控制器(处理器)的运行必须要依赖周期性的时钟脉冲来驱动——往往由 一个外部晶体振荡器提供时钟输入为始,最终转换为多个外部设备的周期性运作为末,这种 时钟“能量”扩散流动的路径,犹如大树的养分通过主干流向各个分支,因此常称之为“时 钟树”。在一些传统的低端 8 位单片机诸如 51,AVR,PIC 等单片机,其也具备自身的一个 时钟树系统,但其中的绝大部分是不受用户控制的,亦即在单片机上电后,时钟树就固定在 某种不可更改的状态(假设单片机处于正常工作的状态)。比如 51 单片机使用典型的 12MHz
RCC->CFGR2 |= 6<<8; //8 倍频
RCC->CFGR2 |= 1<<16; //PLL2 作为 PRED2V1 时钟 RCC->CR |= 1<<26; //将 PLL2 使能
while(!(RCC->CR>>27));
RCC->CFGR2 |= 0x00000004; //5 分频 RCC->CFGR |= 1<<16;wenku.baidu.com//PREDIV1 作为 PLL 时钟 RCC->CFGR |= 2<<18; //本例程希望设置成 32MHZ 的工作频率,我们在这里尝试