您的位置: 首頁(yè) >游戲 >

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

2022-06-09 21:42:01 編輯:燕剛彪 來(lái)源:
導(dǎo)讀 大家好,小科來(lái)為大家解答以上問(wèn)題?!維TM32學(xué)習(xí)筆記】USART 硬件流控這個(gè)很多人還不知道,現(xiàn)在讓我們一起來(lái)看看吧!1、流量控制的概念源

大家好,小科來(lái)為大家解答以上問(wèn)題?!維TM32學(xué)習(xí)筆記】USART 硬件流控這個(gè)很多人還不知道,現(xiàn)在讓我們一起來(lái)看看吧!

1、流量控制的概念源于RS232標(biāo)準(zhǔn),其中包含了串口和流量控制的定義。大家一定知道RS232中的“RS”是推薦標(biāo)準(zhǔn)的縮寫,意思是“推薦標(biāo)準(zhǔn)”。與IEEE-1284、IEEE-1394等標(biāo)準(zhǔn)不同,它是由委員會(huì)定制的。所以不同廠家做RS232的時(shí)候會(huì)有一些差異,在流量控制上也會(huì)有差異。下面和大家探討一下流量控制的功能、構(gòu)造和操作。

2、本文主要研究硬件流量控制。

3、為什么需要流量控制?

4、在兩個(gè)串口之間進(jìn)行數(shù)據(jù)通信時(shí),經(jīng)常會(huì)出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象,比如兩臺(tái)計(jì)算機(jī)之間或者一臺(tái)計(jì)算機(jī)與單片機(jī)之間的通信。當(dāng)接收端的數(shù)據(jù)緩沖區(qū)已滿時(shí),如果此時(shí)有數(shù)據(jù)發(fā)送,由于接收端沒(méi)有時(shí)間處理,這樣的數(shù)據(jù)可能會(huì)丟失。在工業(yè)領(lǐng)域或其他領(lǐng)域,經(jīng)常會(huì)遇到這類問(wèn)題。本質(zhì)原因是速度和處理能力的不匹配。比如單片機(jī)主頻只有20M或者30M,ARM的處理能力可能是200M,PC的處理能力是幾個(gè)G,這就使得數(shù)據(jù)在傳輸過(guò)程中很容易丟失。

5、硬件流量控制就是為了解決這個(gè)速度匹配的問(wèn)題。它的基本意思很簡(jiǎn)單。當(dāng)接收方收到的數(shù)據(jù)無(wú)法處理時(shí),它會(huì)向發(fā)送方發(fā)送一個(gè)不再接收的信號(hào)。收到這個(gè)信號(hào)后,發(fā)送方會(huì)停止發(fā)送,直到收到可以繼續(xù)發(fā)送的信號(hào)。因此,流量控制本身可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)度,從而防止數(shù)據(jù)丟失。

6、常見的流量控制方法有兩種:硬件流量控制和軟件流量控制。本文主要討論硬件流程控制。

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

8、圖1,硬件流量控制的連接原理圖

9、在圖1中,之前使用的TX和RX是簡(jiǎn)單的三線式串行通信方法。如果啟用硬件流控,需要在此基礎(chǔ)上增加兩條控制線,一條叫CTS(Clear To Send是輸入信號(hào)),一條叫RTS(Require To Send是輸出信號(hào))。其實(shí)從名字就可以看出,一個(gè)是接收控制,一個(gè)是發(fā)送控制。

10、從硬件連接原理圖可以看出,如果做USART 1到USART 2的傳輸,USART 1的TX接USART 2的RX,USART 1的CTS接USART 2的RTS,數(shù)據(jù)方向是從TX到RX,從串口1到串口2,流量控制是從RTS到CTS,也就是從串口2到串口1。

11、數(shù)據(jù)線的方向與流控線的方向相反。

12、從圖1-硬件流控的連接原理圖可以發(fā)現(xiàn),數(shù)據(jù)線方向與流控線方向相反。為什么呢?本文前面提到的流量控制的主要概念是指接收方?jīng)]有時(shí)間處理這樣的數(shù)據(jù)或者處理能力較弱,需要讓發(fā)送方等待。接收方發(fā)出的信號(hào)稱為RTS信號(hào),發(fā)送方的檢測(cè)引腳稱為CTS。所以硬件連接原理圖的下半部分和上半部分正好相反,接收器接串口2的TX,RTS接串口2的CTS。

13、數(shù)據(jù)收到后如何操作?

14、圖2,接收和RTS信號(hào)示意圖

