STM32-USART串口外设(二十三)

USART串口外设

就是通用同步异步收发器。这个 S 就是同步的意思啊。另外我们经常还会遇到串口叫 UART, 这里少了个 S, 就是异步收发器。一般我们串口很少使用这个同步功能哈,所以 USART 和 UART 使用起来也没什么区别。其实这个 STM32 的 USART 同步模式啊,只是多了个时钟输出而已。它只支持时钟输出,不支持时钟输入啊。所以这个同步模式更多的是为了兼容别的协议或者特殊用途而设计的哈,并不支持两个 USART 之间进行同步通信,所以我们学习串口主要还是异步通信啊。

然后继续看下一条, USART 是 STM32 内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从 TX 引脚发送出去,也可自动接收 RX 引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。看完这句, USART 外设是干什么工作的就应该了解了吧?我们之前学习了串口的协议,串口主要就是靠收发这样的约定好的波形来进行通信的,那这个 USART 外设就是串口通信的硬件支持电路。 USART 大体可以分为发送和接收两部分,发送部分就是将数据寄存器的一个字节数据自动转换为协议规定的波形啊,从 TX 引脚发送出去。接收部分就是自动接收 RX 引脚的波形,按照协议规定解码为一个字节数据存放在数据寄存器里,这就是 USART 电路的功能。当我们配置好了 USART 电路,直接读写数据寄存器就能自动发综合接收数据的,使用还是非常方便的啊。

接着继续看下一条,自带波特率发生器,最高达 4.5 兆 b 每秒。这个波特率发生器啊就是用来配置波特率的。它其实就是一个分频器哈,比如我们 APP2 总线给个 72 兆赫兹的频率,然后波特率发生器进行一个分频得到我们想要的波特率时钟,最后在这个时钟下进行收发,就是我们指定的通信波特率。

然后继续,可配置数据位长度八或九,停止位长度零点五或一或一点五或二。这些就是 STM32 USART 支持配置的参数了。这个数据位长度就是我们前面这里的参数啊,有八位和九位,是包含既有校验位的长度啊。一般不需要校验位就选八位,需要校验位就选九位。停止位长度支持这么多种停止位啊,也就是这里的,在进行连续发送时,停止位长度决定了帧的间隔。我们最常用的就是一位停止位哈,其他的很少用。

然后下面就是可选校验位,无校验、奇校验或偶校验。有关奇偶校验啊我们之前也讲过,这里我们最常用的是无校验。那以上这些所有的参数啊,都是可以通过配置寄存器来完成的。使用库函数配置的话就更简单了,直接给结构体赋值就行。串口参数啊我们最常用的就是波特率9600 或者 115200, 数据位 8 位,停止位一位无校验。一般我们都选这种常用的参数啊,不用纠结的,选它就是。

那继续看下一条,支持同步模式、硬件流控制、 DMA、智能卡、 I2DA、 LIN。这个同步模式啊就是多了个时钟 CLK 的输出啊。硬件流控制这个是,比如 A 设备有个 TX 向 B 设备的 RX 发送数据, A 设备一直在发,发的太快了, B 处理不过来,如果没有硬件流控制,那 B 就只能抛弃新数据或者覆盖原数据了。如果有硬件流控制,在硬件电路上会多出一根线。如果 B 没准备好接收,就置高电平。如果准备好了,就置低电平。 A 接收到了 B 反馈的准备信号,就只会在 B 准备好的时候才发数据。如果 B 没准备好,那数据就不会发送出去。这就是硬件流控制啊,可以防止因为 B 处理慢而导致数据丢失的问题。硬件流控制 STM32 也是有的啊,不过我们一般不用,需要的话可以了解一下。之后 DMA 是这个串口支持 DMA 进行数据转运啊,如果有大量的数据进行收发,可以使用 DMA 转运数据,减轻 CPU 的负担。 DMA 我们上节学过哈,应该好理解吧。最后智能卡、 IrDA、 LIN 这些是其他的一些协议哈,因为这些协议和串口是非常的像,所以 STM32 就对 USART 加了一些小改动,就能兼容这么多协议了。不过我们一般不用哈,像这些协议哈我也都没用过。这个智能卡应该是跟我们刷的饭卡、公交卡这些有关的。 IrDA 是用于红外通信的哈,这个红外通信就是一个红外发光管另一边是红外接收板,然后靠闪烁红外光通信,反正我是没见过实物哈。这个 IrDA 并不是我们遥控器的那个红外通信哈,所以并不能模拟遥控器。 LIN 是局域网的通信协议,这个感兴趣的话自己研究一下哈,我们本节不会用到。

