晶振的作用,高速晶振优缺点

news2024/11/16 0:24:30

前言

(1)我们都知道晶振是一款MCU的心脏,因为长期用这种抽象的概念进行解释,导致很多人不知道这个心脏的实际作用。因此,我在这里详细的介绍一下晶振对于MCU的实际作用。
(2)接下来我将会在MCU处理能力,功耗,通讯速度,定时器精度等角度来探讨。

晶振对MCU处理速度影响

机器周期和指令周期是啥

(1)在讲解晶振对于MCU的处理能力之前,不得不需要了解两个术语——机器周期,指令周期。
(2)那么机器周期和指令周期是什么呢?那么我们以stc89c52的软件延时为例,进行讲解。
(3)首先,我们需要知道机器周期是什么。机器周期就是晶振的倒数,比如,stc89c52的常用晶振为12MHZ,那么他此时的晶振周期为

1 12 ∗ 1 0 6 S \frac{1}{12*10^{6}} S 121061S

(4)而stc89c52有的指令周期可以选择6机器周期或者12机器周期一般来说默认12机器周期。因此,我们就可以计算出stc89c52的指令周期为

1 12 ∗ 1 0 6 ∗ 12 = 1 1 0 6 S = 1 u s \frac{1}{12*10^{6}} * 12 = \frac{1}{10^{6}} S = 1us 12106112=1061S=1us

如何根据指令周期计算每条汇编的执行时间

(1)指令周期是一个啥玩意呢?我们现在可以看汇编指令了,在汇编中,有些指令只需要执行一个指令周期,有些指令需要两个指令周期,有些需要三个。那么根据这个,我们就可以知道每条指令执行的时间了。
(2)我现在打开宏晶公司的工具,查看到STC89C52的汇编执行时间。注意:这里的单位是机器周期,而不是指令周期

在这里插入图片描述

(3)我们通过宏晶公司的工具,软件生成延时1us的程序,发现就是一个NOP指令。这指令无作用,就是做一个指令周期的延时。所以延时1us就是一个NOP。

在这里插入图片描述

(4)如果此时我们需要延时10us,查看结果是怎么样的。
<1>NOP执行一个指令周期,RET两个指令周期。最终算出来的结果应该是8个指令周期,也就是8us。
<2>这个时候有人就会问了,为什么是8us呢?不应该是10us吗?想必学过51单片机延时部分的同学就知道,51单片机的软件延时并不准确,所以他每条指令可能执行完之后,会略微的大于1us,最终误差累积起来,所以只需要8个指令周期,就会近似延时10us。

DELAY10US:			;@12.000MHz
	NOP     
	NOP   2
	NOP
	NOP   2
	NOP
	NOP   2
	RET   2

(5)现在我们再进行一个50us的延时函数,看看宏晶给我们生成的代码是什么?
<1>查阅STC-Y1指令集,可以知道他们所占用的指令周期是多少。(标注在后面的数字)
<2>通过计算发现,实际上其实只邹了47个指令周期,近似50us。

DELAY50US:			;@12.000MHz  
	PUSH 30H                     2          
	MOV 30H,#20                  1
NEXT:                            
	DJNZ 30H,NEXT                2 * 20 =40
	POP 30H                      2
	RET                          2

(6)
<1>现在我们对于晶振和MCU执行速度有了一个简单了解之后。现在我们把12MHZ晶振换成更加常用的11.0592试试,此时生成一个10us的代码。
<2>我们会发现,执行的代码变少了!这说明什么,相同时间段内,越高频率的晶振,所能执行的指令越多。

DELAY10US:			;@11.0592MHz
	NOP
	NOP
	NOP
	NOP
	NOP
	RET

(7)既然高频晶振能够提高MCU指令执行速度,那么我们可不可也无脑提高晶振频率呢?答案显然是不可以的,一款MCU是由指定最高频率的,如果超频,会导致MCU运行不稳定,
(8)既然高频晶振可以提高MCU的执行速度,那么我就每次将他提高的MCU最大接受的频率呗。很可惜,不对。MCU系统时钟越快,功耗越大,对于一些低功耗的产品,不需要过高的系统时钟。

结论

优点:高频晶振可以提高MCU对指令的处理速度,但是MCU有最高系统时钟限制,超频容易导致程序运行出现故障。
缺点:过高的系统时钟,会导致功耗过高。

晶振对串口通讯的影响

(1)从上面的例子我们可以看出,12MHZ不但可以提高代码执行速度,最终产生的时间相对准确。为什么还需要一个11.0592MHZ晶振呢?
(2)这个就串口波特率有关了。我们都知道,串口波特率常用的有115200,9600等。
(3)串口波特率计算公式如下,一般我们选用方式1进行波特率发生器

