比特说串口编程
发布日期:2021-06-29 02:32:01 浏览次数:2 分类:技术文章

本文共 2772 字,大约阅读时间需要 9 分钟。

要说一种植物,从种子发芽开始.要说计算机,从源头开始.

 

1.X系列的文章中,我们从最开始的灯泡的例子开始,一步步深入,知道了CPU是怎么工作的,配合内存可以自动工作。

 

前面的内容基本上是CPU工作原理的完整轮廓了。

 

我们知道现在使用的各种形态的计算机除了CPU还有很多别的设备,这些所有的设备都不在CPU里面,都是外部设备,简称:外设。常见外设有:键盘,鼠标,屏幕,或者触摸屏......这些都是按照功能划分的。

 

我们关注的是计算机的工作原理,对外设的分类当然按照工作原理划分为:串口设备,USB设备,PCIE设备,网络设备等等。这些设备都是在一种通信设备的基础上实现不同的功能,这样外设和CPU就能联合工作了,我们看到鼠标和键盘都可以是USB设备,通过USB传送鼠标的移动和点击、键盘的按下按键。如果我们知道知道了一种通信方式,那不同设备,我们看起来就没那么多差别了,都是和CPU传输数据而已。

 

这就好比,马路上跑着各种汽车,这汽车,那汽车,看得人眼花缭乱。但是如果拆掉装饰和外壳,就能看清它们真实的汽车本质。都是在汽车(发动机+轮子)的基础上实现的不同功能。

 

所有的学习都要看清本质,化繁为简。(敲黑板,这是比特第二定律!还记得比特第一定律是什么?)

 

那让我们就从CPU和外设通信最基础最常用的串口开始吧。

 

要说串口就不得不提通信。

 

 

 

通信

 

通信是什么?

 

字面意思很好理解:就是可以把信从一个地方A送到另外的地方B,A和B送信的路是通的。通信的本意就是这样。

 

只不过随着技术发展,电报,电话,QQ,微信等替换了写信,人们还延续之前的叫法,其实人们并不关心用那种形式把信息从A传递到B,关心的是信息的内容。

 

计算机中的通信也是一样的,把信息从A传送到B(CPU到外设,或者外设到CPU,等等),并且也有很多种传送形式。

 

简单说说2种最基本的通信形式:并行和串行通信。

 

 

 

 

并行

 

你看这个名字取的那叫个形象阿。

 

并行是什么意思?并排行走。就是说从A到B要送8封信,就有8个邮递员每人拿1封信,并排行走在马路上,从A走到B。(思维敏捷的你是不是想说:那为什么不让一个邮递员拿8封信?不行,有很多理由:珍贵的易碎品必须专人护护送;信太重,一个人拿不动2封;从A到B要过一座桥,拿2个危险......总之就是不能,一人只能拿一封信)

 

这个并行送信有什么问题呢?很显然,8个人并排走比较占地方,需要路修的比较宽,修得窄就没法这样送。

 

并行通信在计算机中是这样:

CPU端有个寄存器,外设端也有个寄存器,并行通信就是两边的寄存器每一位都有导线连接,数据可以从CPU传送到外设,也可以从外设传送回来。

 

 

 

串行

 

再一次夸一下名字取的好。(很多时候我们可以通过名字理解一个事物的本质)

 

串行:排成一串行走。有了上面并行送信的例子,你应该已经知道什么是串行送信了。就是送信的邮递员走成一串(哈哈哈,好像走路叫一串,不太礼貌,意思到就好哈),这样就能解决并行送信需要很宽的路的问题。突然理解了当年上幼儿园的时候老师为什么让我们走成一串了,原来是因为校门太窄了阿(机智.gif)。

 

串行通信在计算机中是这样:

只用一根导线连接CPU端和外设端就可以让两边通信。

 

