娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

stm32串口USART 硬件流控 --學習筆記

發布者:幸福自在最新更新時間:2024-12-20 來源: jianshu關鍵字:stm32  串口  USART 手機看文章 掃描二維碼
隨時隨地手機看文章

  流控的概念源于 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 引用地址:stm32串口USART 硬件流控 --學習筆記

上一篇:STM32與GD32單片機
下一篇:入門單片機stm32要如何更好的學習

推薦閱讀最新更新時間:2025-04-23 13:23

stm32USART串口配置
概念 在STM32的參考手冊中,串口被描述成通用同步異步收發器(USART),它提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。(好吧我也不是很懂,暫且貼上官方定義,各位看官自己悟吧) 配置步驟 打開時鐘(RCC配置) 由于UART的TX和RX和AFIO都掛在APB2橋上,因此采用固件庫函數RCC_APB2PeriphClockCmd()進行初始化。UARTx需要分情況討論,如果是UART1,則掛在APB2橋上,因此采用RCC_APB2PeriphClockCmd()進行初始化,其余的UART2~5均掛在APB1上。 GPIO配置 GPIO的屬性包含在結構體GPIO_InitTypeD
[單片機]
STM32USART串口庫函數介紹之USART_Init
本文將介紹USART串口的庫函數,總的來說有以下函數體: ※ USART_Init函數:初始化所使用的串口外設 ※ USART_Cmd函數:使能或者失能USART外設 ※ USART_ITConfig函數:使能或者失能指定的USART中斷 ※ USART_SendData函數:通過外設USARTx發送單個數據 ※ USART_ReceiveData函數:返回USARTx最近解釋接收到的數據 ※ USART_GetFlagStatus函數:檢查指定的USART標志位設置與否 ※ USART_ClearFlag函數:清楚USARTx的待處理標志位 ※ USART_GetITStatus函數:檢查指定的U
[單片機]
STM32通過中斷方式實現USART1通信
1.前言 這個例程花了我好幾天的時間,涉及到的內容比較多,走了很多彎路,一定要總結一下! 首先說明,我的開發板不是比較流行的正點原子家的,而是普中的STM32F1,原子家的開發板太貴了。到目前為止,我還沒有發現我的開發板出現硬件上的問題,就是客服很不給力,關于仿真器配置的一個小問題就解決不了。好在網上資料比較豐富,慢慢也能解決自己遇到的一些問題。 思路和程序網上大家列舉的都一樣。在上網查資料的過程中發現,ARM開發板就是厲害,我想找什么問題,不管大家用什么型號的開發板,程序幾乎一點都沒有變化,問題討論起來方便多了! 2.程序摘要 分為4部分:GPIO配置、USART參數配置、NVIC總中斷配置、中斷函數; 在主函數中初始
[單片機]
STM32串口下載后,不小心寫保護和讀保護了,如何解鎖?
在STM32的開發過程中,有些時候可能會不小心開啟了寫保護和讀保護,這將導致程序無法正常使用。此時,需要解鎖芯片以便重新燒寫程序。本文將介紹如何在STM32中解鎖寫保護和讀保護,并提供詳實的步驟以供參考。 1. 測試板子 在開始解鎖之前,需要測試板子是否在保護狀態下。首先,連接板子到電腦,并打開開發環境。在開發環境的終端中輸入命令: ``` bash stm32flash /dev/tty.usbserialXXXX -Rs ``` 如果板子上的芯片已經被保護,則會顯示以下信息: ``` bash Failed to init device. ``` 如果芯片沒有被保護,則會顯示以下信息(具體數字可能會有所不同): ``` bas
[單片機]
stm32自收發串口通信程序解讀
今天學習了串口通信,在正點原子庫函數模板中寫了自收發的程序, void my_usart1_init(void) { GPIO_InitTypeDef gpio; //創建GPIO的初始化結構體 USART_InitTypeDef usart;//創建USART的初始化結構體 NVIC_InitTypeDef nvic;//創建NVIC的初始化結構體 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1的時鐘 gpio
[單片機]
stm32 串口9位數據
STM32可以一次發送9位數據,在此做一下簡單說明。 一般不帶奇偶校驗位的串口數據:起始位(1)+數據位(8)+停止位(1) 帶奇偶校驗位的串口數據:起始位(1)+數據位(8)+校驗位(1)+停止位(1) 如果數據位為9位,即:起始位(1)+數據位(9)+停止位(1) 9位數據STM8串口的配置:UART1_DeInit();//波特率9位1位停止位無奇偶校驗同步時鐘關發送接收使能 UART1_Init((u32)1000000,UART1_WORDLENGTH_9D,UART1_STOPBITS_1,UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENAB
[單片機]
知道STM32串口通信亂碼要怎么處理嗎
STM32串口通信以及溫度采集搞定,其中主要遇到STM32系列單片機時鐘樹的問題,串口通信遇到串口調試助手能夠接收到數據但出現亂碼現象。 開始一直以為是串口配置和程序代碼問題,因為是第一次上電在線調試STM32板子,后面主要查串口波特率配置和收發函數程序段,如下圖: 波特率設置成115200沒問題,試著降低波特率改成9600和4800但問題依舊沒有解決,緊接著如下處理: 將重定向函數注釋,單獨寫串口發送字節和字符串函數,依舊失敗。最后鎖定到系統時鐘配置上,由于手上的STM32開發板改用了12M的晶振,根據單片機時鐘樹的理解和解讀,一般采用外部時鐘HSE,系統時鐘配置成72M,8*9=72,,12*6=72,對于 SYS
[單片機]
知道<font color='red'>STM32</font><font color='red'>串口</font>通信亂碼要怎么處理嗎
STM32 串口簡介
簡介:串口作為 MCU 的重要外部接口,同時也是軟件開發重要的調試手段, 其重要性不言而喻。STM32 的串口資源相當豐富的,功能也相當強勁。ALIENTEK 戰艦 STM32 開發板所使用的 STM32F103ZET6 最多可提供 5 路串口,有分數波特率發生器、支持同步單線通信和半雙工單線通訊、支持 LIN、 支持調制解調器操作、 智能卡協議和 IrDA SIR ENDEC 規范、具有 DMA等。 串口設置的一般步驟可以總結為如下幾個步驟: 1)串口時鐘使能,GPIO時鐘使能 2)串口復位 3)GPIO端口模式設置 4)串口參數初始化 5)開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)
[單片機]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 和田市| 米泉市| 边坝县| 六盘水市| 卓尼县| 德庆县| 昌平区| 永登县| 长海县| 石景山区| 如东县| 信阳市| 海门市| 芮城县| 九龙城区| 白玉县| 句容市| 阿瓦提县| 龙胜| 冷水江市| 卫辉市| 望都县| 紫金县| 铁岭市| 疏附县| 大冶市| 裕民县| 井冈山市| 黔南| 丹阳市| 潍坊市| 景洪市| 宁陵县| 中卫市| 韶山市| 万全县| 金坛市| 金阳县| 平陆县| 三河市| 舞钢市|