一、晶体振荡器

石英晶体的特性,如果在晶片 某轴向 上施加压力时,相应施力的方向会产生一定的电位

相反的,在晶体的某些轴向施加电场时,会使晶体产生机械变形

如果在石英晶片上加上交变电压,晶体就会产生机械振动,机械形变振动又会产生交变电场,尽管这种交变电场的电压极其微弱,但其振动频率是十分稳定的。当外加交变电压的频率与晶片的固有频率(与切割后的晶片尺寸有关,晶体愈薄,切割难度越大,谐振频率越高)相等时,机械振动的幅度将急剧增加,这种现象称为“压电谐振”。

晶体振荡器用于产生所有内部操作同步所需的时钟脉冲

晶体振荡器,其作用在于产生原始时钟频率,这个频率经过频率发生器的放大或缩小后就成了电脑中各种不同的总线频率。它能够产生中央处理器(CPU)执行指令所必须的时钟频率信号,CPU一切指令的执行都是建立在这个基础上的,时钟信频率越高,通常CPU的运行速度也就越快。

**时钟系统是 CPU 的脉搏,就像人的心跳一样,时钟的存在是为了让工作不出现紊乱。**所以时钟系统的重要性就不言而喻了。 STM32 的时钟系统比较复杂,不像简单的 51 单片机一个系统时钟就可以解决一切。于是有人要问,采用一个系统时钟不是很简单吗?为什么 STM32 要有多个时钟源呢? 因为首先STM32 本身非常复杂,外设非常的多,但是并不是所有外设都需要系统时钟这么高的频率,比如看门狗以及 RTC 只需要几十 k 的时钟即可。同一个电路,时钟越快功耗越大,同时抗电磁干扰能力也会越弱,所以对于较为复杂的 MCU 一般都是采取多时钟源的方法来解决这些问题。

晶振的常见频率、电脑周边配件晶振频率及常用消费类电子产品晶振频率

使能时钟

使能就是打开时钟,让晶体震动,并且晶体从打开到震动稳定需要一段时间,稳定后称为 使能就绪
任何一个外设在使用之前,必须首先使能相应的时钟。

“ARM的芯片、STM32、LPC1XXX,外设通常都是给了时钟后才能设置它的寄存器(即才能使用这个外设)。这么做的目的是为了省电,使用了所谓时钟门控的技术。
触发器的赋值是一定需要时钟的, 而寄存器的时钟是由总线时钟提供的,就是说没有总线时钟的话,你给寄存器值它是不会读入的。换句话说,只有送来了时钟,触发器才能被改写值,这样寄存器才会工作,其他不使用的地方不开启时钟,寄存器不会工作,就能达到省电的目的。

二、时钟源介绍

在 STM32 中,有五个时钟源,为 HSI、HSE、LSI、LSE、PLL( H开头高速,L开头低速,I 内部 in,E 是外部 exterior)

HSI 高速内部时钟

RC 振荡器,频率为 8MHz。

HSE 高速外部时钟

可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为
4MHz~16MHz。开发板接的是 8M 的晶振(8百万Hz)。

LSI 低速内部时钟

RC 振荡器,频率为 40kHz。独立看门狗的时钟源只能是 LSI,同时 LSI 还可以作为 RTC 的时钟源。

LSE 低速外部时钟

接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源。

PLL 锁相环倍频输出

(phase 相、位 locked loop),其时钟输入源可选择为 HSI/2、HSE 或者 HSE/2。倍频可选择为2~16 倍(共15种选择)但是其输出频率最大不得超过 72MHz。

SYSCLK 系统时钟

可来自三个时钟源:
HSI
HSE
PLL

几个重要的时钟

SYSCLK 系统时钟
AHB总线时钟
APB1总线时钟(低速)最高36MHz
APB1总线时钟(高速)最高72MHz
PLL时钟

参考链接