最后看一下我们这个芯片的 USART 资源, STM32F103C8T6 的 USART 资源有 USART1、 USART2、 USART3,总共三个独立的 USART 外设,可以挂载很多串口设备啊。其中这里 USART1 是 A PP2 总线上的设备啊,剩下的都是 APP1 总线的设备。这个就开启时钟的时候注意一下哈,在使用的时候挂载哪个总线影响并不是很大哈。好那这些就是关于 STM32 内部的 USART 外设的东西介绍了。

接下来我们来看一下 USART 的框图。这个框图大家第一眼看上去还是非常复杂的是吧?线路框框啊,这个还是挺多的。但是实际上主要部分也没有很多啊,他这里就是把各个寄存器和寄存器每一位控制的地方都画出来了,所以才显得比较乱。我们看的时候可以先忽略这些寄存器哈,先看主体结构。

那我们来看一下,先看左上角这里的引脚部分,这里有 TX 和 RX, 这两个就是发送和接收引脚。下面这里的 SWRX、 IrDA Out、 In 啊,这些是智能卡和 IrDA 通信的引脚,我们不用这些协议哈,所以这些引脚就不用管它。右边这个框框, IrDA、 SIR 这些东西也都不用管它。

引脚这块 TX 发送角就是从这里接出去的,RX 接收角就是通向这里,这样就行了。

然后看一下右边这一块,这部分就是串口的数据寄存器了,发送或接收的字节数据就存在这里,上面是有两个数据寄存器,一个是发送数据寄存器 TDR,另一个是接收数据寄存器 RDR,这两个寄存器占用同一个地址哈,就跟 51 单片机串口的 SBUF 寄存器一样,在程序上只表现为一个寄存器,就是数据寄存器 DR,但实际硬件中是分成了两个寄存器啊,一个用于发送 TDR,一个用于接收 RDR,TDR 是只写的,RDR 是只读的,当你进行写操作时,数据就写到了 TDR,当你进行读操作时,数据就是从 RDR 读出来的,这个了解一下,然后往下看,下面是两个移位寄存器,一个用于发送,一个用于接收发送移位寄存器的作用就是把一个字节的数据一位一位的移出去,正好对应串口协议的波形的数据位,

这两个寄存器是怎么工作的呢?举个例子啊,比如你在某时刻给 TDR 写入了 0x55,这个数据在寄存器里就是二进制存储 01010101,那么此时硬件检测到你写入数据了,它就会检查当前移位寄存器是不是有数据正在移位,如果没有,这个 01010101 就会立刻全部移动到发送移位寄存器准备发送,当数据从 TDR 移动到移位寄存器时,会置一个标志位啊,叫 TXE 发送寄存器空,我们检查这个标志位,如果置一了,我们就可以在 TDR 写入下一个数据了,注意一下啊,当 TXE 标志位置一时,数据其实还没有发送数据,只要数据从 TDR 转移到发送移位寄存器了,TXE 就会置一,我们就可以写入新的数据了,然后发送移位寄存器就会在下面这里的发送器控制的驱动下向右移位,然后一位一位的把数据输出到 TX 引脚,

这里是向右移位的哈,所以正好和串口协议规定的低位先行是一致的,当数据移位完成后,新的数据就会再次自动的从 TDR 转移到发送移位寄存器里来,如果当前移位寄存器移位还没有完成,TDR 的数据就会进行等待,一旦移位完成,就会立刻转移过来,有了 TDR 和移位寄存器的双重缓冲哈,可以保证连续发送数据的时候,数据帧之间不会有空闲,提高了工作效率。简单来说啊,就是你数据一旦从 TDR 转移到移位寄存器了,管你有没有移位完成,我就立刻把下一个数据放在 TDR 等着,一旦移完了,新的数据就会立刻跟上,这样做效率就会比较高对吧?

