【STM32學(xué)習(xí)筆記】USART 硬件流控

  流控的概念源于 RS232 這個(gè)標(biāo)準(zhǔn),在 RS232 標(biāo)準(zhǔn)里面包含了串口、流控的定義。大家一定了解,RS232 中的“RS”是Recommend

Standard 的縮寫,即”推薦標(biāo)準(zhǔn)“之意,它并不像 IEEE-1284、IEEE-1394 等標(biāo)準(zhǔn),是由“委員會(huì)定制”。因而,不同的廠商在做 RS232

時(shí),多少會(huì)有不同,流控也都會(huì)存在差異。以下我們與大家一起探討流控的作用、搭建及如何操作。

  本文著重探討硬件流控。

  為什么需要流控?

  數(shù)據(jù)在兩個(gè)串口之間進(jìn)行通訊的時(shí)候常常會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,比如兩臺(tái)計(jì)算機(jī)或者是一臺(tái)計(jì)算機(jī)和一個(gè)單片機(jī)之間進(jìn)行通訊,當(dāng)接收端的數(shù)據(jù)緩沖區(qū)已經(jīng)滿了,這個(gè)時(shí)候如果還有數(shù)據(jù)發(fā)送過來,因?yàn)榻邮斩藳]有時(shí)間進(jìn)行處理,那這樣的數(shù)據(jù)就有可能會(huì)丟失。在工業(yè)現(xiàn)場(chǎng)或者其他領(lǐng)域,經(jīng)常會(huì)遇到這種問題,本質(zhì)原因是速度不匹配、處理能力不匹配。比如單片機(jī)的主頻只有20M或30M,ARM的處理能力可能是200M,PC機(jī)的處理能力是幾個(gè)G,這種處理能力的不匹配造成了傳輸?shù)臅r(shí)候數(shù)據(jù)容易丟失。

  硬件流控就是來解決這個(gè)速度匹配的問題。它的基本含義非常簡(jiǎn)單,當(dāng)接收端接收到的數(shù)據(jù)處理不過來時(shí),就向發(fā)送端發(fā)送不再接收的信號(hào),發(fā)送端接收到這個(gè)信號(hào)之后就會(huì)停止發(fā)送,直到收到可以繼續(xù)發(fā)送的信號(hào)再繼續(xù)發(fā)送。因此流控本身是可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)度,進(jìn)而防止數(shù)據(jù)丟失。

  一般常用的流控方式有兩種:硬件流控和軟件流控。本文主要探討硬件流控。

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

  ▲ 圖1,硬件流控的連接原理圖

  圖1中,以前用到的 TX 和 RX,也就是簡(jiǎn)單的三線串口的通訊方式,如果使能了硬件流控,在這個(gè)基礎(chǔ)上需要增加兩根控制線,一根叫 CTS(Clear

To Send 為輸入信號(hào),一根叫 RTS(Require To Send 為輸出信號(hào))。其實(shí)從名字上也可以看到,一個(gè)是接收控制,一個(gè)是發(fā)送控制。

  從硬件連接原理圖中我們可以看到,如果從 USART 1 向 USART 2 發(fā)送的話,USART 1 的 TX 和 USART 2 的 RX

相連,USART 1 的 CTS 和 USART 2 的 RTS 相連,數(shù)據(jù)的方向是從 TX 到 RX,從串口1到串口2,流控是從 RTS 到 CTS

也就是從串口2到串口1。

  數(shù)據(jù)線方向與流控線數(shù)據(jù)方向相反

  從圖1 -

硬件流控的連接原理圖中,大家可以發(fā)現(xiàn)數(shù)據(jù)線方向與流控線數(shù)據(jù)方向是相反的,為什么呢?文章前面提到了流控的主要概念是指接收端沒有時(shí)間處理這樣的數(shù)據(jù)或者是處理能力比較弱,所以需要讓發(fā)送端等待,接收端發(fā)出來的信號(hào)叫

RTS 信號(hào),發(fā)送端檢測(cè)管腳叫 CTS。因此,硬件連接原理圖的下半部分和上半部分正好相反,接收端和串口2的TX相連,RTS和串口2的CTS相連。

  數(shù)據(jù)在接收的時(shí)候具體如何操作?

  ▲ 圖2,接收與RTS信號(hào)原理圖

  從圖2 - 接收與 RTS 信號(hào)原理圖中,我們可以看到,RTS 信號(hào)在數(shù)據(jù)沒有被讀取之前都是保持在高電平狀態(tài),我們可以看到在 Start

之前都是高電平,這也就是告訴發(fā)送端,數(shù)據(jù)還沒有被拿走,請(qǐng)發(fā)送端等待,一旦數(shù)據(jù)被 DMA 或者 CPU 從 DR 寄存器讀取之后,RTS

就釋放高電平,變?yōu)榈碗娖?,這時(shí)候發(fā)送端如果想發(fā)送數(shù)據(jù)的話就可以直接發(fā)送了。

  一句話概括,就是 RTS 表示了 USART 是否已經(jīng)準(zhǔn)備好接收新的數(shù)據(jù)了。

  另外,我們需要注意,當(dāng) USART 的 FIFO 模式也就是緩沖模式開啟的時(shí)候,在 FIFO 滿的時(shí)候才會(huì)去拉高 RTS 信號(hào)。

  ▲ 圖3,發(fā)送與CTS信號(hào)原理圖

  圖3 - 發(fā)送與 CTS 信號(hào)原理圖中,TDR 是 USART

