STM32/串口通信(理论篇)
目录1 串口USART/UART1.1 USART的两种工作模式1.2 USART框图1.3 波特率1.4 数据帧2 数据收发2.1 状态寄存器USART_SR2.1.1 TXE2.1.2 TC2.1.3 RXNE2.2 数据收发流程2.2.1 数据发送流程2.2.2 数据接收流程3 控制寄存器3.1 发送器控制3.2 字长选择3.3 接收器控制3.4 唤醒单元3.4.1 WAKE3.4.2 RWU3.4.3 IDLE3.4.4 空闲总线唤醒3.4.5 地址标记唤醒4 USART中断5 硬件数据流控5.1 RTS5.2 CTS附USART寄存器地址映像1 串口USART/UARTUSART通用同步/异步收发传输器,一种支持同步和异步两种模式的串行通信接口用于单片机与外部设备之间的数据传输。UART通用异步收发传输器在USART基础上截掉同步通信负责在设备间以异步方式发送和接收数据。1.1 USART的两种工作模式异步模式通信双方需要依靠事先约定的波特率来同步数据收发通过数据帧的起始位和停止位来实现帧同步在硬件连接时只需要TX发送和RX接收交叉相连和GND共地连接即可。同步模式双方通信需要额外的时钟线由主机提供时钟信号从机根据时钟信号同步数据在硬件连接时需要加上SCLK时钟线。1.2 USART框图1.3 波特率串口通信中衡量数据传输速度的核心参数表示每秒传输的码元符号个数单位为波特。也可以理解成波特率等于每秒传输的二进制位数常见的波特率9600就是每秒传输9600个bit位115200就是每秒传输115200bit位。由总线时钟 f_PCLK 分频产生USART通信所需的波特率时钟。1.4 数据帧在串口通信中一个数据帧由起始位、数据位、校验位和停止位组成。起始位是标志一帧数据的开始固定逻辑低电平一个位周期的低电平。数据位是实际需要传输的信息长度通常是5-9位通常是8位发送顺序从低位到高位LSB例如发送0x5501010101发送顺序由低到高10101010。校验位是一个作为可选择的位用于简单错误检测有奇校验、偶校验和无校验。停止位是一帧数据结束的标志固定逻辑低电平宽度可以是0.5、1、1.5和20.5和1.5个停止位用于智能卡模式1和2个停止位用于正常模式一般默认使用1个停止位。2 数据收发2.1 状态寄存器USART_SR用于实时反映USART当前的工作状态帮助软件判断数据传输的进度、接收数据的有效性以及通信过程中是否发生错误。在学习串口通信前先了解USART_SR中常用的标志位2.1.1 TXEUSART_SR位7TXE发送数据寄存器空标志位置1表示发送数据寄存器TDR为空在数据被写入发送数据寄存器 (TDR或从发送数据寄存器 (TDR) 移动到发送移位寄存器时由硬件自动置 0。2.1.2 TCUSART_SR位6TC发送完成标志位置1表示整个帧含停止位已发送完毕数据写 USART_DR 会自动置0。2.1.3 RXNEUSART_SR位5RXNE接收数据寄存器非空标志位置1表示接收移位寄存器中的数据已转移到 RDR可以读取新数据。在读取接收数据寄存器时被硬件自动清0。2.2 数据收发流程2.2.1 数据发送流程数据发送流程数据从STM32内部向外发送步骤一CPU或DMA向发送数据寄存器TDR写入数据此时TXE置0TC置0。步骤二数据从发送数据寄存器TDR将移动到发送移位寄存器此时TXE保持0TC保持0。步骤三数据移动完成发送数据寄存器为空此时TXE置1TC保持0。步骤四发送移位寄存器将数据从TX引脚输出低位在前输出完成后TC置1。2.2.2 数据接收流程数据接收流程数据从STM32外部向内传输步骤一检测RX引脚电平从高跳变到低一个帧开始此时RXNE为0。步骤二按照波特率时钟依次接收数据位、校验位此时RXNE为0。步骤三接收移位寄存器接收完一帧数据后自动传输到接收数据寄存器RDR当传输完成时RXNE置1。步骤四读取数据此时RXNE置0。3 控制寄存器在USART中一共有三个控制寄存器USART_CR1、USART_CR2和USART_CR3每一个控制器控制不同的串口功能可以通过配置来实现对应功能。3.1 发送器控制发送器由USART_CR1寄存器位3发送使能位TE控制当TE置1时启动数据发送流程如2.2.1所示。3.2 字长选择字长由USART_CR1寄存器中的位12M位配置选择可选择成8或9位。当M位置0时数据位长度为8置1时数据位长度为9。3.3 接收器控制接收器由USART_CR1寄存器位2接收使能位RE控制当TE置1时使能USART接收接收器开始搜寻RX上的起始位搜寻到起始位后将接收到的数据存放到接收移位寄存器内。接收流程如2.2.2所示。3.4 唤醒单元USART在接收线上检测到特定条件时将单片机从低功耗模式唤醒的硬件模块。在了解唤醒单元工作原理时首先需要了解其相应寄存器所对应的位。3.4.1 WAKE控制寄存器1USART_CR1位11WAKE决定唤醒的方法当WAKE被复位置0进行空闲总线检测当WAKE被设置置1进行地址标记检测。3.4.2 RWU控制寄存器1USART_CR1位1RWU是唤醒标志位置1时表示处于静默模式置0时处于正常工作模式。3.4.3 IDLE状态寄存器USART_SR位4IDLE用于检测总线是否空闲可以检测串口一条不定长消息是否接收完成。在唤醒时一共有两种唤醒方式空闲总线唤醒和地址标记唤醒。3.4.4 空闲总线唤醒空闲总线唤醒适用于系统随时可能接收到数据时唤醒当RWU被软件置1时进入空闲模式当检测到RX引脚产生空闲帧信号时RWU被硬件自动置0此时的IDLE不会被置起进入正常模式。3.4.5 地址标记唤醒地址标记唤醒适用于多个设备通信在该模式下需要配置数据位为9位并且第九位MSB为1时表示该字节是地址否则该字节是数据。当RWU被软件置1时进入静默模式该模式下会屏蔽RXNE和DMA请求当一个MSB为1的地址帧到来硬件接收该地址数据与控制寄存器2USART_CR2位3:0ADD设置好的本机地址进行比较如果地址相同表示匹配成功此时RWU硬件自动置0唤醒接收器产生RXNE中断。如果地址不相同表示不匹配RWU保持为1保持静默。4 USART中断在使用串口时往往会有一个疑问“什么时候需要使用中断”当调试打印或简单任务时不要求运行效率时可以不用使用中断而涉及发送一个未知长度的数据或接收多个字节时需要使用中断当需要考虑低功耗和发送大量数据时需要使用中断。5 硬件数据流控硬件数据流控在进行串口通信时为了防止数据丢失会通过额外的硬件数据线让在通信的双方知道是否可以发送/接收数据。在硬件数据流控中涉及两个引脚RTS和CTS。接线方式接收端和发送端RTS和CTS交叉相连。5.1 RTSRTS输出引脚接收端告诉发送端接收端是否可以接收数据低电平可以接收高电平阻断下一次的接收5.2 CTSCTS输入引脚接收端告诉发送端发送端是否可以发送数据低电平可以发送高电平阻断下一次的发送工作流程发送端在发送数据前检测自己的CTS引脚也就是来自接收端的RTS信号接收端在接收缓存区快慢时通过自己的RTS引脚发送信号告诉发送端“别再发了”。附USART寄存器地址映像注图片截至官方手册注寄存器图片来自官方手册更多寄存器配置请直接查阅官方手册。注以上内容适用于STM32F10xx系列仅供参考。注以上内容仅个人理解不具备唯一性和绝对正确性仅供参考。