然后看下接收段,这里也是类似的哈,数据从 RX 引脚通向接收移位寄存器,在接收器控制的驱动下一位一位的读取 RX 电平,先放在最高位哈,然后往右移,移位八次之后就能接收一个字节了,

同样,因为串口协议规定是低位先行,所以接收移位寄存器是从高位往低位这个方向移动的,之后,当一个字节移位完成之后,这一个字节的数据就会整体的一下子转移到接收数据寄存器 RDR 里来,在转移的过程中也会置一个标志位啊,叫 RXNE 接收数据寄存器非空,当我们检测到 RXNE 置一之后,就可以把数据读走了,

同样这里也是两个寄存器器进行缓存,当数据从移位寄存器转移到 RDR 时,就可以直接移位接收下一帧数据了,这就是 USART 外设整个的工作流程。

其实讲到这里,这个外设的主要功能就差不多了哈,大体上就是数据寄存器和移位寄存器,发送,移位寄存器往 TX 引脚移位,接收,移位寄存器从 TX 引脚移位,当然发送还需要加上针头针尾啊,接收还需要剔除针头针尾啊这些操作,它内部有电路会自动执行哈,我们知道有硬件帮我们做了这些工作就行了,

接着我们继续看一下下面的控制部分和一些其他的增强功能哈,下面这里是发送器控制,它就是用来控制发送移位寄存器的工作的,接收器控制用来控制接收移位寄存器的工作,然后左边这里有一个硬件数据流控,也就是硬件流控制哈,简称流控,前面我们也大概介绍过哈,如果发送设备发的太快,接收设备来不及处理,就会出现丢弃或覆盖数据的现象,那有了流控就可以避免这个问题了,这里流控有两个硬件,一个是 N R T S,一个是 NCTS,NRTs 是请求发送,是输出脚,也就是告诉别人我当前能不能接收,NCTS 是清除发送,是输入脚,也就是用于接收别人 NRTs 的信号的

这里前面加个 N 意思是低电平有效啊,那这两个引脚怎么玩的呢?首先得找另一个支持流控的串口,他的 TX 接到我的 RX,然后我的 RTS 要输出一个能不能接收的反馈信号,接到对方的 CTS,当我能接收的时候,RTS 就置低电平请求对方发送,对方的 CTS 接收到之后就可以一直发哈,当我处理不过来时,比如接收数据寄存器我一直没有读,又有新的数据过来了,现在就代表我没有及时处理,那 RTS 就会置高电平,对方 CTS 接收到之后就会暂停发送,直到这里接收数据寄存器被读走,RTS 置低电平,新的数据才会继续发送。

那反过来,当我的 TX 给别人发送数据时,我们 CTS 就要接到对方的 RTS,用于判断对对方能不能接收,TX 和 CTS 是一对的哈,RX 和 RTS 是一对的,CTS 和 RTS 也要交叉连接哈,这就是流控的工作模式,当然我们一般不使用流控啊,所以流控就了解一下就行,

接着继续看右边这个模块,这部分电路用于产生同步的时钟信号,它是配合发送移位寄存器输出的哈,发送寄存器每移位一次同步时钟电平就跳变一个周期时钟,告诉对方啊,我移出去一位了,你看要不要让我这个时钟信号来指导你接收一下,当然这个时钟只支持输出啊,不支持输入,所以两个 USART 之间不能实现同步的串口通信,

那这个时钟信号有什么用呢?第一个用途就是兼容别的协议,比如串口加上时钟之后,就跟 SPI,SPI 协议特别像,所以有了时钟输出的串口就可以接入 SPI,另外这个时钟也可以做自适应波特率哈,比如接收设备不确定发送设备给的是什么波特率,那就可以测量一下这个时钟的周期,然后再计算得到波特率,不过这就需要另外写程序来实现这个功能了,这个时钟功能我们一般不用,所以也是了解一下就行,