的發(fā)送寄存器,在這個(gè)寄存器中寫入數(shù)據(jù),如果這時(shí)候在移位寄存器中沒有數(shù)據(jù)正在發(fā)送,硬件就會(huì)把 TDR

中的內(nèi)容搬移到移位寄存器中,之后按照設(shè)置好的波特率、數(shù)據(jù)位等數(shù)據(jù)格式開始直接發(fā)送數(shù)據(jù)。這就是一個(gè)正常的數(shù)據(jù)發(fā)送的流程。

  如果使能了硬件流控的功能,就會(huì)增加一個(gè)實(shí)時(shí)檢測(cè)的步驟。在圖3中,當(dāng)沒有收到CTS信號(hào)的時(shí)候,TX 發(fā)送線上數(shù)據(jù)是連續(xù)發(fā)送的,表現(xiàn)形式為:在 STOP

位后緊跟著就是下一個(gè)數(shù)據(jù)的 Start bit。

  當(dāng) Data 2 還在 TX 線上進(jìn)行發(fā)送的時(shí)候,如果此時(shí)在 CTS 信號(hào)上檢測(cè)到了高電平,即使在 Data 2 的 STOP 位發(fā)送完之前寫入了

Data 3,在當(dāng)前的字節(jié)發(fā)送完之后是不會(huì)馬上發(fā)送新寫入的數(shù)據(jù)的,而是要等待,直到在 CTS 管腳上檢測(cè)為低電平后,TX腳上才會(huì)開啟 Data 3 的

Start 信號(hào)。

  這里其實(shí)我們可以簡(jiǎn)單理解一下,在發(fā)送的時(shí)候要實(shí)時(shí)監(jiān)測(cè) CTS 的電平狀態(tài),如果發(fā)現(xiàn)是高電平,就不會(huì)再發(fā)送新的數(shù)據(jù),直到 CTS

檢測(cè)發(fā)現(xiàn)已經(jīng)沒有高電平信號(hào)了。

  需要注意的是在當(dāng)前字節(jié)發(fā)送完之前的三個(gè)時(shí)鐘周期,CTS 需要提前置位上,也就是在Data 2 結(jié)尾的地方如果只差一個(gè) STOP bit,那有可能把

Data 3 連續(xù)發(fā)送出去。

  有人可能會(huì)有疑問,CTS 不是馬上就置位了嗎,而且 Data 2 還沒有完全發(fā)送出去。其實(shí)它是去檢查 CTS

的標(biāo)志位,設(shè)置這個(gè)標(biāo)志位至少需要兩個(gè)時(shí)鐘周期,設(shè)置好了 CTS 的標(biāo)志位之后,硬件才會(huì)去檢查進(jìn)而不去發(fā)送 Data 3 的 Start bit。但如果設(shè)置的

CTS 或者是檢查到的 CTS 已經(jīng)是非常晚了,那后面的一個(gè)字節(jié)就已經(jīng)發(fā)送過去了,因?yàn)樵诎l(fā)送 Data 3 的時(shí)候沒看到有 CTS

的標(biāo)志位,所以就要求我們至少提前三個(gè)時(shí)鐘周期把 RTS 信號(hào)釋放出來,讓 CTS 把這個(gè)信號(hào)檢測(cè)到進(jìn)而讓后面的數(shù)據(jù)不再發(fā)送。RTS

是只要在接收緩沖區(qū)非空的時(shí)候就會(huì)被提前置位,也就是結(jié)果寄存器里面只要有一個(gè)東西就會(huì)把它置位,都會(huì)放在當(dāng)前的移位緩沖寄存器里。

  在原則上是不會(huì)出現(xiàn)由于 RTS 置位比較晚,導(dǎo)致 CTS比較慢的現(xiàn)象。但是不排除一種情況,就是 CTS 和 RTS

之間的延遲特別大,或者說串口的波特率特別快,這個(gè)時(shí)候就容易出現(xiàn)由于 RTS 置位比較晚使得 CTS 比較慢的現(xiàn)象。

  軟件配置

  ▲ 圖4,軟件配置

  在 CubeMX 里可以選擇一個(gè)串口模式為異步模式,之后在它下面的硬件流控 RS232 中選擇 CTS/RTS。這里要注意一下,CTS 和 RTS