15、從圖2-接收和RTS信號(hào)示意圖可以看出,RTS信號(hào)在數(shù)據(jù)讀取前一直保持高電平,我們可以看到在開始前都是高電平,這意味著告訴發(fā)送方數(shù)據(jù)還沒(méi)有被取走,請(qǐng)等待發(fā)送方。一旦DMA或CPU從DR寄存器中讀取數(shù)據(jù),RTS將釋放高電平并變?yōu)榈碗娖?。這時(shí)候如果發(fā)送方想發(fā)送數(shù)據(jù),可以直接發(fā)送。

16、總之,RTS表明USART是否準(zhǔn)備好接收新數(shù)據(jù)。

17、另外需要注意的是,當(dāng)USART的FIFO模式,也就是緩沖模式開啟時(shí),RTS信號(hào)不會(huì)被拉高,直到FIFO滿為止。

18、圖3,傳輸和CTS信號(hào)示意圖

19、圖3-傳輸和CTS信號(hào)原理圖中,TDR是USART的傳輸寄存器,數(shù)據(jù)寫入該寄存器。如果此時(shí)移位寄存器中沒(méi)有正在傳輸?shù)臄?shù)據(jù),硬件會(huì)將TDR的內(nèi)容移到移位寄存器中,然后開始按照設(shè)定的波特率、數(shù)據(jù)位等數(shù)據(jù)格式直接傳輸數(shù)據(jù)。這是正常的數(shù)據(jù)傳輸過(guò)程。

20、如果啟用了硬件流量控制功能,將增加一個(gè)實(shí)時(shí)檢測(cè)步驟。在圖3中,當(dāng)未接收到CTS信號(hào)時(shí),TX傳輸線上的數(shù)據(jù)被連續(xù)傳輸,這表明停止位之后是下一個(gè)數(shù)據(jù)的開始位。

21、當(dāng)數(shù)據(jù)2仍在TX線路上傳輸時(shí),如果此時(shí)在CTS信號(hào)上檢測(cè)到高電平,即使在數(shù)據(jù)2的停止位發(fā)送之前寫入數(shù)據(jù)3,新寫入的數(shù)據(jù)也不會(huì)在當(dāng)前字節(jié)發(fā)送之后立即發(fā)送,而是等待直到在CTS引腳上檢測(cè)到低電平,并且數(shù)據(jù)3的起始信號(hào)不會(huì)在TX引腳上開啟。

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

23、有人可能會(huì)有疑問(wèn),CTS 不是馬上就置位了嗎,而且 Data 2 還沒(méi)有完全發(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ā)送過(guò)去了,因?yàn)樵诎l(fā)送 Data 3 的時(shí)候沒(méi)看到有 CTS 的標(biāo)志位,所以就要求我們至少提前三個(gè)時(shí)鐘周期把 RTS 信號(hào)釋放出來(lái),讓 CTS 把這個(gè)信號(hào)檢測(cè)到進(jìn)而讓后面的數(shù)據(jù)不再發(fā)送。RTS 是只要在接收緩沖區(qū)非空的時(shí)候就會(huì)被提前置位,也就是結(jié)果寄存器里面只要有一個(gè)東西就會(huì)把它置位,都會(huì)放在當(dāng)前的移位緩沖寄存器里。

24、在原則上是不會(huì)出現(xiàn)由于 RTS 置位比較晚,導(dǎo)致 CTS比較慢的現(xiàn)象。但是不排除一種情況,就是 CTS 和 RTS 之間的延遲特別大,或者說(shuō)串口的波特率特別快,這個(gè)時(shí)候就容易出現(xiàn)由于 RTS 置位比較晚使得 CTS 比較慢的現(xiàn)象。

25、軟件配置

▲圖4,軟件配置

27、在 CubeMX 里可以選擇一個(gè)串口模式為異步模式,之后在它下面的硬件流控 RS232 中選擇 CTS/RTS。這里要注意一下,CTS 和 RTS 是可以單獨(dú)使能的,可以根據(jù)速度來(lái)選擇使能 CTS 還是 RTS,如果我的速度比較慢的話就使能 RTS,因?yàn)?RTS 是給對(duì)方的信號(hào),不需要考慮對(duì)方的處理能力。

28、另外,在 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è)置它的功能,其他使用功能和串口都是一樣的。

29、

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

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

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

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

34、審核

本文到此結(jié)束,希望對(duì)大家有所幫助。


免責(zé)聲明:本文由用戶上傳,如有侵權(quán)請(qǐng)聯(lián)系刪除!

最新文章

精彩推薦

圖文推薦

點(diǎn)擊排行

2016-2022 All Rights Reserved.平安財(cái)經(jīng)網(wǎng).復(fù)制必究 聯(lián)系QQ280 715 8082   備案號(hào):閩ICP備19027007號(hào)-6

本站除標(biāo)明“本站原創(chuàng)”外所有信息均轉(zhuǎn)載自互聯(lián)網(wǎng) 版權(quán)歸原作者所有。