然后继续看中间这个唤醒单元,这部分的作用是实现串口挂载多设备,我们之前说啊,串口一般是点对点的通信,点对点只支持两个设备互相通,想发数据直接发就行,而多设备在一条总线上可以接多个从设备,每个设备分配一个地址,我想跟某个设备通信,就先进行寻址,确定通信对象,再进行数据收发,那回到这里,这个唤醒单元就可以用来实现多设备的功能,在这里可以给串口分配个地址,当你发送指定地址时,此设备唤醒开始工作,当你发送别的设备地址时,别的设备就唤醒工作,这个设备没收到地址就会保持沉默,这样就可以实现多设备的串口通信了,这个部分功能我们一般不用啊,大家也了解一下就行,

接着看下面这部分,是中断输出控制,中断申请位啊,就是状态寄存器这里的各种标志位状态寄存器这里有两个标志位比较重要啊,一个是 TXE 发送寄存器空,另一个是 RXNE 接收寄存器非空,这两个是判断发送状态和接收状态的必要标志位,刚才也都讲过啊,

剩下的标志位了解一下就行。中断输出控制这里就是配置中断是不是通向 NVIC,这个应该好理解

然后最下面这里是波特率发生器部分,之前我也大概说过哈,波特率发生器其实就是分频器,A P B 时钟进行分频得到发送和接收移位的时钟,

看一下这里时钟输入是 F P C,L,K X,X 等于一或二,U S A R T 一挂载在 A P B 二,所以就是 P C,L,K 二的时钟一般是 72 兆啊,其他的 U,S,A,R,T 都挂载在 A P B 一,所以是 P C L,K 一的时钟一般是 36 兆啊,之后这个时钟进行一个分屏,除一个 USART DIV 的分频系数,USART DIV 里面就是右边这样哈,是一个数值,并且分为了整数部分和小数部分,因为有些波特率啊,用 72 兆除一个整数的话可能除不尽会有误差,所以这里分频系数是支持小数点后四位的分频就更加精准了,之后分频完之后还要再除个 16,得到发送器时钟和接收器时钟通向控制部分啊然后右边这里如果 TE 为一,就是发送器使能了发送部分的波特率就有效,如果 RE 为一,就是接收器使能了接收部分的波特率就有效,

好到这里,我们这个串口的主体结构就看完了,然后剩下还有些寄存器的指示哈,比如各个 CR 控制寄存器的哪一位,控制哪一部分电路,SR 状态寄存器都有哪些标志位哈,这些可以自己看看手册里的寄存器描述哈,

最后我们再看看串口的引脚,我们看一下引脚定义表哈。

这里复用功能这一栏就给出了每个 USART 它的各个引脚都是复用在了哪个 GPIO 上的比如这里 USART2 的 TX 是 PA2 口 RX 是 PA3 口 ,USART3 的 TX 和 RX 分别是 PB10 和 PB11

然后 USART1 的 TX 和 RX 分别是 PA9 和 PA10 ,这些引脚都必须按照引脚定义里的规定来哈比如你要使用 USART1 那 TX 必须是 PA9 RX 必须是 PA10 或者看下重映射这里啊有没有重映射,这里有 USART1 的重映射所以有机会换一只口,剩下的引脚就没有机会作为 USART1 的接口了啊,所以这个表在设计电路的时候很重要啊要提前规划好引脚别让引脚复用功能冲突了,有关外设的复用引脚是哪个的问题都是看这个表哈,一看就知道这就是串口的引脚

接下来回到 PPT 继续来看哈这里看一下我给出的这个简化结构图,这就是 USART 最主要最基本的结构哈,最左边这里是波特率发生器用于产生约定的通信速率时钟,来源是 PCLK2 或 1 经过波特率发生器分频后产生的时钟通向发送控制器和接收控制器,发送控制器和接收控制器用来控制发送移位和接收移位,之后由发发送数据寄存器和发送移位寄存器这两个寄存器的配合将数据一位一位的移出去通过 GPIO 口的复用输出,输出到 TX 引脚产生串口协议规定的波形,

