Nuru_Banmian
Nuru_Banmian
Published on 2025-03-24 / 74 Visits
0
1

USART模块_基础知识

此笔记是观看尚硅谷的stm32单片机教程,STM32入门教程,寄存器与HAL库开发一套通写下的笔记

哔哩哔哩视频入口

通讯基本概念

串行和并行

两者之间的区别

  • 速度: 并行通常比穿行速度要快.

  • 复杂性: 并行需要更多的数据线,布线更复杂; 串行通信简化了布线和接口.

  • 距离: 串行通信更适合远距离传输,并行通信适合短距离传输.

  • 成本: 串行接口通常成本较低,因为用到的硬件较少(数据线).

  • 抗干扰: 串行优于并行.

串行通信

并行通信

通讯距离

抗干扰能力

传输速率

成本

单工,半双工和全双工

本质是信息传输方向有所区别.

  • 单工: 信息传输只能从一个方向传输.

  • 半双工: 信息能两边互传,但是每次只能一边传输.

  • 全双工: 信息随时都能从两边传输.

同步和异步

本质是看是否有时钟来规定数据传输的频率.

同步: 多了根时钟数据线传输时钟信号.

异步: 没有时钟信号线.

串口通讯协议

串口通讯协议.png

  • 传输数据时,起始位为0,停止位为1,只有收到这样类型的数据时,系统才会知道什么时候开始什么时候结束.

  • LSB中的L是least,最小的意思;MSB中的M是max,最大的意思,所以串口通讯是从低位开始发送的.

  • 奇偶校验位:一个额外的数,当认定为奇校验时,前面的有效数据位和奇偶校验位中的数据中加起来,1的个数位奇数,则通过;反之亦然,但显然这种校验方式准确率不准.

  • 空闲位是1,即当没有传输事件时,数据线中一直保持高电平,直到传输事件产生时,变为低电平表示数据即将传输.

  • 当发送的数据长度不清楚有多长时,为了分明后面传输的1是否是真正的停止位和空闲位,通讯协议通常认为,当一个n个字节长度的数据流都为1,就判断数据已经传输结束,这段n个字节长度的1数据流被称为空闲帧.

  • 波特率:表示每秒钟传输了多少个码元.

  • 码元:一个判断数据大小的单位,比如说,我的数据有4钟状态,4种状态用二进制需要两位来表示,这时,我的一个码元就是两个字节的宽度,两个字节就是一个码元.

  • STM32中提供了串口异步通讯,由于没有时钟信号,所以两个通讯设备之间要约定好波特率,即每个码元的长度,以便解码.


USART

USART:同步异步收发器,串行通讯设备,可以和外部设备灵活的进行全双工数据交换.

UART:相比于USART去掉了同步功能 .

stm32中USART提供了5个串口一边选择,其中前三个是USART,后两个是UART.

USART1运行速度最快,其他的是USRAT运行速率的一半.

电脑上的串口一般叫com口,对应单片机上的UART口.

差分传输:两条线同时传输数据,数据的值为两条线电平之差,这样能使抗干扰能力增强,因为干扰时,两遍同时增减,最后差值出来的结果不变.

USART框图介绍

框图:

USART_框图.png


IrDASIR编解码模块

USART_框图部分1.pngTX: 发送引脚 transmit

RX: 接收引脚 receive

SW_RX: 数据接收引脚(单线模式/智能卡模式使用)

IRDA: 红外模块

nRTS: request to send 与外设连接,发送输出请求,n为低电平使能

nCTS: clear to send 与外设连结,接受是否准备好接受的型号,n为低电平使能


USART_框图部分2.pngSCLK: 将时钟信号输出


接收发送移位寄存器

USART_框图部分3.png

接收移位寄存器:接收编解码模块的数据,每次接收将所有数据左/右移移位,准备接收下一位,左移右移看接受顺序

接收数据寄存器:接收移位寄存器满了的时候直接接收数据然后交给总线

发送数据寄存器和发送移位寄存器:和上面两个的功能刚好相反最后发送到编码解码模块,从TX输出

USART_DR:数据寄存器,包含了发送用寄存器和接受用寄存器

  • 发送用寄存器(TDR)

  • 接收用寄存器(RDR)

使用时直接用DR即可

SR模块

总框图中有个寄存器叫SR(status register),是一个状态寄存器

  • RXNE: 判断接受数据寄存器是否为满,寄存器为1,说明为满;对USART_DR的读操作会将此位清零

  • TXE:是用来判断TX是否为空,寄存器为1,说明为空;对USART_DR的写操作会将此位清零

  • TC:用来表示发送移位寄存器发送数据完成

  • IDLE:检测当前RX是否为空闲帧(接收数据是否结束);清除条件位,先读USART_SR再读USART_DR

波特率的配置

USART_BRR,是一个用来配置波特率的模块

USART_BRR_框图.png

波特率系数计算

USARTDIV = DIV_Mantissa + (DIV_Fraction/16)

最后得到的时钟为

发送器时钟 = 系统时钟/(USARTDIV * 16)

USART模块寄存器的使用

1. 波特率设置

由于数据交互最重要的就是同步频率,因此上来就要设置波特率

 USART->BRR = 0x271;     //一般为这个值,特殊情况取特殊值

2. 收发使能和串口使能

全都是在USART_CR1寄存器中设置的,CR1的复位值都是0,因此默认都是0

 USART->CR1 |= (USART_CR1_TE | USART_CR1_RE);    // TX_ENABLE & RX_ENABLE
 USART->CR1 |= USART_CR1_UE;     // USART_ENABLE
 // 其中此寄存器中有个M位,是一个控制字长的寄存器位,默认为0,输入1则数据位为9
 // PS位:校验方式的选择,0为偶校验,1为奇校验      PCE位:PS位使能位
 // XXIE位:各种中断使能位
 // M一般和校验配合使用,M为1时,最后一位一般是校验位,此时PCE置1,然后PS位选择校验方式

3.发送接收数据

 uint8_t receive_char(void)
 {
     /* 等待接收缓冲区 非空 */
     while ((USART1->SR & USART_SR_RXNE)==0)
     {
     }
     return USART1->DR;
 }
 /*
     向串口发送一个字符
 */
 void send_char(uint8_t c)
 {
     while ((USART1->SR & USART_SR_TXE)==0)
     {
     }
     /* 把想要发送的数据写入到寄存器中 */
     USART1->DR = c;
 }

4. 接收中断使能

 /* 使能USART1接受中断*/
 USART1->CR1 |= USART_CR1_RXNEIE;        // 接受缓冲区为满时,置1/发送一个中断信号

CR2中的stop

有两个位来设置停止位数

  • 00: 表示1.0个停止位

  • 01: 表示0.5个停止位

  • 10: 表示2.0个停止位

  • 11: 表示1.5个停止位

UART4和UART5不能使用0.5和1.5个停止位


Comment