【USART】串口外设

一、USART简介
  • USART Universal Synchronous/Asynchronous Receiver/Transmitter )通用同步 / 异步收发器
  • USART STM32 内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从 TX 引脚发送出去,也可自动接收 RX 引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里
  • 自带波特率发生器,最高达 4.5Mbits/s
  • 可配置数据位长度( 8/9 )、停止位长度( 0.5/1/1.5/2
  • 可选校验位(无校验 / 奇校验 / 偶校验)
  • 支持同步模式、硬件流控制、 DMA 、智能卡、 IrDA LIN
  • STM32F103C8T6 USART 资源: USART1 USART2 USART3
//                                                         (APB2)   (APB1)  (APB1)

二、USART框图
  • 左上角引脚部分
1)TX和RX——发送和接收引脚
2)SW_RX、IRDA_OUT、IRDA_IN——智能卡和IrDA通信的引脚
  • 右上角阴影部分
1)【发送数据寄存器】(TDR)和【接收数据寄存器】(RDR)——串口的数据寄存器,发送或接收的字节数据就存在这里
//这两个寄存器占用同一个地址,在程序上只表现为一个寄存器,就是数据寄存器DR(Data Register)
//在实际硬件中分为两个寄存器,TDR是只写的,RDR是只读的
//进行写操作时,数据写入TDR;进行读操作时,数据从RDR读出
2)【发送移位寄存器】和【接收移位寄存器】——一个用于发送,一个用于接收
//【发送移位寄存器】
  • EX:给TDR写入数据0x55,在TDR里的二进制存储就是0101 0101
  • 此时硬件检测到写入数据,就会检查当前移位寄存器是不是有数据正在进行移位,如果没有,0101 0101就会立刻全部移动到【发送移位寄存器】准备发送
  • 当数据从TDR移动到移位寄存器时,会置一个标志位【TXE】(TX Empty)发送寄存器空
    • 如果TXE标志位置1了,就可以在TDR写入下一个数据了
                      //当TXE标志位置1时,数据其实还没有发送出去
                      //只要数据从TDR转移到发送移位寄存器了,TXE就会置1,就可以写入新的数据了
  • 发送移位寄存器会在下面的【发生器控制】的驱动下向右移位,一位一位地把数据输出到TX引脚
    • 此处为向右移位,与串口协议规定的低位先行方向一致
  • 当数据移位完成后,新的数据就会再次自动地从TDR转移到发送移位寄存器
//如果当前移位寄存器移位还没有完成,TDR的数据就会进行等待,一旦移位完成就会立刻转移过来
——有了TDR和移位寄存器的双重缓存,可以保证连续发送数据的时候,数据帧之间不会有空闲,提高了工作效率
//【接收移位寄存器】
  • 数据从RX引脚通向接收移位寄存器
  • 在【接收器控制】的驱动下,一位一位地读取RX电平,先放在最高位,然后向右移,移位8次就能接收一个字节
  • 当一个字节移位完成之后,这一个字节的数据就会整体地转移到【接收数据寄存器】RDR里
  • 在转移的过程中置标志位【RXNE】(RX Not Empty)接收数据寄存器非空
    • 当检测到RXNE置1后就可以把数据读走了
  • 当数据从移位寄存器转移到RDR时,就可以直接移位接收下一帧数据了
  • 下面(控制部分和增强功能)
1)【发送器控制】——控制【发送移位寄存器】工作
2)【接收器控制】——控制【接收移位寄存器】工作
3)【硬件数据流控】
//如果发送设备发的太快,接收设备来不及处理,就会出现丢弃和覆盖数据的现象(用流控解决)
  • nRTS(Request To Send):请求发送,输出脚——告诉别人当前能不能接收(低电平能发,高电平不能发)
  • nCTS(Clear To Send):清除发送,输入脚——接收别人nRTS信号
              //前面的n表示低电平有效
4)【唤醒单元】——实现串口挂载多设备
//在一条总线上可以接多个从设备,每个设备分配一个地址
//需要跟某个设备通信,先进行寻址确定通信对象,再进行数据收发
  • 给串口分配一个地址,当发送指定地址时,此设备唤醒开始工作;当发送别的设备地址时,别的设备就唤醒工作
  • 这个设备没收到地址时保持沉默
5)【中断输出控制】
//中断申请位就是状态寄存器SR(State Regist)里的各种标志位
//SR有两个标志位比较重要——【TXE】(TX Empty)发送寄存器空
                                                【RXNE】(RX Not Empty)接收数据寄存器非空
