打印
[其他ST产品]

STM32-串口通信(串口的接收和发送)

[复制链接]
323|43
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32的串口通信
本文在于记录自己的学习过程中遇到的问题和总结,各种情况下串口通信在STM32的实际使用方面占有很大的比重,本文主要对串口通信做一个简要的总结。

一、STM32里的串口通信
在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工,异步时钟控制,设备之间是点对点的传输。对应的STM32引脚分别是RX和TX端。STM32的串口资源有USART1、USART2、USART3.

串口的几个重要的参数:

波特率,串口通信的速率
空闲,一般为高电平
起始位,标志一个数据帧的开始,固定为低电平。当数据开始发送时,产生一个下降沿。(空闲–>起始位)
数据位,发送数据帧,1为高电平,0为低电平。低位先行。
比如 发送数据帧0x0F 在数据帧里就是低位线性 即 1111 0000
校验位,用于数据验证,根据数据位的计算得来。有奇校验,偶校验和无校验。
停止位,用于数据的间隔,固定为高电平。数据帧发送完成后,产生一个上升沿。(数据传输–>停止位)

下方就是一个字节数据的传输过程,从图中可以看出,串口发送的数据一般都是以数据帧的形式进行传输,每个数据帧都由起始位,数据位,停止位组成, 且停止位可变。




使用特权

评论回复
沙发
突然下起雨|  楼主 | 2023-9-24 00:53 | 只看该作者
二、串口的发送和接收
USART是STM32内部集成的硬件外设,可以根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可以自动接收RX引脚的数据帧时序,拼接成一个字节数据,存放在数据寄存器里。

使用特权

评论回复
板凳
突然下起雨|  楼主 | 2023-9-24 00:53 | 只看该作者
当配置好USART的电路之后,直接读取数据寄存器,就可以自动发送数据和接收数据了。在发送和接收的模块有4个重要的寄存器

发送数据寄存器TDR
发送移位寄存器,把一个字节的数据一位一位的移出去
接收数据寄存器RDR
接收移位寄存器,把一个字节的数据

使用特权

评论回复
地板
突然下起雨|  楼主 | 2023-9-24 00:53 | 只看该作者
下方为串口的发送和接收图解:

使用特权

评论回复
5
突然下起雨|  楼主 | 2023-9-24 00:53 | 只看该作者

使用特权

评论回复
6
突然下起雨|  楼主 | 2023-9-24 00:54 | 只看该作者
串口发送
在配置串口的各个参数时,可以选择发送数据帧的数据位的大小,可选8位或9位。

串口发送数据实际上就是对发送数据寄存器TDR进行写操作。

1. 当串口发送数据时,会检测发送移位寄存器是不是有数据正在移位,如果没有移位,那么这个数据就会立刻转移到发送移位寄存器里。准备发送。

2. 当数据移动到移位寄存器时,会产生一个TXE发送寄存器空标志位,该位描述如下。当TXE被置1,那么就可以在TDR写入下一个数据了。即发送下一个数据。

使用特权

评论回复
7
突然下起雨|  楼主 | 2023-9-24 00:54 | 只看该作者
3. 发送移位寄存器在发送器控制的控制下,向右移位,一位一位的把数据传输到TX引脚。

使用特权

评论回复
8
突然下起雨|  楼主 | 2023-9-24 00:54 | 只看该作者
4. 数据移位完成后,新的数据就会再次从TDR转移到发送移位寄存器里来,依次重复1-3的过程。通过读取TXE标志位来判断是否发送下一个数据。

使用特权

评论回复
9
突然下起雨|  楼主 | 2023-9-24 00:54 | 只看该作者
串口接收
数据从RX引脚通向接收移位寄存器,在接收控制的控制下,一位一位的读取RX的电平,把第一位放在最高位,然后右移,移位八次之后就可以接收一个字节了。
当一个字节数据移位完成之后,这一个字节的数据就会整体的移到接收数据寄存器RDR里来。
在转移时会置RXNE接收标志位,即RDR寄存器非空,下方为该位的描述。当被置1后,就说明数据可以被读出。

使用特权

评论回复
10
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者
下图即为串口接收的工作流程

使用特权

评论回复
11
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者

使用特权

评论回复
12
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者
三、串口在STM32中的配置
首先要明确几点:使用STM32串口外设中的哪一个?串口发送或者接收数据?串口相关的参数配置?发送或接收是否使用到中断?

使用特权

评论回复
13
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者
下方为串口发送的配置。

1. RCC开启USART、串口TX/RX所对应的GPIO口

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);  //开启USART2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //开启GPIOA的时钟

使用特权

评论回复
14
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者
2. 初始化GPIO口
这里注意哈,根据自己的需求来配置GPIO口,发送和接收是都需要还是只需要其中一个。然后对应的根据引脚定义表来初始化对应的GPIO口。

使用特权

评论回复
15
突然下起雨|  楼主 | 2023-9-24 00:55 | 只看该作者
USART2对应的引脚

使用特权

评论回复
16
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
USART1对应的引脚

使用特权

评论回复
17
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
这里根据手册来看,RX引脚模式配置成浮空输入或者上拉输入。TX引脚模式配置成复用推挽输出。

**比如我这里只初始化TX发送端**

使用特权

评论回复
18
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
//TX端
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;   //USART2对应的TX端为GPIOA2
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZ
    GPIO_Init(GPIOA,&GPIO_InitStructure);

使用特权

评论回复
19
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
3. 串口初始化
注意哈,USART_Init()这个函数,是用来配置串口的相关参数的。

USART_BaudRate 串口通信使用的波特率 一般是9600或者是115200,这里我们给9600
USART_HardwareFlowControl 是否选择硬件流触发,一般这个我们也不选,所以选择无硬件流触发。
USART_Mode 这个参数要注意了哈,串口的模式,发送模式还是接收模式,还是两者都有
USART_Parity 校验位,可以选择奇偶校验和不校验。没有需求就直接无校验
USART_StopBits 停止位 有1、0.5、2位,我们这里选1位停止位
USART_WordLength 数据位 有8位和9位可以选择

使用特权

评论回复
20
突然下起雨|  楼主 | 2023-9-24 00:56 | 只看该作者
//串口初始化
        USART_InitTypeDef USART_InitStruct;
        USART_StructInit(&USART_InitStruct);  //初始默认值
        USART_InitStruct.USART_BaudRate=9600;
        USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //不使用硬件流触发
        USART_InitStruct.USART_Mode=USART_Mode_Tx;                           //TX 发送模式
        USART_InitStruct.USART_Parity=USART_Parity_No;                   //不选择校验
        USART_InitStruct.USART_StopBits=USART_StopBits_1;                  //停止位1位
        USART_InitStruct.USART_WordLength=USART_WordLength_8b;        //数据位8位
        USART_Init(USART2,&USART_InitStruct);

使用特权

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

本版积分规则

38

主题

284

帖子

1

粉丝