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
    +关注

    关注

    2270

    文章

    10910

    浏览量

    356581
  • 硬件设计
    +关注

    关注

    18

    文章

    398

    浏览量

    44591
收藏 人收藏

    评论

    相关推荐

    stm32用串口烧录怎么设置

    准备工作 确保您拥有STM32开发板和相应的硬件设备,如USB转串口模块。 安装STM32CubeMX和STM32CubeProgrammer软件,这些是ST官方提供的工具,用于配置和
    的头像 发表于 08-22 09:33 1660次阅读

    第三篇-V1.5 TB6612电机pwm控制STM32智能小车 STM32F103C8T6单片机

    通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记
    的头像 发表于 08-12 18:29 1667次阅读
    第三篇-V1.5 TB6612电机pwm控制<b class='flag-5'>STM32</b>智能小车 <b class='flag-5'>STM32</b>F103C8T6单片机

    第一篇:V1.5-STM32f103c8t6智能小车笔记 标准库开发 6612电机驱动新手入门项目

    这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便
    的头像 发表于 08-12 18:25 1694次阅读
    第一篇:V1.5-<b class='flag-5'>STM32</b>f103c8t6智能小车<b class='flag-5'>笔记</b> 标准库开发 6612电机驱动新手入门项目

    如何在STM32F439 DMA中断中区分是哪个通道产生的中断?

    STM32F439有两个DMA控制器DMA1和DMA2,每个控制器有8个,每个有8个通道,我做的是采用串口1DMA中断接收数据,DMA2的2 通道4对应
    发表于 05-17 08:20

    芯海应用笔记:通用 MCU USART 自动波特率检测

    本文档介绍和说明芯海科技旗下 CS32 系列 MCU 的自动波特率检测功能,并为不具备硬件自动波特率检测的 MCU 产品提供替代软件方法 。*附件:应用笔记:芯海通用MCU USART自动波特率检测.pdf
    发表于 05-16 11:42

    请问STM32F207+DP83848如何实现以太网硬件控?

    在我的应用中,我用UDP传送数据,STM32+DP83848采用UDP接收,如果PC端全速传送一个文件,STM32处理比较慢,会存在丢数据的情况。 我看STM32存在硬件
    发表于 05-11 08:55

    USART上对应RTS的GPIO引脚不需要定义吗?

    提到是硬件控制,在进行串口初始化的时候,把下面定义的USART_InitStructure.USART
    发表于 04-25 08:05

    STM32L151C8T6同样的代码,USART1正常,USART2不工作是为什么?

    请教: MCU是STM32L151C8T6。 同样的代码,USART1正常,USART2不工作。 请问,这是为什么 ?
    发表于 04-23 06:03

    STM32F103使用硬件SPI1,USART2不出时钟怎么解决?

    STM32F103C8T6单片机,使用usart2的smartcard接口,单独使用时正常,CK脚可以正常输出clk。当我在添加一路SPI1时,CK脚就不能正常输出CLK信号了。CK脚是SPI的NSS脚。但是没有在cube里配置使用硬件
    发表于 04-17 07:25

    STM32 USART中断与ADC DMA中断冲突造成硬件错误的原因?

    使用STM32USART与主机设备通讯,主机设备每隔50ms会与STM32USART通讯一次,使用ADC 的DMA功能采集数据,再通过USART
    发表于 04-02 06:26

    跟优秀的人,学习笔记!文末有看海的点评

    很多同学私信我,说自己学习时不会记笔记,要么是记录的非常潦草,没有保留有效信息。要么是把所有信息都抄到笔记本上,结果变成了抄书,自己都不想看。 我们学习时,怎么高效记录
    的头像 发表于 03-22 18:19 1205次阅读
    跟优秀的人,<b class='flag-5'>学习</b>记<b class='flag-5'>笔记</b>!文末有看海的点评

    allegro学习笔记

    电子发烧友网站提供《allegro学习笔记.zip》资料免费下载
    发表于 02-29 09:14 1次下载

    变频器的硬件保护和软件过保护分别是怎么判断的?

    通用变频器分别由硬件保护和软件过保护,我随便距离一个变频器设计定标方案,举例输出额定电流的两倍峰值为过流点,那么从硬件和软件方面是怎么判断出变频器输出过
    发表于 02-25 20:40

    学习笔记分享|使用C库函数控制ELF 1开发板的LED

    (ELF1/ELF1S开发板及显示屏)在嵌入式Linux系统开发中,通过编程控制硬件资源是至关重要的技能之一,今天跟各位小伙伴分享一篇专注于介绍如何使用C库函数控制ELF1开发板LED的学习笔记
    的头像 发表于 01-19 11:12 589次阅读
    <b class='flag-5'>学习</b><b class='flag-5'>笔记</b>分享|使用C库函数控制ELF 1开发板的LED

    uart与usart区别 usart可以当uart用吗

    USART实际上包含了UART的功能,并增加了支持同步通信的能力。在大多数微控制器中,UART通常是USART功能的一部分,USART可以配置为UART模式进行异步通信。
    发表于 01-17 15:46 1.9w次阅读
    uart与<b class='flag-5'>usart</b>区别 <b class='flag-5'>usart</b>可以当uart用吗