为什么画了一条斜线?这是为了便于理解:你可以把斜线想象成一条管道,数据通过管道流动,CPU端最下面的0最先进入管道,后面紧跟着1。流过管道,0最先出管道,掉到了外设端寄存器的最下面,接着1紧跟在后面。串行通信外设端接收到的数据和CPU端发送的数据是一样的。

 

不同于并行通信每个bit都有连线,串行通信只有一条连线,所有的数据要依次通过这条连线,顺序不能乱。

 

 

 

 

能双向传输吗?

 

能不能双向传输,这个问题同时存在于并行通信和串行通信,我们这里只讨论串行通信,并行通信原理是类似的。

 

我们先看看上图中的串行通信可以双向传输吗?如果把那一条连线看作管道,那水可以从CPU端流到外设端,也可以从外设端流到CPU端。这说明了可以双向传输。

 

那双向能同时传输吗?看起来不能,如果水往一边流就不能同时往另一边流。只能一边传送完了再从另一边传送,这种2端能互相传输数据,但是不能同时工作的通信有一个专有的名字:半双工通信(个人觉得这个名字取的不是很利于初学者理解)。

 

如果想让两边可以同时传输,那该怎么办?

 

计算机中用到的理论很多其实是很朴素的,就是生活中人们常用的处理方式。

 

我们认为通信的连线是管道,或者马路,看看管道和马路是怎样解决同时双向工作的?对了,马路是改成双向车道,增加了马路宽度;管道是增加一个反向传输的管道。

 

那么对于串行通信,也只要增加一条通路就可以了。一条通路从CPU端传输数据到外设端,另一条通路从设备端传输数据到CPU端。这种可以双向工作的通信也有一个专用的名字:全双工通信。

这就能同时双向传输数据了,两端都有专门用来发送数据的寄存器和专门用来接受数据的寄存器(图中箭头的方向从发送端指向接收端)

 

注意:CPU端发送寄存器连接外设端接收寄存器,CPU端接收寄存器连接外设端发送寄存器,是交叉的。

 

 

为了方便,我们给寄存器取个名字,发送寄存器叫:TX寄存器,接收寄存器叫:RX寄存器。

 

 

 

串口编程

 

要想利用编程控制串口发送或接收数据,我们只需要关心CPU端就好。

 

首先,回忆一下之前我们是如何编程的。

 

我们用不同的指令操作CPU内部寄存器,内存地址,或者直接操作数字。如何操作串口寄存器呢?

 

我们知道内存其实和寄存器的工作原理是差不多的,那串口寄存器的操作可否与内存用同样的方式操作?答案是肯定的,只要把串口寄存器加入内存地址编号,那就可以和访问内存一样访问串口寄存器了。

 

但是要注意的是,串口寄存器其实和内存是不一样的。对于串口寄存器TX,CPU只能将要发送的数据写入寄存器,数据就会被发送出去,不能读这个寄存器;对于RX寄存器,CPU只能读取该寄存器以获取外设传来的数据,不能写该寄存器。而内存的每个地址都可以写入和读取。这要在编程中注意。

 

我们简化一下CPU端的编程模型:

假设TX寄存器在内存地址24,RX寄存器在内存地址25。

如果我们要读取外设传来的数据,只要读取RX就可以了。用汇编语言编程:

  •  
LDR R0 [25];

这样就把RX寄存器(地址25)中的数据读到R0了。

 

如何发送数据呢?

额,我们好像还没有写内存地址的指令,好吧,现在需要加一条写内存地址的指令STR。

 

有了STR指令,我们可以很轻松的把接收到R0的数据再通过TX寄存器(地址24)转发出去:

  •  
STR R0 [24];

 

对外设的操作也是读写内存地址!

现在看起来操作CPU也不是很困难,就是操作寄存器和内存地址。

 

好了,串口的原理和编程就到这里。

----------我是比特,一个想把问题搞清楚的青年才俊----------

 

转载地址:https://blog.csdn.net/yyyyyyyyyywwwwwwwwww/article/details/108908956 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:[esp8266]网页控制GPIO
下一篇:git常用操作--分支

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月14日 21时32分54秒