A. MCO 是 STM32 的一个时钟输出 IO(PA8),它可以选择一个时钟信号输出,可以
选择为 PLL 输出的 2 分频、HSI、HSE、或者系统时钟。这个时钟可以用来给外
部其他系统提供时钟源。
B. 这里是 RTC 时钟源,从图上可以看出,RTC 的时钟源可以选择 LSI,LSE,以及
HSE 的 128 分频。
C. 从图中可以看出 C 处 USB 的时钟是来自 PLL 时钟源。STM32 中有一个全速功能
的 USB 模块,其串行接口引擎需要一个频率为 48MHz 的时钟源。该时钟源只能
从 PLL 输出端获取,可以选择为 1.5 分频或者 1 分频,也就是,当需要使用 USB
模块时,PLL 必须使能,并且时钟频率配置为 48MHz 或 72MHz。
D. D 处就是 STM32 的系统时钟 SYSCLK,它是供 STM32 中绝大部分部件工作的时
钟源。系统时钟可选择为 PLL 输出、HSI 或者 HSE。系统时钟最大频率为 72MHz,
当然你也可以超频,不过一般情况为了系统稳定性是没有必要冒风险去超频的。
E. 这里的 E 处是指其他所有外设了。从时钟图上可以看出,其他所有外设的时钟最
终来源都是 SYSCLK。SYSCLK 通过 AHB 分频器分频后送给各模块使用。这些
模块包括:
①、AHB 总线、内核、内存和 DMA 使用的 HCLK 时钟。
②、通过 8 分频后送给 Cortex 的系统定时器时钟,也就是 systick 了。
③、直接送给 Cortex 的空闲运行时钟 FCLK。
④、送给 APB1 分频器。APB1 分频器输出一路供 APB1 外设使用(PCLK1,最大
频率 36MHz),另一路送给定时器(Timer)2、3、4 倍频器使用。
⑤、送给 APB2 分频器。APB2 分频器分频输出一路供 APB2 外设使用(PCLK2,
最大频率 72MHz),另一路送给定时器(Timer)1 倍频器使用。

其中需要理解的是 APB1 和 APB2 的区别,APB1 上面连接的是低速外设,包括电源接口、
备份接口、CAN、USB、I2C1、I2C2、UART2、UART3 等等,APB2 上面连接的是高速外设包
括 UART1、SPI1、Timer1、ADC1、ADC2、所有普通 IO 口(PA~PE)、第二功能 IO 口等。居宁
老师的《稀里糊涂玩 STM32》资料里面教大家的记忆方法是 2>1, APB2 下面所挂的外设的时
钟要比 APB1 的高
在以上的时钟输出中,有很多是带使能控制的,例如 AHB 总线时钟、内核时钟、各种 APB1
外设、APB2 外设等等。当需要使用某模块时,记得一定要先使能对应的时钟。后面我们讲解
实例的时候回讲解到时钟使能的方法。
STM32 时钟系统的配置除了初始化的时候在 system_stm32f10x.c 中的 SystemInit()函数中
外,其他的配置主要在 stm32f10x_rcc.c 文件中,里面有很多时钟设置函数,大家可以打开这个
文件浏览一下,基本上看看函数的名称就知道这个函数的作用。在大家设置时钟的时候,一定
要仔细参考 STM32 的时钟图,做到心中有数。

这里需要指明一下,对于系统时钟,默认情况
下是在 SystemInit 函数的 SetSysClock()函数中间判断的,而设置是通过宏定义设置的。我们可
以看看 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
SetSysClockTo72();
#endif
}
这段代码非常简单,就是判断系统宏定义的时钟是多少,然后设置相应值。我们系统默认宏定
义是 72MHz:
#define SYSCLK_FREQ_72MHz 72000000
如果你要设置为 36MHz,只需要注释掉上面代码,然后加入下面代码即可:
#define SYSCLK_FREQ_36MHz 36000000
同时还要注意的是,当我们设置好系统时钟后,可以通过变量 SystemCoreClock 获取系统时钟
值,如果系统是 72M 时钟,那么 SystemCoreClock=72000000。这是在 system_stm32f10x.c 文件
中设置的:
#ifdef SYSCLK_FREQ_HSE
uint32_t SystemCoreClock = SYSCLK_FREQ_HSE;
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
#elif defined SYSCLK_FREQ_48MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_48MHz;
#elif defined SYSCLK_FREQ_56MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_56MHz;
#elif defined SYSCLK_FREQ_72MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
#else
uint32_t SystemCoreClock = HSI_VALUE;
#endif
这里总结一下 SystemInit()函数中设置的系统时钟大小:
SYSCLK(系统时钟) =72MHz
AHB 总线时钟(使用 SYSCLK) =72MHz
APB1 总线时钟(PCLK1) =36MHz
APB2 总线时钟(PCLK2) =72MHz
PLL 时钟 =72MHz
SystemInit()函数中设置的系统时钟大小:
SYSCLK(系统时钟) =72MHz
AHB 总线时钟(使用 SYSCLK) =72MHz
APB1 总线时钟(PCLK1) =36MHz
APB2 总线时钟(PCLK2) =72MHz
PLL 时钟 =72MHz

