STM32
直播中

成尔秩

7年用户 968经验值
私信 关注
[问答]

并行通信和串行通信的优缺点是什么?

并行通信和串行通信的优缺点是什么?
STM32的串口通信原理是什么?

常用的串口相关寄存器是什么?
串口配置的一般步骤是怎样的?

回帖(1)

王鑫

2021-12-9 09:06:17
1、串口通信简介

通信接口的两种方式:
并行通信
-传输原理:数据各个位同时传输。
-优点:速度快
-缺点:占用引脚资源多
串行通信
-传输原理:数据按位顺序传输。
-优点:占用引脚资源少
-缺点:速度相对较慢
目前使用最多的还是串行通信,即便速度相对较慢,所以下面都是讲解串行通信。
①串口通信分类:
串口通信按照数据传送方向,分为:





(1)单工:数据传输只支持数据在一个方向上传输
(2)半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
(3)全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力
②STM32的串行通信的方式
同步通信:带时钟同步信号传输。
异步通信:不带时钟同步信号。





注意:一般所说的串口是USART(通用同步异步收发器),同步异步都支持的。STM32F10x系列芯片,包含3个USART和2个UART
2、STM32的串口通信原理

串口通信是单片机最基本的功能,很多传感器模块与单片机的连接都会用到串口功能。串口通信,顾名思义就是将一整条的内容,切成一“串”个体来发送或接收。发送的核心思想是:将字符串中的一个字符写到一个寄存器中(此寄存器只能存一个字符),写入后会自动通过串口发送,发送结束再写入下一个字符。接收时会直接装入单片机缓冲区的一个字符型数组中,由程序依次读这个数组。





上图是串口数据发送接收的过程做一个简单的图示。收发控制器根据寄存器配置,对数据存储转移部分的移位寄存器进行控制。当需要发送数据时,内核或DMA外设把数据从内存(变量)写入到发送数据寄存器TDR后,发送控制器将自动把数据从TDR加载到发送移位寄存器,然后通过串口线TX,把数据一位一位地发送出去,在数据从TDR转移到移位寄存器时,会产生发送寄存器TDR已空事件TXE,当数据从移位寄存器全部发送出去时,会产生数据发送完成事件TC,这些事件可以在状态寄存器中查询到。而接收数据则是一个逆过程,数据从串口线RX一位一位地输入到接收移位寄存器,然后自动地转移到接收数据寄存器RDR,最后用内核指令或DMA读取到内存(变量)中。发送完毕或者接收完毕都会有相应的状态或者事件,我们写代码时就可以通过这些事件来判断是否接收或者发送完毕,然后做出下一步。
3、常用的串口相关寄存器

①USART_SR状态寄存器
这个寄存器用到了10个位,也就代表有10中状态标志,每个标志都可以作为中断的标志位,库函数的定义如下:

#define USART_IT_PE             ((uint16_t)0x0028)
#define USART_IT_TXE            ((uint16_t)0x0727)
#define USART_IT_TC             ((uint16_t)0x0626)
#define USART_IT_RXNE           ((uint16_t)0x0525)
#define USART_IT_IDLE           ((uint16_t)0x0424)
#define USART_IT_LBD            ((uint16_t)0x0846)
#define USART_IT_CTS            ((uint16_t)0x096A)
#define USART_IT_ORE            ((uint16_t)0x0360)
#define USART_IT_NE             ((uint16_t)0x0260)
#define USART_IT_FE             ((uint16_t)0x0160)










②USART_DR数据寄存器
发送数据寄存器是TDR,接收数据寄存器是RDR,都只用了前8位,发送和接收用到以下两个函数:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);



4、串口配置的一般步骤



  • 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
  • GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
  • 串口参数初始化: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);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分