是可以單獨(dú)使能的,可以根據(jù)速度來選擇使能 CTS 還是 RTS,如果我的速度比較慢的話就使能 RTS,因?yàn)?RTS

是給對(duì)方的信號(hào),不需要考慮對(duì)方的處理能力。

  另外,在 CubeMX 里也可以使能 RS485 的硬件流控,這里的流控實(shí)際上流控的是數(shù)據(jù)的方向,因?yàn)?RS485

是一個(gè)半雙工的通訊模式,它的數(shù)據(jù)收的時(shí)候就不能發(fā),發(fā)的時(shí)候不能收。STM32 上有一個(gè) DE 管腳和 RS485

的接收器芯片直接相連,控制數(shù)據(jù)的收發(fā),所以我們要知道在 STM32 的硬件流控中其實(shí)包含兩方面的內(nèi)容,一方面是關(guān)于速度的,也就是 RS232 的

CTS、RTS;另一方面是關(guān)于數(shù)據(jù)的方向的控制,它是基于 RS485 的,在軟件中只需要設(shè)置它的功能,其他使用功能和串口都是一樣的。

  硬件流控和軟件流控的區(qū)別

  軟件流控是以特殊的字符來代表從機(jī)已經(jīng)不能再接收新的數(shù)據(jù)了,基本的流程就是從機(jī)在接收數(shù)據(jù)很多的時(shí)候或主動(dòng)給發(fā)送端發(fā)送一個(gè)特殊字符,當(dāng)發(fā)送端接收到這個(gè)特殊字符后就不能再發(fā)送數(shù)據(jù)了。

  軟件流控很方便,不需要增加新的硬件,還是以前的TX、RX,但是使用了軟件流控,它本身的字符也是數(shù)據(jù),這個(gè)數(shù)據(jù)只不過是說在軟件里把它設(shè)置了一個(gè)特殊的含義。如果它是一個(gè)全雙工的通訊,在給另一個(gè)串口發(fā)送數(shù)據(jù)的時(shí)候如果也包含了這樣一個(gè)特殊字符,對(duì)方就會(huì)誤以為我讓它不要再發(fā)送數(shù)據(jù)了,會(huì)有一定的概率出現(xiàn)錯(cuò)誤,而硬件流控就不需要考慮這方面,只需要使用

CTS 和 RTS,所有的數(shù)據(jù)都是由硬件來操作的。

  在實(shí)際的應(yīng)用開發(fā)中,大家需要根據(jù)自己的實(shí)際情況來選擇使用硬件流控還是軟件流控。

  (stm32 USART串口應(yīng)用)

  http://www.makeru.com.cn/live/1392_1164.html?s=45051

  PWM脈寬調(diào)制技術(shù)

  http://www.makeru.com.cn/live/4034_2146.html?s=45051

  基于STM32講解串口操作

  http://www.makeru.com.cn/live/1758_490.html?s=45051

  通過Z-stack協(xié)議棧實(shí)現(xiàn)串口透?jìng)?/p>

  http://www.makeru.com.cn/live/1758_330.html?s=45051

  (零基礎(chǔ)電子產(chǎn)品設(shè)計(jì))

  http://www.makeru.com.cn/live/3727_1388.html?s=45051

  從0到1,設(shè)計(jì)自己的開發(fā)板

  http://www.makeru.com.cn/live/4034_2016.html?s=45051

  老司機(jī)傾囊相授-PCB大牛修煉秘籍

  http://www.makeru.com.cn/live/3472_1296.html?s=45051

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 前言 ??USART是通用(U)同步(S)異步(A)收(R)發(fā)(T)器。??STM32F103VGT6上有3...
    dogo_L1L閱讀 3,081評(píng)論 0 0
  • # STM32之串口DMA接收不定長(zhǎng)數(shù)據(jù) ## 引言 在使用stm32或者其他單片機(jī)的時(shí)候,會(huì)經(jīng)常使用到串口通訊,...
    杰杰T_T閱讀 607評(píng)論 0 0
  • 姓名:周崇杰 學(xué)號(hào):16140120059 專業(yè):機(jī)械設(shè)計(jì)制造及其自動(dòng)化 轉(zhuǎn)載自:http://blog.csd...
    CJbaby閱讀 3,659評(píng)論 0 3
  • USART為通用同步/ 異步收發(fā)器。stm32F103RC內(nèi)置了3個(gè)通用同步/異步收發(fā)器(USART1、USART...
    簡(jiǎn)小黑閱讀 9,131評(píng)論 0 0
  • 和老太太的日常
    卿挽ding閱讀 244評(píng)論 0 0

友情鏈接更多精彩內(nèi)容