常用寄存器

时钟配置的几个参数

STM32学习笔记(三 时钟系统 1 时钟系统精讲)相关推荐

  1. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

    今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...

  2. STM32学习笔记(三) STM32的GPIO的深入学习

    STM32的开发学习主要涉及软硬件两个部分的实现,包含众多外设和总线的理解配置.STM32的整个学习曲线并不陡峭,但入门却相当困难,因此在学习之初,多动手实验和测试相当重要,GPIO作为整个STM32 ...

  3. STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...

  4. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  5. STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读

    记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...

  6. STM32学习笔记 | 引起电源和系统异常复位的原因

    关注+星标公众号,不错过精彩内容 每一块处理器都有复位的功能,不同处理器复位的类型可能有差异,引起复位的原因也可能有多种. STM32的复位功能非常强大,可通过软件.硬件和一些事件触发系统复位,而且通 ...

  7. 《STM32学习笔记》4——核心功能电路与编程(下)

    接上文,文中的图片,大多数来自视频的截图(来自洋桃电子). 欢迎大家批评指正! STM32学习笔记-专栏 文章目录 一.蜂鸣器驱动 1.蜂鸣器介绍 2.蜂鸣器电路 3.蜂鸣器程序 二. MIDI 音乐 ...

  8. STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    本篇文章包含的内容 一.输入捕获 1.1 输入捕获简介 1.2 输入捕获通道的工作原理 1.3 输入捕获的主从触发模式 1.4 输入捕获和PWMI结构 二.频率的测量方法 2.1 测频法 2.2 测周 ...

  9. STM32学习笔记(15)——SPI协议

    STM32学习笔记(15)--SPI协议 一.SPI协议简介 1. 物理层 2. 协议层 (1) 通讯的开始与停止 (2)时钟极性CPOL.时钟相位CPHA 二.STM32的SPI外设 1. 通讯引脚 ...

  10. STM32学习笔记(13)——模数转换ADC

    这个月一直忙于准备考试,已经考完一半科目了,偷闲写了这篇文章.因为还没考完试,估计还得咕一段时间了. STM32学习笔记(13)--模数转换ADC 第一部分:ADC功能框图 一.输入电压 二.输入通道 ...

最新文章

  1. 〖Android〗Android App项目资源字符串检查(检查是否缺少对应的翻译,导致系统切换语言后崩溃)...
  2. springboot数据源不正确_springboot配置多数据源
  3. UNIX网络编程——TCP/IP简介
  4. SpringBoot入门:新一代Java模板引擎Thymeleaf(理论)
  5. Ruby file操作cheatsheet
  6. 想加入IT行业为何建议你学Python,学完真值!
  7. 程序员,别说你只会增删改查.....
  8. 多少并发量算高并发_Linux服务端最大并发数是多少?
  9. HBase 的(伪)分布式安装
  10. node.js的安装教程
  11. Java生成二维码QRCode(亲测可通过扫码枪扫出)
  12. cadence Virtuoso ADE原理图AnalogLib库中的switch使用
  13. 事后诸葛亮分析(小小大佬带飞队)
  14. 【Java书笔记】:《Redis 深度历险:核心原理和应用实践》分布式锁,延时队列,位图,HyperLogLog,布隆过滤器,漏斗限流,GeoHash,Scan,管道,事务,主从,Redis源码
  15. Gabor滤波器详解
  16. 未成年人勿进 谨以献给1980~1990出生的人(二)
  17. 资料外泄:给系统管理者的警告
  18. 按位取反(符号:~)
  19. 云计算迎来黄金十年,新风向标在哪里?
  20. 【机器学习概率统计】09 推断未知:统计推断的基本框架

热门文章

  1. shp地图如何导入奥维地图手机_如何将CAD图导入到手机版奥维互动地图
  2. 【原创】ESXI获取虚拟机的moid,并使用VMRC登录远程虚拟机
  3. 怎样用UE4把一个Actor直接打包成Pak
  4. Javascript学习
  5. 数字单片机的技术发展
  6. 交互式电子杂志_XFlip Enterprise(电子杂志相册制作器)
  7. H3C交换机定时重启配置方法
  8. visio一分二的箭头_Microsoft Office Visio绘画双箭头直线的具体步骤介绍
  9. 统一管理所有随机启动的应用程序
  10. 2022新版完整版青龙面板对接机器人,傻妞对接onebot(oicq)协议实现机器人功能