STM32學習筆記 USART 硬體流控

2022-06-10 06:48:09 字數 3888 閱讀 5049

流控的概念源於 rs232 這個標準,在 rs232 標準裡面包含了串列埠、流控的定義。大家一定了解,rs232 中的「rs」是recommend standard 的縮寫,即」推薦標準「之意,它並不像 ieee-1284、ieee-1394 等標準,是由「委員會定製」。因而,不同的廠商在做 rs232 時,多少會有不同,流控也都會存在差異。以下我們與大家一起**流控的作用、搭建及如何操作。

本文著重**硬體流控。

為什麼需要流控?

資料在兩個串列埠之間進行通訊的時候常常會出現丟失資料的現象,比如兩台計算機或者是一台計算機和乙個微控制器之間進行通訊,當接收端的資料緩衝區已經滿了,這個時候如果還有資料傳送過來,因為接收端沒有時間進行處理,那這樣的資料就有可能會丟失。在工業現場或者其他領域,經常會遇到這種問題,本質原因是速度不匹配、處理能力不匹配。比如微控制器的主頻只有20m或30m,arm的處理能力可能是200m,pc機的處理能力是幾個g,這種處理能力的不匹配造成了傳輸的時候資料容易丟失。

硬體流控就是來解決這個速度匹配的問題。它的基本含義非常簡單,當接收端接收到的資料處理不過來時,就向傳送端傳送不再接收的訊號,傳送端接收到這個訊號之後就會停止傳送,直到收到可以繼續傳送的訊號再繼續傳送。因此流控本身是可以控制資料傳輸的進度,進而防止資料丟失。

如何在stm32上搭建硬體流控?

▲ 圖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相連。

資料在接收的時候具體如何操作?

▲ 圖2,接收與rts訊號原理圖

從圖2 - 接收與 rts 訊號原理圖中,我們可以看到,rts 訊號在資料沒有被讀取之前都是保持在高電平狀態,我們可以看到在 start 之前都是高電平,這也就是告訴傳送端,資料還沒有被拿走,請傳送端等待,一旦資料被 dma 或者 cpu 從 dr 暫存器讀取之後,rts 就釋放高電平,變為低電平,這時候傳送端如果想傳送資料的話就可以直接傳送了。

一句話概括,就是 rts 表示了 usart 是否已經準備好接收新的資料了。

另外,我們需要注意,當 usart 的 fifo 模式也就是緩衝模式開啟的時候,在 fifo 滿的時候才會去拉高 rts 訊號。

▲ 圖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 比較慢的現象。

軟體配置

▲ 圖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 usart串列埠應用)

pwm脈寬調變技術

基於stm32講解串列埠操作

通過z-stack協議棧實現串列埠透傳

(零基礎電子產品設計)

從0到1,設計自己的開發板

老司機傾囊相授-pcb大牛修煉秘籍

STM32學習筆記 USART

參考 include stm32f10x.h 配置nvic void nvic config void 配置串列埠,因為串列埠與gpio復用,所以也要配置gpio void usart config void 傳送乙個byte void usart sendbyte usart typedef us...

STM32學習之USART串列埠

通用同步非同步收發器 usart 支援lin 區域性互連網 智慧卡協議和irda 紅外資料組織 sir endec規範,以及數據機 cts rts 操作 允許多處理器通訊 使用多緩衝器配置的dma方式,可以實現高速資料通訊。stm32f107有5個usart。usart暫存器 狀態暫存器 usart...

STM32詳細配置 USART

前言 串列埠對於處理器來說算是一種標配,也是在軟體開發中必不可少的,那就是使用串列埠來除錯資訊 列印出相應的資訊 stm32f0系列的晶元,串列埠根據型號不同,數量也不同,從1個到8個不等。今天主要總結串列埠簡單且常用的功能,傳送字元和 中斷接收字元。今天提供的串列埠傳送功能將在後面的各個模組總結中...