这里画了几个右移的符号啊,就是代表这个移位寄存器是往右移的是低位先行**,当数据由数据寄存器转移到移位寄存器时会置一个 TXE 的标志位,我们判断这个标志位就可以知道是不是可以写下个数据了**,然后接收部分也是类似的啊, RX 引脚的波形通过 GPIO 口输入在接收控制器的控制下一位一位的移入接收移位寄存器,这里画了右移的符号啊也是右移的

因为是低位先行所以要从左边开始移进来移完一帧数据后数据就会统一转运到接收数据寄存器,在转移的同时置一个 RXNE 标志位,我们检查这个标志位就可以知道是不是收到数据了,同时这个标志位也可以去申请中断啊,这样就可以在收到数据时直接进入中断函数,然后快速的读取和保存数据

那右边这实际上有四个寄存器哈,但是在软件上面只有一个 DR 寄存器,可以供我们读写写入 DR 时数据走上面这条路进行发送,读取 DR 时数据走下面这条路进行接收,这就是 USART 进行串口数据收发的过程啊最后右下角是一个开关控制,就是配置完成之后用 CMD 开启下外设啊这个也是常规操作啊,到这里 USART 的基本结构就讲完了

接下来我们来看几个细节的问题啊首先看下数据帧这个图是在程序中配置八位字长和九位字长的波形对比,这里的字长啊就是我们前面说的数据位长度,它这里的字长是包含校验位的啊,那看一下上面这个九位字长的波形第一条时序很明显就是 TX 发送或者RX接收的数据帧格式,空闲高电平然后起始位 0 然后根据写入的数据啊置一或置 0, 依次发送位 0 到位 8 加起来就是 9 位,最后停止位 1 数据帧结束,在这里位 8 也就是第 9 个位置哈是一个可能的奇偶校验位,通过配置寄存器就可以配置成奇校验偶校验或者无校验,这里可以选择配置成 8 位有效载荷加一位校验位,也可以选择 9 位全都是有效载荷啊,不过既然你选择了 9 位字长那一般都是要加上校验位的因为 8 位有效载荷正好对应一个字节,

然后下面这个时钟就是我们之前说的同步时钟输出的功能,可以看到啊这里在每个数据位的中间都有一个时钟上升沿,时钟的频率啊和数据速率也是一样的,接收端可以在时钟上升沿进行采样这样就可以精准定位每一位数据,这个时钟中的最后一位啊可以通过这个 LBCl 位控制要不要输出,另外这个时钟的极性啊相位啊什么的也可以通过配置寄存器配置啊,需要的话可以了解一下

然后下面这两个波形一个是空闲帧就是从头到尾都是一,还有一个是断开帧从头到尾都是 0 ,这两个数据帧啊是局域网协议用的啊我们串口用不着不用管的

接着下面是八位字长的波形可以看到这里的数据位是从位 0 一直到位 7 总共是 8 位哈,比上面这个少了一个位 8 同样这个最后一位位 7 也是一个可能的奇偶校验位还是同样啊既然你选择了 8 位字长那这里就最好选择无校验要不然你校验位占一位有效载荷就只剩 7 位了一个字节都发不了,这不必死强迫症吗

总的来说这里有 4 种选择, 9 位字长有校验或无校验, 8 位字长有校验或无校验。但我们最好选择 9 位字长有校验或 8 位字长无校验这两种啊

这样每帧的有效载荷都是一字节这样才舒服是吧,那最后这些时钟什么的和上面也都是类似的

接下来我们继续来看这个数据帧看一下不同停止位的波形变化, STM32 的串口哈可以配置停止位长度为 0.5 1 1.5 2 这四种,这四种参数的区别啊就是停止位的时长不一样,对应波形啊就是这样第一个是一个停止位这时停止位的时长就和数据位的一位啊时长一样然后是 1.5 个停止位这时的停止位就是数据位一位时长的 1.5 倍啊,两个停止位那停止位时长就是两倍, 0.5 个停止位时长就是 0.5 倍,这个也好理解啊就是控制停止位时长的一般选择一位停止位就行了哈其他的参数不太常用这个是停止位

