打印
[其他ST产品]

STM32-串口通信

[复制链接]
594|58
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1  串行通信接口背景知识
        串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性,从而确保原始数据在物理媒体的传播;协议层主要规定通讯逻辑,统一双方的数据打包、解包标准。通俗的讲物理层规定我们用嘴巴还是肢体交流,协议层规定我们用中文还是英文交流。

1.1 设备之间通信的方式
        一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是:





使用特权

评论回复
沙发
甲虫666|  楼主 | 2023-9-24 01:08 | 只看该作者
1.2 串行通信的分类
1.2.1 按照数据传送方向
        单工:数据传输只支持数据在一个方向上传输;
        半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

使用特权

评论回复
板凳
甲虫666|  楼主 | 2023-9-24 01:08 | 只看该作者
1.2.2 按照通信方式
        同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。
        异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线。
        在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。
        在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。

使用特权

评论回复
地板
甲虫666|  楼主 | 2023-9-24 01:09 | 只看该作者
1.3 常见的串行通信接口

使用特权

评论回复
5
甲虫666|  楼主 | 2023-9-24 01:09 | 只看该作者
2 STM32串口通信基础
        STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。
        UART引脚连接方法:RXD-----数据输入引脚,数据接受;TXD-----数据发送引脚,数据发送。

使用特权

评论回复
6
甲虫666|  楼主 | 2023-9-24 01:09 | 只看该作者
     对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信了。

使用特权

评论回复
7
甲虫666|  楼主 | 2023-9-24 01:10 | 只看该作者
若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。故,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成RS232类型,再交叉连接。
经过电平转换后,芯片串口和rs232的电平标准是不一样的:
                单片机的电平标准(TTL电平):+5V表示1,0V表示0;RS232的电平标准(负逻辑):+15/+13 V表示0,-15/-13表示1。
        RS-232通讯协议标准串口的设备间通讯结构图如下:


所以单片机串口与PC串口通信就应该遵循下面的连接方式:在单片机串口与上位机给出的rs232口之间,通过电平转换电路(如下面图中的Max232芯片) 实现TTL电平与RS232电平之间的转换。



使用特权

评论回复
8
甲虫666|  楼主 | 2023-9-24 01:10 | 只看该作者
  STM32的UART特点:
                1)全双工异步通信;
                2)分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s;
                3)可编程的数据字长度(8位或者9位);
                4)可配置的停止位(支持1或者2位停止位);
                5)可配置的使用DMA多缓冲器通信;
                6)单独的发送器和接收器使能位;
                7)检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志;
                8)多个带标志的中断源,触发中断;
                9)其他:校验控制,四个错误检测标志。

使用特权

评论回复
9
甲虫666|  楼主 | 2023-9-24 01:11 | 只看该作者
3 串口通信过程


使用特权

评论回复
10
甲虫666|  楼主 | 2023-9-24 01:11 | 只看该作者
3.1 USART简介
        USART(通用同步异步收发器)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART,它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。

使用特权

评论回复
11
甲虫666|  楼主 | 2023-9-24 01:11 | 只看该作者
STM32中一共有5个USART,如示:

使用特权

评论回复
12
甲虫666|  楼主 | 2023-9-24 01:11 | 只看该作者
    USART的USB转串口原理图如下:

使用特权

评论回复
13
甲虫666|  楼主 | 2023-9-24 01:11 | 只看该作者
USART1的发送和接收端口是事先连接好的,如果要使用其他USART只需要将相应的发送接收端口按图连接好即可。
        USART有多个中断请求事件:

使用特权

评论回复
14
甲虫666|  楼主 | 2023-9-24 01:12 | 只看该作者
3.2 STM32中UART参数
        串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,通讯双方的数据包格式要规约一致才能正常收发数据。STM32中串口异步通信需要定义的参数:起始位、数据位(8位或者9位)、奇偶校验位(第9位)、停止位(1,15,2位)、波特率设置。由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有4800、9600、115200等。STM32中波特率的设置通过串口初始化结构体来实现。

使用特权

评论回复
15
甲虫666|  楼主 | 2023-9-24 01:12 | 只看该作者
UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图所示:



数据位的首尾分别是起始位和停止位,数据位的起始信号由一个逻辑0的数据位表示,停止位信号可由0.5、1、1.5、2个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。奇偶校验位分为奇校验和偶校验两种,是一种简单的数据误码校验方法。奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数;偶校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为偶数。

使用特权

评论回复
16
甲虫666|  楼主 | 2023-9-24 01:13 | 只看该作者
校验方法除了奇校验(odd)、偶校验(even)之外,还可以有:0 校验(space)、1 校验(mark)以及无校验(noparity)。0/1校验:不管有效数据中的内容是什么,校验位总为0或者1。

使用特权

评论回复
17
甲虫666|  楼主 | 2023-9-24 01:13 | 只看该作者
3.3 UART(USART)框图

这个框图分成上、中、下三个部分。本文大概地讲述一下各个部分的内容,具体的可以看《STM32中文参考手册》中的描述。
        框图的上部分,数据从RX进入到接收移位寄存器,后进入到接收数据寄存器,最终供CPU或者DMA来进行读取;数据从CPU或者DMA传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过TX发送出去。然而,UART的发送和接收都需要波特率来进行控制的,波特率是怎样控制的呢?这就到了框图的下部分,在接收移位寄存器、发送移位寄存器都还有一个进入的箭头,分别连接到接收器控制、发送器控制。而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的。而接收器时钟和发送器时钟有是由什么控制的呢?
        可以看到,接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。同时也可以看到接收器时钟(发生器时钟)的计算方法、USRRTDIV的计算方法。
        这里需要知道一个知识点:
                1)UART1的时钟:PCLK2(高速);
                2)UART2、UART3、UART4的时钟:PCLK1(低速)。

使用特权

评论回复
18
甲虫666|  楼主 | 2023-9-24 01:14 | 只看该作者
4 串口相关配置寄存器
4.1 状态寄存器(USART_SR)


       状态寄存器适用于检测串口此时所处的状态。它能够检测到的状态有:发送寄存器空位、发送完成位、读数据寄存器非空位、检测到主线空闲位、过载错误为等等。

        这边主要关注两个位:RXNE和TC(第5、6两位)。
        RXNE(读数据寄存器非空):当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了(即RDR移位寄存器中的数据被转移到USART_DR寄存器中)。这时候要做的就是尽快读取USART_DR,从而将该位清零,也可以向该位写0,直接清除。
        TC(发送完成):当该位被置1的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:读USART_SR,写USART_DR;直接向该位写0。

使用特权

评论回复
19
甲虫666|  楼主 | 2023-9-24 01:14 | 只看该作者
4.2 数据寄存器(USART_DR)


  USART_DR实际是包含了两个寄存器,一个专门用于发送的TDR,一个专门用于接收的RDR。进行发送数据操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取数据操作时,向USART_DR读取数据会自动提取RDR数据。
        串行通信时一位一位传输的,所以TDR和RDR寄存器都是介于系统总线和移位寄存器间的;发送数据时把TDR内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到RDR。

使用特权

评论回复
20
甲虫666|  楼主 | 2023-9-24 01:14 | 只看该作者
4.3 波特率寄存器 (USART_BRR)


        波特率寄存器包括定义了两个部分:DIV_Mantissa(整数部分)和DIV_Fraction(小数部分)。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

131

帖子

0

粉丝