0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【STM32学习笔记】USART 硬件流控

小刘 来源:辰光 作者:辰光 2022-02-18 17:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

流控的概念源于 RS232 这个标准,在 RS232 标准里面包含了串口、流控的定义。大家一定了解,RS232 中的“RS”是Recommend Standard 的缩写,即”推荐标准“之意,它并不像 IEEE-1284、IEEE-1394 等标准,是由“委员会定制”。因而,不同的厂商在做 RS232 时,多少会有不同,流控也都会存在差异。以下我们与大家一起探讨流控的作用、搭建及如何操作。

本文着重探讨硬件流控。

为什么需要流控?

数据在两个串口之间进行通讯的时候常常会出现丢失数据的现象,比如两台计算机或者是一台计算机和一个单片机之间进行通讯,当接收端的数据缓冲区已经满了,这个时候如果还有数据发送过来,因为接收端没有时间进行处理,那这样的数据就有可能会丢失。在工业现场或者其他领域,经常会遇到这种问题,本质原因是速度不匹配、处理能力不匹配。比如单片机的主频只有20M或30M,ARM的处理能力可能是200M,PC机的处理能力是几个G,这种处理能力的不匹配造成了传输的时候数据容易丢失。

硬件流控就是来解决这个速度匹配的问题。它的基本含义非常简单,当接收端接收到的数据处理不过来时,就向发送端发送不再接收的信号,发送端接收到这个信号之后就会停止发送,直到收到可以继续发送的信号再继续发送。因此流控本身是可以控制数据传输的进度,进而防止数据丢失。

一般常用的流控方式有两种:硬件流控和软件流控。本文主要探讨硬件流控。

如何在STM32上搭建硬件流控?

pYYBAGIPa6GAXpd0AADF8ILZD7g144.png

▲图1,硬件流控的连接原理图