那之后我们继续来看一些细节问题啊这两个图展示的是 USART 电路输入数据的一些策略啊,对于串口来说根据我们前面的介绍啊可以想到串口的输出 TX 应该是比输入 RX 简单很多哈,输出你就定时翻转 TX 引脚高低电平就行了,但是输入就复杂一些你不仅要保证输入的采样频和波特率一致还要保证每次输入采样的位置要正好处于每一位的正中间,

只有在每一位的正中间采样这样高低电平读进来才是最可靠的,如果你采样点过于靠前或靠后那有可能高低电平还正在翻转啊,电平还不稳定或者稍有误差数据就采样错了,另外啊输入最好还要对噪声有一定的判断能力如果是噪声最好能自个标个位提醒我一下这些就是输入数据所面临的问题啊

那我们来看一下 STM32 是如何来设计输入电路的呢,

首先第一个图这里展示的是 USART 的起始位侦测

当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率啊连续采样一帧数据,同时从起始位开始采样位置就要对齐到位的正中间,只要第一位对齐了后面就肯定都是对齐的啊,那为了实现这些功能首先输入的这部分电路对采样时钟进行了细分啊,它会以波特率的 16 倍频率进行采样,也就是在一位的时间里可以进行 16 次采样

然后它的策略是最开始空闲状态高电平那采样就一直是一,在某个位置突然踩到一个零,那么就说明在这两次采样之间出现了下降沿啊,如果没有任何噪声那之后就应该是起始位了在起始位会进行连续 16 次采样没有噪声的话这 16 次采样肯定就都是零啊,这没问题但是实际电路还是会存在一些噪声的,所以这里即使出现下降沿了后续也要再采样几次,以防万一哈那根据手册的描述这个接收电路还会在下降沿之后的第三次五次七次进行一批采样,在第八次九次十次再进行一批采样,且这两批采样都要要求每三位里面至少应该有两个 0 ,如果没有造成那肯定全是 0 啊满足情况

如果有一些轻微的噪声导致这里三位里面只有两个 0 另一个是一那也算是检测到了起始位哈,但是在状态寄存器里会置一个 NE 噪声标志位就是提醒你一下数据我是收到了但是有噪声你悠着点用啊,如果这里三位里面只有一个 0 那就不算检测到了起始位可能前面那个下降沿是造成这时电路就忽略前面的数据,重新开始捕捉下降沿这就是 STM32 的串口在接收过程中对噪声的处理啊,

如果通过了这个起始位侦测,那接收状态就由空闲变为接收起始位,同时第八九十次采样的位置就正好是起始位的正中间,之后接收数据位时就都在第八九十次进行采样,这样就能保证采样位置在位的正中间了,这就是起始位侦测和采样位置对齐的策略啊

那紧接着我们就可以看这个数据采样的流程了,这里从一到十六是一个数据位的时间长度,在一个数据位有十六个采样时钟,由于起始位侦测已经对齐了采样时钟哈,所以这里就直接在第八九十次采样数据位,

为了保证数据的可靠性哈,这里是连续采样三次,没有噪声的理想情况下,这三次肯定全为一或者全为零,全为一就认为收到了一,全为零就认为收到了零,如果有造成导致三次采样不是全为一或者全为零,那它就按照二比一的规则来哈两次为一就认为收到了一两次为零,就认为收到了零在这种情况下噪声标志位为 NE 也会置一哈,告诉你我收到数据了但是有噪声你悠着点用这就是检测噪声的数据采样,可见 STM32 对这个电路的设计考虑还是很充分的哈

那最后我们再来看一下波特率发生器波特率

发生器和接收器的波特率由波特率寄存器 B R R 里面的 D I V 确定。下面这个图就是 B R R 寄存器,里面就是分频系数 D I V。D I V 分为整数部分和小数部分,可以实现更细腻的分频啊。

那波特率和分频系数的关系可以由这个计算公式进行计算。波特率等于 P C L K 2 或 1 的时钟频率除以 16 倍的 D I V。为什么这里多个 16?看上面这个图就明白了吧,因为它内部还有一个 16 倍波特率的采样。

所以这里输入时钟除以 DIV 要等于 16 倍的波特率,最终计算波特率自然要多除一个 16 了。