(4)现在我们知道了串口波特率发生的公式,开始计算,会发现11.0592MHZ产生的波特率是没有任何误差的。而如果是12MHZ的晶振,就很容易产生误差,而且随着时间的累积,误差会越来越大。
(5)
<1>因为怕有人无法理解下面这张图,所以我直接以11.0592生成波特率9600为例,注意,我是采用的方式1,SMOD为0。
<2>最终算出来TH1为253,对于16进制的0xFD。
<3>根据下图,我们能够明显的发现,11.0592产生的波特率效果很好,所以我们一般使用11.0592作为51单片机的晶振。

2 0 32 ∗ 11.0592 ∗ 1 0 6 12 ∗ ( 256 − T H 1 ) ) = 9600 \frac{2^{0}}{32} * \frac{11.0592*10^{6}}{12*(256-TH1))} = 9600 322012(256TH1))11.0592106=9600

在这里插入图片描述

晶振对定时器精度影响

(1)上面说了,11.0592MHZ 晶振能够产生非常准确的波特率。那么12MHZ除了能够让MCU执行速度提高,能够精确的产生什么吗?
(2)当然可以,如果51单片机的晶振给12MHZ,一般51单片机的定时器默认对晶振进行12分频,那么定时寄存器数值每次跳变都是1us。而如果晶振是11.0592,那么定时器寄存器每次跳变的时间就是12/11.0592us。很明显,12MHZ下的定时器产生的时间相对准确一点。
(3)
<1>因为怕各位基础太差,我现在举个例子。假设,我的51单片机晶振给的是12MHZ,要进行100us定时。
<2>我们会发现TH0是0xFB,TL0是0x50。换算成十进制,就是64336,而STC89C52的定时器是向上计数的。那么实际计数值为65536-65535=100。而前面说了,12MHZ的晶振下的定时器值每次跳变都是1us,刚刚好。

在这里插入图片描述

(4)
<1>同样是100us,我们试试11.0592MHZ下的值是多少。
<2>我们会发现TH0是0xFF,TL0是0xA4。换算成十进制,就是65444,实际计数是92。
<3>而11.0592MHZ下的定时器值每次跳变都是12/11.0592us,最终计算公式如下:
12 11.0592 ∗ 92 ≈ 99.826 u s \frac{12}{11.0592} * 92 \approx 99.826 us 11.0592129299.826us

在这里插入图片描述

总结

因此,我们可以看出,晶振的选取不是一味的追求高频,每一种晶振都有其好处。在选择过程中,我们应当按需选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/697552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一零六一、Jupyter notebook文件默认路径修改方法

1 .打开 Anaconda Prompt&#xff0c;输入命令 jupyter notebook --generate-config 根据上面运行处的路径打开 C:\Users\WW.jupyter\jupyter_notebook_config.py文件&#xff0c;可以使用记事本打开。 2 .直接CtrlF 搜索 &#xff0c;找到 #c.NotebookApp.notebook_dir ‘’…

Spring 2023面试题(2)--Spring mvc 运行流程

1. Spring MVC的运行流程主要包括以下步骤&#xff1a; 用户发送请求到前端控制器&#xff08;DispatcherServlet&#xff09;。前端控制器接收到请求后&#xff0c;初始化处理器映射器&#xff08;HandlerMapping&#xff09;和处理器适配器&#xff08;HandlerAdapter&#…

Crypto(小学期培训)

你被骗了 url编码直接解 进入网站、找到时间 flag{2020-01-01 07:43:23} 梅开二度 凯撒密码 y和h相差17 三羊开泰 词频分析 这是&#xff1f;&#xff1f;&#xff1f; 010编辑器打开 上面是密文 下面是密码表64个&#xff0c;想到base64 找到原来的数值 与之对应&a…

JVM GC ROOT分析与垃圾收集器原理分析(三)

目录 一、GC ROOT 1、虚拟机栈中的本地变量 2、static 成员 3、常量引用 4、本地方法栈中的变量 5、类加载器 6、线程 二、回收算法 1、标记和清除 2、复制算法 3、标记整理 三、垃圾收集器 1、新生代-复制算法 2、老年代-标记清除/整理 3、垃圾收集器分类 1、…

Python如何向一个空列表中append列表

最近在做回溯组合问题时–力扣链接&#xff0c;遇到了向一个空列表中append多个列表。 于是&#xff0c;我原来的代码是&#xff1a; def main(n,k):result []temp []def backtrack(n,k,startIndex):if(len(temp)k):result.append(temp)returnfor i in range(startIndex,n1)…

group by rollup

group by rollup rollup与group by组合使用可对分组结果进行进一步的汇总(相当于对分组结果加一行小计)。 mysql : SELECT CASE WHEN GROUPING(姓名)1 THEN 总计 ELSE 姓名 END AS 姓名, SUM(数值1) 统计数值1, SUM(数值2) 统计数值2 FROM 表名 GROUP BY 姓名 WITH ROLLUPora…

SpringCloud微服务项目实战(一)---搭建SpringBoot项目