图1中,以前用到的 TX 和 RX,也就是简单的三线串口的通讯方式,如果使能了硬件流控,在这个基础上需要增加两根控制线,一根叫 CTS(Clear To Send 为输入信号,一根叫 RTS(Require To Send 为输出信号)。其实从名字上也可以看到,一个是接收控制,一个是发送控制。

从硬件连接原理图中我们可以看到,如果从 USART 1 向 USART 2 发送的话,USART 1 的 TX 和 USART 2 的 RX 相连,USART 1 的 CTS 和 USART 2 的 RTS 相连,数据的方向是从 TX 到 RX,从串口1到串口2,流控是从 RTS 到 CTS 也就是从串口2到串口1。

数据线方向与流控线数据方向相反

从图1 - 硬件流控的连接原理图中,大家可以发现数据线方向与流控线数据方向是相反的,为什么呢?文章前面提到了流控的主要概念是指接收端没有时间处理这样的数据或者是处理能力比较弱,所以需要让发送端等待,接收端发出来的信号叫 RTS 信号,发送端检测管脚叫 CTS。因此,硬件连接原理图的下半部分和上半部分正好相反,接收端和串口2的TX相连,RTS和串口2的CTS相连。

数据在接收的时候具体如何操作?

poYBAGIPa8eAK15bAAEzA7WN2b0714.png

▲图2,接收与RTS信号原理图

从图2 - 接收与 RTS 信号原理图中,我们可以看到,RTS 信号在数据没有被读取之前都是保持在高电平状态,我们可以看到在 Start 之前都是高电平,这也就是告诉发送端,数据还没有被拿走,请发送端等待,一旦数据被 DMA 或者 CPU 从 DR 寄存器读取之后,RTS 就释放高电平,变为低电平,这时候发送端如果想发送数据的话就可以直接发送了。

一句话概括,就是 RTS 表示了 USART 是否已经准备好接收新的数据了。

另外,我们需要注意,当 USART 的 FIFO 模式也就是缓冲模式开启的时候,在 FIFO 满的时候才会去拉高 RTS 信号。

pYYBAGIPa-qAJOhGAAGf5F9fTkc064.png

▲图3,发送与CTS信号原理图

图3 - 发送与 CTS 信号原理图中,TDR 是 USART 的发送寄存器,在这个寄存器中写入数据,如果这时候在移位寄存器中没有数据正在发送,硬件就会把 TDR 中的内容搬移到移位寄存器中,之后按照设置好的波特率、数据位等数据格式开始直接发送数据。这就是一个正常的数据发送的流程。

如果使能了硬件流控的功能,就会增加一个实时检测的步骤。在图3中,当没有收到CTS信号的时候,TX 发送线上数据是连续发送的,表现形式为:在 STOP 位后紧跟着就是下一个数据的 Start bit。

当 Data 2 还在 TX 线上进行发送的时候,如果此时在 CTS 信号上检测到了高电平,即使在 Data 2 的 STOP 位发送完之前写入了 Data 3,在当前的字节发送完之后是不会马上发送新写入的数据的,而是要等待,直到在 CTS 管脚上检测为低电平后,TX脚上才会开启 Data 3 的 Start 信号。

这里其实我们可以简单理解一下,在发送的时候要实时监测 CTS 的电平状态,如果发现是高电平,就不会再发送新的数据,直到 CTS 检测发现已经没有高电平信号了。

需要注意的是在当前字节发送完之前的三个时钟周期,CTS 需要提前置位上,也就是在Data 2 结尾的地方如果只差一个 STOP bit,那有可能把 Data 3 连续发送出去。

有人可能会有疑问,CTS 不是马上就置位了吗,而且 Data 2 还没有完全发送出去。其实它是去检查 CTS 的标志位,设置这个标志位至少需要两个时钟周期,设置好了 CTS 的标志位之后,硬件才会去检查进而不去发送 Data 3 的 Start bit。但如果设置的 CTS 或者是检查到的 CTS 已经是非常晚了,那后面的一个字节就已经发送过去了,因为在发送 Data 3 的时候没看到有 CTS 的标志位,所以就要求我们至少提前三个时钟周期把 RTS 信号释放出来,让 CTS 把这个信号检测到进而让后面的数据不再发送。RTS 是只要在接收缓冲区非空的时候就会被提前置位,也就是结果寄存器里面只要有一个东西就会把它置位,都会放在当前的移位缓冲寄存器里。

在原则上是不会出现由于 RTS 置位比较晚,导致 CTS比较慢的现象。但是不排除一种情况,就是 CTS 和 RTS 之间的延迟特别大,或者说串口的波特率特别快,这个时候就容易出现由于 RTS 置位比较晚使得 CTS 比较慢的现象。

软件配置

pYYBAGIPbAWAVj0MAALe7TCYGqA518.png

▲图4,软件配置

在 CubeMX 里可以选择一个串口模式为异步模式,之后在它下面的硬件流控 RS232 中选择 CTS/RTS。这里要注意一下,CTS 和 RTS 是可以单独使能的,可以根据速度来选择使能 CTS 还是 RTS,如果我的速度比较慢的话就使能 RTS,因为 RTS 是给对方的信号,不需要考虑对方的处理能力。

另外,在 CubeMX 里也可以使能 RS485 的硬件流控,这里的流控实际上流控的是数据的方向,因为 RS485 是一个半双工的通讯模式,它的数据收的时候就不能发,发的时候不能收。STM32 上有一个 DE 管脚和 RS485 的接收器芯片直接相连,控制数据的收发,所以我们要知道在 STM32 的硬件流控中其实包含两方面的内容,一方面是关于速度的,也就是 RS232 的 CTS、RTS;另一方面是关于数据的方向的控制,它是基于 RS485 的,在软件中只需要设置它的功能,其他使用功能和串口都是一样的。

硬件流控和软件流控的区别

软件流控是以特殊的字符来代表从机已经不能再接收新的数据了,基本的流程就是从机在接收数据很多的时候或主动给发送端发送一个特殊字符,当发送端接收到这个特殊字符后就不能再发送数据了。

软件流控很方便,不需要增加新的硬件,还是以前的TX、RX,但是使用了软件流控,它本身的字符也是数据,这个数据只不过是说在软件里把它设置了一个特殊的含义。如果它是一个全双工的通讯,在给另一个串口发送数据的时候如果也包含了这样一个特殊字符,对方就会误以为我让它不要再发送数据了,会有一定的概率出现错误,而硬件流控就不需要考虑这方面,只需要使用 CTS 和 RTS,所有的数据都是由硬件来操作的。

在实际的应用开发中,大家需要根据自己的实际情况来选择使用硬件流控还是软件流控。

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2313

    文章

    11195

    浏览量

    374714
  • 硬件设计
    +关注

    关注

    18

    文章

    499

    浏览量

    45697
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Winbond W83L784R/G硬件监控IC:笔记本系统的得力助手

    Winbond W83L784R/G硬件监控IC:笔记本系统的得力助手 在笔记本系统中,稳定的硬件运行离不开对关键参数的实时监控。Winbond的W83L784R/G
    的头像 发表于 04-27 14:40 74次阅读

    LAT1171+STM32F745 USART1 Bootloader 失败原因分析与解决

    STM32 的 Bootloader 可以支持多种协议的,比如 USART,I2C,DFU 等等,USARTBootloader 是客户使用 STM32 的时候常常会用到的协议。客户在
    发表于 01-11 17:33 0次下载

    AN2606_STM32单片机系统内存启动方式应用笔记

    自举程序存储在STM32器件的内部自举ROM(系统存储器)中,由ST在生产期间进行编程。其主要任务是通过一种可用的串行外设(如USART、CAN、USB、I 2C)将应用程序下载到内部Flash中
    发表于 01-08 14:49 0次下载

    USART使用中断模式通讯

    )而开发,对于其他版本的BSP,需要注意使用上的区别。 支持型号: AT32F403Axx 主要使用外设: USART 1 快速使用方法 1.1 硬件资源 1) AT-START-F403A
    发表于 11-19 13:12

    STM32和ESP32有什么区别?如何选开发板?资深工程师学习路线建议!

    在网上搜索“STM32和ESP32的区别”,你可能会得到一堆参数对比:内核、主频、外设、功耗……今天,我们不罗列参数,而是从实际应用、学习路径和职业发展的角度,帮你彻底理清这两大顶MCU的关系
    的头像 发表于 11-07 15:18 1213次阅读
    <b class='flag-5'>STM32</b>和ESP32有什么区别?如何选开发板?资深工程师<b class='flag-5'>学习</b>路线建议!

    AT32F系列 PWC USART接收唤醒SLEEP

    USART、GPIO 下载示例 1 快速使用方法硬件资源 1) AT-START-F403A V1.0开发板(其他型号请使用对应的开发板) 2) 串口PA9, PA10 1.2 软件资源 1
    发表于 11-05 14:06

    USART1、USART2、UART3的串口使用

    本人用蓝牙测试通过了三个串口模块,其中USART1需要重映射配置。USART0我暂时没有启用! 下图是USART1的使用,相关接口映射可以查找“用户指南”,代码在文末(重映射需要开启AF时钟——感谢
    发表于 10-31 09:05

    STM32学习路线!600+讲课程!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)

    数据采集,从AIoT终端设备的低功耗运算到边缘节点的多任务调度,STM32芯片凭借其丰富外设资源、灵活算力配置与卓越的性价比,已成为嵌入式领域的核心硬件载体。结合RTO
    的头像 发表于 10-17 16:39 978次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b>路线!600+讲课程!软<b class='flag-5'>硬件</b>兼修:裸机+RTOS+LVGL+<b class='flag-5'>硬件</b>设计+项目实战 (<b class='flag-5'>STM32</b>多核心开发板)

    STM32串口发送数据,USART_FLAG_TC无法置位怎么解决?

    STM32串口发送数据,在经过一段时间的数据发送,大概200ms发送一下,一次发送大概二三十个字节的数据,有可能会发生USART_FLAG_TC不置位的情况,如何解决或者避免?轮询发送,后卡在了
    发表于 07-29 11:44

    AT32 IAP using the USART

    USART是本应用笔记中的示例。 IAP_Programmer.exe上位机软件和嵌入式IAP USART示例的源代码位于BSP固件库的utilities文件夹内。 概述 IAP
    发表于 07-11 10:51

    stm32N657配置USART2,可以发送,但是为什么无法进入接收中断呢?

    https://gitee.com/liu-qingchang/code/tree/master/stm32n6 main函数和usart代码 使用stm32N657这块评估板,使用cubeMX配置
    发表于 06-18 07:13

    第十四章 USART——串口通讯

    本章介绍了USART串口通讯,含物理层(RS-232、TTL电平)、协议层(波特率、数据帧),及W55MH32的USART功能与应用。
    的头像 发表于 06-14 16:30 2058次阅读
    第十四章 <b class='flag-5'>USART</b>——串口通讯

    电子硬件工程师如何从零开始学习?(文末免费分享从零开始学习资料)

    经常有用户咨询,如何学习和提升电子硬件能力,有没有适合小白学习的资料等等;电子硬件工程师是一个结合理论、实践和创新能力的职业,需要掌握电路设计、元器件选型、PCB设计、嵌入式系统、测试
    的头像 发表于 06-04 07:36 2792次阅读
    电子<b class='flag-5'>硬件</b>工程师如何从零开始<b class='flag-5'>学习</b>?(文末免费分享从零开始<b class='flag-5'>学习</b>资料)

    AS32X601驱动系列教程 USART_串口通讯详解

    USART 不仅支持同步单向通信和半双工单线通信,以及 LIN(局域互连网络)和调制解调器操作 (CTS/RTS) 通过配置多个缓冲区使用 DMA(直接存储器访问)可实现高速数据通信,其通信数据格式如下: 硬件设计 评估板板载了一颗CH340 usb转ttl芯片用于串
    的头像 发表于 05-23 16:54 1048次阅读
    AS32X601驱动系列教程 <b class='flag-5'>USART</b>_串口通讯详解

    硬件工程师炼成之路笔记(建议收藏!)

    本帖最后由 yuu_cool 于 2025-5-20 14:11 编辑 笔记内容 内容目前分为6个大章 1、常用软件及教程 2、器件 3、硬件思维 4、常用电路分析 5、硬件器材 内容主要
    发表于 05-20 13:40