举个例子啊,比如我要配置 UART 一为 9600 的波特率,那如何配置这个 BRR 寄存器呢?我们代入公式啊,就是 9600 等于 CRT 一的始终是 72 兆除 16 倍的 DIV。解得啊, DIV 等于 72 兆除 9600 除 16。然后可以用计算器算一下啊, 72 兆除 9600 除 16,最终等于 468.75 啊。

这是一个带小数的分屏系数,最终写到计算器还需要转换成二进制啊。输入十进制的四六八点七五,转换成二进制,最终得到二进制数是幺幺幺零幺零幺零零点幺幺。所以最终写的这个计数器就是整数部分为幺幺幺幺零幺零幺零零,前面多出来的补零,小数部分为幺幺,后面多出来的补零。

这就是根据波特率写 BR 寄存器的方法,了解一下。不过我们用库函数配置的话就非常方便,需要多少波特率直接写就行了,库函数会自动帮我们算。

最后我们再看两个手册。先看一下这个 USB 转串口模块的原理图啊,这个图展示的就是我们套件里 USB 转串口模块的内部电路图,这里还有几点注意事项啊,需要跟大家说明一下。大概看一下,

最左边这里是 USB 的端口, USB 有四根线, GND、 D 正、 D 负、 VCC。 USB 标准供电是 5 伏啊,然后中间 D 正和 D 负是通信线,走的也是 USB 协议,所以这里需要加一个 CH340 芯片转换一下,转换之后输出的就是 TXD 和 RXD, 是串口最后通过这里的排针引出来。

那需要注意的就是这边的供电策略啊。首先所有的电都是从这个 VCC 正五伏来的。然后 VCC 正五伏通过这个稳压管电路进行稳压啊,得到 VCC 正三点三伏。之后 VCC 正五伏和 VCC 正三点三伏都通过排针引出来了,所以这个第六角和第四角是分别有 5 伏和 3.3 伏输出的啊。

那很多人迷惑的是这个第五角,板子上标的是 VCC,这个引脚通过原理图可以看到哈,它是通向了 CH340 芯片的 VCC 上,所以这个第五角实际上是 CH340 的电源输入角。一般我们这个模块的排针会有个跳线帽哈,这个跳线帽需要插在四五角或者五六角上。右边这里有文字说明哈,短路 5 伏到 VCC,CH340 供电为 5 伏 TCL 电瓶为 5 伏,短路三 v 三到 vcc,CH340 的供电为 3.3 伏, TCL 电瓶为 3.3 伏。所以这个跳线帽是用来选择通信电瓶的哈,也是给 CH340 芯片供电的,所以最好不要拿掉,如果你拿掉了,就相当于这整个芯片没有供电。不过神奇的是哈,我试了一下,即使把跳线帽拔掉,不给芯片供电,这个串口还是能正常工作啊,可能是从别的地方汲取了一些电流吧,当然还有可能是别的原因,我观察了一下,我们这个模块的电路是有些变动的,如果不插跳线帽我测试了啊,通信电平为 3.3 伏。不过为了稳定,最好是要插上跳线帽啊。那我们 STM32 通信需要 3.3 伏,所以把跳线帽插在这里的四五角上就行了。那供电就只剩一个 5 伏角了,所以这个供电有点折磨人啊。

要么选择 5 伏电瓶,剩下供电角就只有 3.3 伏。要么选择 3.3 伏电瓶,剩下供电角就是 5 伏。所以这个供电角的设计有点不太方便啊。不过考虑到电瓶的 5 伏和 3.3 伏可以互相兼容,所以如果你既需要通信又需要供电,那就保证供电是正确就行了。通信电平没法一致,这应该也没问题啊。

然后右边还有引脚说明,看一下啊。五伏角是从 USB 取出来的五伏电源输出, VCC 是模块供电点,三 V 三是模块稳压出来的三点三伏电源输出, TXD 串口数据输出, RXD 串口数据输入,接地模块负极。这就是这些引脚说明啊。最后右下角这些是指示灯和电源滤波啊。这里有 PWR 电源指示灯和 TXD RXD 的指示灯。如果引脚上有数据传输,这两个指示灯会对应闪烁啊,方便我们观察。