判断发送状态和接收状态的必要标志位

三、USART基本结构框图
  • 【波特率发生器】——用于产生约定的通信速率,时钟来源是PCLK2或1,经过波特率发生器分频后,产生的时钟通向【发送控制器】和【接收控制器】
  • 【发送控制器】和【接收控制器】——用于控制发送移位和接收移位
    • 由【发送数据寄存器】和【发送移位寄存器】的配合将数据一位一位地移出去,通过GPIO的复用输出,输出到TX引脚,产生串口协议规定的波形
    • RX引脚的波形通过GPIO输入,在【接收控制器】的控制下一位一位地移入接收移位寄存器,移完一帧数据后,数据就会统一转运到【接收数据寄存器】
      • 这一部分有4个寄存器,但在软件层面只有一个【DR寄存器】可以供我们读写
                      //写入DR时,数据走上面进行发送
                      //读取DR时,数据走下面进行接收

四、数据帧(字长设置)
  • 时钟——同步时钟输出功能
//在每个数据位的中间都有一个时钟上升沿,接收端可以在时钟上升沿进行采样,由此精准定位每一位数据
  • 【空闲帧】【断开帧】——用于局域网协议
  • 总共有4种选择
    • 9位字长,有校验
    • 9位字长,无校验
    • 8位字长,有校验
    • 8位字长,无校验
//最好选择【9位字长,有校验】、【8位字长,无校验】,使每一帧的有效载荷都是1字节

五、数据帧(配置停止位)
  • 可以配置停止位长度为0.5、1、1.5、2这四种(停止位的时长不一样)
    • 1个停止位——停止位的时长和数据位一位时长一样
    • 1.5个停止位——停止位的时长是数据位一位时长的1.5倍
    • 以此类推

六、起始位侦测
  • 当输入电路侦测到一个数据帧的起始位后,就会以波特率的频率连续采样一帧数据
  • 同时,从起始位开始,采样位置就要对齐到位的正中间,只要第一位对齐了后面就肯定都是对齐的
  • 功能实现
    • 输入电路对采样时钟进行了细分,以波特率的16倍频率进行采样 (在一位的时间里可以进行16次采样)
  • 起始位侦测策略
    • 最开始空闲状态高电平,那么采样就一直是1
    • 在某个位置突然采到一个0,那么就说明在这两次采样之间出现了下降沿(如果没有任何噪声,之后应该是起始位了)
    • 在起始位会进行连续16次采样,没有噪声的话这16次采样肯定都是0
      • 为防止噪声干扰,即使出现下降沿,后续也要再采样几次
      • 接收电路还会在下降沿之后的【3、5、7】、【8、9、10】进行采样
                      //两批采样都要求每3位里面至少有2个0
                      1)如果全是0说明没有噪声
                      2)如果有些轻微的噪声,导致3位里面两个是0一个是1,在状态寄存器里置NE(Noise Error)噪声标志位以提示
                      3)如果3位里面只有一个0,那就不算检测到起始位,可能前面的下降沿是噪声导致的,此时电路忽略前面的数据,重新开始捕捉下降沿
  • 采样位置对齐策略
    • 通过了起始位侦测,接收状态由【空闲】——【接收起始位】
      • 同时,第8、9、10次采样的位置正好是起始位的正中间
      • 之后接收数据位时,就都在第8、9、10次进行采样,这样就能保证采样位置在位的正中间了

七、数据采样
  • 从1到16是一个数据位的时间长度,在一个数据位有16个采样时钟
  • 由于起始位侦测已经对齐了采样时钟,因此这里直接在第8、9、10次采样数据位
    • 为了保证数据可靠性,这里连续采样3次
      • 没有噪声的理想情况下这3次应该全为1或者全为0
      • 全为1就认为收到了1;全为0就认为收到了0
    • 如果有噪声导致3次采样不是全为1或者全为0
      • 按照2:1的规则——两次为1就认为收到了1;两次为0就认为收到了0
      • 这种情况下噪声标志位NE也会置1提示有噪声

八、波特率发生器(分频器)
  • 发送器和接收器的波特率由波特率寄存器 BRR 里的分频系数 DIV 确定
    • DIV分为整数部分和小数部分,可以实现更细腻的分频 
计算公式:波特率 = fPCLK2/1 / (16 * DIV)
  • f PCLK2/1 ——PCLK2或1的时钟频率
EX:配置USART1为9600波特率
代入公式:9600=72MHz / ( 16 * DIV )
得DIV=468.75

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值