打印
[STM32F3]

STM32-串口通信详解

[复制链接]
379|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。

一、通信接口背景知识
1. 并行通信和串行通信
所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:

并行通信
   -传输原理:数据各个位同时传输。

   -优点:速度快

   -缺点:占用引脚资源多

串行通信
   -传输原理:数据按位顺序传输。

   -优点:占用引脚资源少

   -缺点:速度相对较慢

2. 串行通信的分类
由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:

单工:数据传输只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
为了清晰的表述这三种传输方向上的区别,我们看下图:



(a)单工通信        (b)半双工通信        (c)全双工通信
另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。

同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;

异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。

我们以下面的表格来详细对比串行通信接口




使用特权

评论回复
沙发
kmnqhaha|  楼主 | 2024-6-30 00:25 | 只看该作者
STM32的串口通信基础
1. 串口通信接口
STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器

对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:



这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。

下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询



查阅官方手册,UART异步通信方式的特点如下:

全双工异步通信。
分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
可编程的数据字长度(8位或者9位);
可配置的停止位(支持1或者2位停止位);
可配置的使用DMA多缓冲器通信。
单独的发送器和接收器使能位。
检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
多个带标志的中断源。触发中断。
其他:校验控制,四个错误检测标志。

使用特权

评论回复
板凳
kmnqhaha|  楼主 | 2024-6-30 00:30 | 只看该作者
查阅官方手册,UART异步通信方式的特点如下:

全双工异步通信。
分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
可编程的数据字长度(8位或者9位);
可配置的停止位(支持1或者2位停止位);
可配置的使用DMA多缓冲器通信。
单独的发送器和接收器使能位。
检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
多个带标志的中断源。触发中断。
其他:校验控制,四个错误检测标志。

使用特权

评论回复
地板
kmnqhaha|  楼主 | 2024-6-30 00:30 | 只看该作者
串口通信框图
学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:



从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。

使用特权

评论回复
5
kmnqhaha|  楼主 | 2024-6-30 00:31 | 只看该作者
串口通信相关寄存器
STM32串口通信的相关寄存器共有3个,分别是:

USART_SR状态寄存器
USART_DR数据寄存器
USART_BRR波特率寄存器
下面是来自中文参考手册的部分截图介绍:








还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。

建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单

使用特权

评论回复
6
kmnqhaha|  楼主 | 2024-6-30 00:32 | 只看该作者
波特率计算方法




这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。

使用特权

评论回复
7
kmnqhaha|  楼主 | 2024-6-30 00:33 | 只看该作者
库函数配置
1. 串口配置一般步骤
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
串口复位:USART_DeInit(); 这一步不是必须的
GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)
串口参数初始化:USART_Init();
开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();
使能串口:USART_Cmd();
编写中断处理函数:USARTx_IRQHandler();
串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

使用特权

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

本版积分规则

40

主题

199

帖子

1

粉丝