目录 SpringBoot与SpringCloud的关系环境配置开始搭建SpringBoot项目问题总结 SpringBoot与SpringCloud的关系 Spring Boot主内&#xff0c;能够快速搭建&#xff0c;快速开发单个微服务&#xff0c;搞定了数据层访问、RESTful 接口、日志组件、内置容器等等基础功能Spring Cl…

shardingsphere-proxy 实现mysql单库分表

1、docker安装mysql5.7版本 拉取mysql的镜像 docker pull mysql:5.7创建mysql的配置目录&#xff0c;日志目录&#xff0c;数据存储的目录 mkdir -p /home/sunyuhua/docker/mysql/conf mkdir -p /home/sunyuhua/docker/mysql/logs mkdir -p /home/sunyuhua/docker/mysql/dat…

微信小游戏:超大数值计算

测试代码&#xff1a; import {large_number} from "./large_number";const {ccclass, property} cc._decorator;ccclass export default class NewClass extends cc.Component {property(cc.Label)label: cc.Label null;propertytext: string hello;// LIFE-CYCL…

操作符重载的概念

下面的复数解决方案是否可行&#xff1f; Add 函数可以解决 Complex 对象相加的问题&#xff0c;但是 Complex 是现实世界中确实存在的复数&#xff0c;并且复数在数学中的地位和普通的实数相同 为什么不能让 操作符也支持复数相加呢&#xff1f; 操作符重载 C 中的重载能够…

四、OkHttp_连接池

预备知识 通常我们进行HTTP连接网络的时候我们会进行TCP的三次握手&#xff0c;然后传输数据&#xff0c;然后再释放连接。 大量的连接每次连接关闭都要三次握手四次分手的很显然会造成性能低下&#xff0c; 因此http有一种叫做keep-alive connections的机制&#xff08;HTTP1…

【每日一题】Leetcode - 10. 正则表达式匹配

题目 Leetcode - 10. 正则表达式匹配 解题思路 预处理正则表达式&#xff0c;合并同项&#xff0c;比如: "a * b * c * . * " -> " . * "更加预处理后的正则表达式&#xff0c;构建NFA通过NFA状态转移条件一个一个匹配字符串字符不匹配的状态要回退匹…

【统一安全管控平台】4A解析

文章目录 一、统一帐号&#xff08;Account&#xff09;二、统一认证(Authentication)三、统一授权(Authorization)四、统一审计(Audit)参考&感谢 4A是指帐号&#xff08;Account&#xff09;、认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization…

mysql8.0新特性详解

一、my.ini或my.cnf的全局参数 一个连接最少占用内存是256K&#xff0c;最大是64M&#xff0c;如果一个连接的请求数据超过64MB&#xff08;比如排序&#xff09;&#xff0c;就会申请临时空间&#xff0c;放到硬盘上。 #最大连接数 max_connections3000 #最大用户连接数 max_…

智能饮品机器人的市场现状与前景未来,点赋科技与您共同期待

引言&#xff1a; 近年来&#xff0c;智能饮品机器人行业迅猛发展&#xff0c;成为引人瞩目的新兴市场。然而&#xff0c;这个行业的市场现状到底如何&#xff1f;它的前景又将如何发展&#xff1f;让点赋科技带大家一起来看看。 市场现状&#xff1a; 智能饮品机器人市场在过去…

解锁高效部署!快速搭建Kubernetes集群,提升团队生产力!

1 MacOS 1.1 下载 docker-desktop 从 docker 下载 docker-desktop (opens new window)&#xff0c;并完成安装 1.2 启用 k8s 集群 启动 docker-desktop&#xff0c;打开preference 面板 切换到 Kubernetes 标签页&#xff0c;并勾选启动 Enable Kubernetes&#xff0c;点击…

nginx 入门 (b站IT楠老师学习笔记)

文章目录 Nginx 入门 &#xff08;b站IT楠老师学习笔记&#xff09;一 基础了解1、下载nginx安装包2. nginx 可以提供的服务3. nginx 的优点4. 应用场景 二 实战2.1 基础检查以及配置文件结构了解2.2 main全局配置2.3 events模块2.4 http服务器配置2.5虚拟主机配置详解2.5.1 ht…

el-pagination分页查询封装

需求&#xff1a;因为需要用到表单查询的地方太多了&#xff0c;所以为了避免每个页面都写分页组件&#xff0c;直接封装好调用就完事了&#xff0c;简简单单 1.创建Pigination.vue公用组件 <template><div :class"{hidden:hidden}" class"paginatio…

AD中修改一个元器件的所有焊盘大小

1.首先&#xff0c;选中其中一个焊盘。 2.查找相似对象 3.修改component为same 4.修改X size和Y size为same 5.确定 6.修改Pad Stack中的x/y 注&#xff1a;component可以不用改为same&#xff0c;用any就是查找和这个焊盘大小类似的对象。

力扣1768.交替合并字符串(java模拟法)

题目描述&#xff1a; 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符串的末尾。 返回 合并后的字符串 。 问题分析&#xff1a; 我们可以直…