STM32_USART 串口通訊詳解

對51單片機有了解的都知道51單片機的串口通訊工作原理,我們單片機使用的電平TTL電平,爲了使我們的的單片機與PC進行通信,就需要一個電平轉換芯片,把TTL電平轉換爲USB電平(使用的USB接口,如果使用的DB9接口,電平轉換芯片則爲TTL轉RS232電平芯片),然後通過對SBUF寄存器的讀寫操作來實現PC與MCU的通信。STM32的串口通訊原理與51相同。下面就對USART盡行具體的介紹。

USART(Universal synchronous asynchronous receivertransmitter )通用同步異步收發器,是STM32上基於串口通訊協議來實現與外部通信的一個外設,因爲串口通訊協議的簡單,便捷,所以在如今大多數的產品中都帶支持串口通信,通過串口通信我們可以實現與單片機的通信,能夠監控到我們MCU的收發數據,在進行產品的調試與開發時起着至關重要的作用。

在進行USART講解之前,先講解一下通訊的基本概念。

1、串行通信與並行通信

通訊按照數據傳輸的方式可分爲串行通信與並行通信,串行通訊是指設備之間通過少量數據信號線(一般是 8根以下),地線以及控制信號線,按數據位形式一位一位地傳輸數據的通訊方式。而並行通訊一般是指使用 8、16、32 及 64根或更多的數據線進行傳輸,數據位是同時傳輸的通訊方式,就好比這時有8輛車,串行通信就相當於只有一條馬路8輛車一輛一輛過,而並行通信相當於有8條馬路,8輛車同時通過,方式如下。

串行通信與並行通信的特性對比如下

由於並行傳輸對同步要求較高,且隨着通訊速率的提高,信號干擾的問題會顯著影響通訊性能,現在隨着技術的發展,越來越多的應用場合採用高速率的串行差分傳輸。

2、全雙工、半雙工及單工

根據通訊方向的不同,通訊方式又可以分爲全雙工、半雙工及單工三種方式。

 全雙工:在同一時刻允許兩個設備的任何一個都可以同時進行數據的發送與接收,就好比雙向車道,兩個方向的車輛不會有任何的干擾。

半雙工:在同一時刻,只允許兩個設備進行接收或者發送,不允許在同一時刻單個設備既接收又發送,就好比在一條鄉間小道上同一時刻只允許一輛車通過。

單工:在任何時刻,數據的傳輸方向都是不變的,數據只允許一個固定的方向傳輸,接收雙方是固定的,一個固定爲發送設備,一個固定爲接收設備。就好比是單行道,只允許一個方向的行駛。

3、同步通訊與異步通訊

  根據通訊的數據同步方式又分爲同步和異步兩種通訊方式。主要區別在於當數據傳輸時是否有使用到時鐘信號來進行區分。

同步通訊:在同步通訊中,收發設備雙方會使用一根信號線表示時鐘信號,在時鐘信號的驅動下雙方進行協調,同步數據,通訊中通常雙方會統一規定在時鐘信號的上升沿或下降沿對數據線進行採樣。如下圖所示

異步通訊:在異步通訊中不使用時鐘信號進行數據同步,它們直接在數據信號中穿插一些同步用的信號位,或者把主體數據進行打包,以數據幀的格式傳輸數據,某些通訊中還需要雙方約定數據的傳輸速率,以便更好地同步。

在同步通訊中,數據信號所傳輸的內容絕大部分就是有效數據,而異步通訊中會包含有幀的各種標識符,所以同步通訊的效率更高,但是同步通訊雙方的時鐘允許誤差較小,而異步通訊雙方的時鐘允許誤差較大。

4、通訊速率

衡量通訊性能的一個非常重要的參數就是通訊速率,通常以比特率(Bitrate)來表示,即每秒鐘傳輸的二進制位數,單位爲比特每秒(bit/s)。容易與比特率混淆的概念是“波特率”(Baudrate),它表示每秒鐘傳輸了多少個碼元。而碼元是通訊信號調製的概念,通訊中常用時間間隔相同的符號來表示一個二進制數字,這樣的信號稱爲碼元。如常見的通訊傳輸中,用 0V 表示數字 0,5V 表示數字 1,那麼一個碼元可以表示兩種狀態 0和 1,所以一個碼元等於一個二進制比特位,此時波特率的大小與比特率一致;如果在通訊傳輸中,有 0V、2V、4V 以及 6V 分別表示二進制數 00、01、10、11,那麼每個碼元可以表示四種狀態,即兩個二進制比特位,所以碼元數是二進制比特位數的一半,這個時候的波特率爲比特率的一半。因爲很多常見的通訊中一個碼元都是表示兩種狀態,人們常常直接以波特率來表示比特率。

以上四個就是通訊的基本知識,下面開始就是USART的部分

文章開頭有提到串口通訊是一種非常常用的通訊方式,所以想要使用串口通訊收發雙方設備就需要符合串口通訊協議的物理規定也就是串口的機械電氣特性,同時接受發送時也要符合規定通訊邏輯,統一收發雙方的數據打包、解包標準。也就是要統一收發雙方的物理層與協議層。

我們先來講一下物理層,也就是實現串口通訊協議大多數用以下幾種方式

1、RS232標準

2、USB轉串口

3、原生的串口到串口

1、RS232標準串口通信結構圖如下圖所示

如果兩個通訊設備之間使用的是RS232串行通訊協議標準,那麼MCU出來的TTL電平信號先經過一個TTL轉RS232電平轉換芯片,然後經過一個DB9接口與外部設備進行連接(RS232串行通訊標準COM口俗稱DB9接口),再經過一個電平轉換芯片轉換成CPU可以識別的TTL電平信號來實現通訊。爲什麼要使用電平轉換芯片呢?是因爲TTL電平與RS232電平不兼容,RS232接口任何一條信號線的電壓均爲負邏輯關係,即

RS232:+3v~+15v爲二進制的邏輯0,(-3)v~(-15)v爲二進制的邏輯1,

TTL:+2.4~+5v爲邏輯1,  0~+0.5爲邏輯0

RS232因爲其抗干擾能力強一般用於工業通信而TTL當通訊距離大於40cm時,傳輸數據就會收到干擾。

DB9標準的公頭與母頭的接法如下圖所示

實物如下圖下圖所示

2、USB轉串口的串行通信方式

USB轉串口的通訊方式就是我文章開頭所提到的我當時學習51單片機的UART時的串行通信方式,通訊原理圖如下

USB轉串口的串行通訊協議主要用於MCU與PC間的通訊,並且在通訊時,PC要安裝電平轉換芯片的驅動。

3、原生串口到串口的串行通訊方式

原生的串口通信主要是控制器跟串口的設備戒者傳感器通信,不需要經過電平轉換芯片來轉換電平,直接就用TTL電平通信,比如GPS模塊、GSM模塊、串口轉WIFI模塊、HC04藍牙模塊等。原理圖如下

在應用串口通訊協議時,首先要保證物理層也就是收發雙方的機械電氣特性符合通訊協議的規定,接下來就是要同一收發雙方的數據打包、解包標準。也就是要統一收發雙方的協議層。

我們上邊講通訊的基本概念有提到串行通訊是指設備之間通過少量數據信號線(一般是 8根以下),地線以及控制信號線,按數據位形式一位一位地傳輸數據的通訊方式,收發雙方都有兩個端口,一個RXD 一個TXD , 具體連接如下

數據總是從TXD引腳到RXD引腳,與並行通訊不同在串口傳輸數據中包括起始位、數據幀、校驗位和停止位。通訊雙方的數據包格式要約定一致才能正常收發數據。這裏主要講解異步串行通信,所以沒有時鐘信號,收發雙方只要約定好波特率,即每個碼元的長度(下圖兩個虛線代表一個碼元),就可以完成解碼。串口數據包組成如下

起始位: 由1個邏輯 0 的數據位表示
結束位: 由 0.5、 1、 1.5 戒 2 個邏輯 1 的數據位表示
有效數據 :在起始位後緊接着的就是有效數據,有效數據的長度常被約定爲 5、 6、 7 戒 8 位長。

校驗位:有效數據之後,有一個可選的數據校驗位。由於數據通信相對更容易受到外部干擾導致傳輸數據出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0校驗(space)、1校驗(mark)以及無校驗(noparity),它們介紹如下:

奇校驗:奇校驗要求有效數據和校驗位中“1”的個數爲奇數,比如一個 8 位長的有效數據爲:01101001,此時總共有 4 個“1”,爲達到奇校驗效果,校驗位爲“1”,最後傳輸的數據將是 8位的有效數據加上 1位的校驗位總共 9位。

偶校驗:偶校驗與奇校驗要求剛好相反,要求幀數據和校驗位中“1”的個數爲偶數,比如數據幀:11001010,此時數據幀“1”的個數爲 4個,所以偶校驗位爲“0”。

 0校驗:0 校驗是不管有效數據中的內容是什麼,校驗位總爲“0”。

1 校驗:1校驗是不管數據中內容爲什麼校驗位總爲1 。

無校驗:沒有校驗位。

要想實現串口通信協議1、配置好物理層2、統一規定收發雙方波特率、起始位、數據幀、校驗位和停止位。

關於串口通訊的物理層與協議層就是以上內容,接下來實際講解STM32如何去配置實現串口通訊

1、STM32_USART簡介

STM32芯片具有多個 USART 外設用於串口通訊,它是 Universal SynchronousAsynchronous Receiver and Transmitter的縮寫,即通用同步異步收發器可以靈活地與外部設備進行全雙工數據交換。有別於 USART,它還有具有 UART 外設(Universal AsynchronousReceiver and Transmitter),它是在 USART 基礎上裁剪掉了同步通信功能,只有異步通信。簡單區分同步和異步就是看通信時需不需要對外提供時鐘輸出,我們平時用的串口通信基本都是 UART。USART 滿足外部設備對工業標準 NRZ異步串行數據格式的要求,並且使用了小數波特率發生器,可以提供多種波特率,使得它的應用更加廣泛。USART 支持同步單向通信和半雙工單線通信;還支持局域互連網絡 LIN、智能卡(SmartCard)協議與 lrDA(紅外線數據協會) SIR ENDEC 規範。USART 在 STM32應用最多莫過於“打印”程序信息,一般在硬件設計時都會預留一個 USART 通信接口連接電腦,用於在調試程序是可以把一些調試信息“打印”在電腦端的串口調試助手工具上,從而瞭解程序運行是否正確、指出運行出錯位置等等。STM32的 USART 輸出的是 TTL電平信號,若需要 RS-232標準的信號可使用MAX3232芯片進行轉換。

那我們如何對STM32的USART進行配置呢,我們如何來規定串口通訊的起始位那些呢,這就需要我們對STM32的USART的功能框圖有一定的瞭解,如下圖所示

功能框圖大致分爲4部分

1、功能引腳

TX:發送數據輸出引腳。

RX:接收數據輸入引腳。

SW_RX:數據接收引腳,只用於單線和智能卡模式,屬於內部引腳,沒有具體外部引腳。

nRTS:請求以發送(Request To Send),n表示低電平有效。如果使能 RTS 流控制,當USART 接收器準備好接收新數據時就會將 nRTS 變成低電平;當接收寄存器已滿時,nRTS 將被設置爲高電平。該引腳只適用於硬件流控制。也就是使用硬件來控制數據的接收與發送。

nCTS:清除以發送(Clear To Send),n 表示低電平有效。如果使能 CTS 流控制,發送器在發送下一幀數據之前會檢測 nCTS 引腳,如果爲低電平,表示可以發送數據,如果爲高電平則在發送完當前數據幀之後停止發送。該引腳只適用於硬件流控制。

SCLK:發送器時鐘輸出引腳。這個引腳僅適用於同步模式。

2、數據寄存器(USART_DR)   ********************* 收發原理                                                                                                              USART 數據寄存器(USART_DR)只有低 9位有效,並且第 9 位數據是否有效要取決於USART 控制寄存器 1(USART_CR1)的 M 位設置,當 M 位爲 0 時表示 8位數據字長,當 M位爲 1表示 9位數據字長,我們一般使用 8位數據字長。

USART_DR 包含了已發送的數據或者接收到的數據。USART_DR 實際是包含了兩個寄存器,一個專門用於發送的可寫 TDR,一個專門用於接收的可讀 RDR。當進行發送操作時,往 USART_DR 寫入數據會自動存儲在 TDR內;當進行讀取操作時,向 USART_DR讀取數據會自動提取 RDR數據。

TDR 和 RDR 都是介於系統總線和移位寄存器之間。串行通信是一個位一個位傳輸的,發送時把 TDR 內容轉移到發送移位寄存器,然後把移位寄存器數據每一位發送出去,接收時把接收到的每一位順序保存在接收移位寄存器內然後才轉移到 RDR。

3、控制器   ********************接下來是如何配置收發

USART 有專門控制發送的發送器、控制接收的接收器,還有喚醒單元、中斷控制等等。使用 USART 之前需要向 USART_CR1寄存器的 UE 位置 1 使能 USART。發送或者接收數據字長可選 8位或 9位,由 USART_CR1的 M 位控制。

(1)發送器

當 USART_CR1寄存器的發送使能位 TE 置 1時,啓動數據發送,發送移位寄存器的數據會在 TX 引腳輸出,如果是同步模式 SCLK也輸出時鐘信號。

一個字符幀發送需要三個部分:起始位+數據幀+停止位。起始位是一個位週期的低電平,位週期就是每一位佔用的時間;數據幀就是我們要發送的 8位或 9位數據,數據是從最低位開始傳輸的;停止位是一定時間週期的高電平。

停止位時間長短是可以通過 USART 控制寄存器 2(USART_CR2)的 STOP[1:0]位控制,可選 0.5個、1個、1.5個和 2個停止位。默認使用 1個停止位。2個停止位適用於正常USART 模式、單線模式和調制解調器模式。0.5 個和 1.5個停止位用於智能卡模式。

當選擇 8位字長,使用 1個停止位時,具體發送字符時序圖如下

當發送使能位 TE 置 1之後,發送器開始會先發送一個空閒幀(一個數據幀長度的高電平),接下來就可以往 USART_DR 寄存器寫入要發送的數據。在寫入最後一個數據後,需要等待 USART 狀態寄存器(USART_SR)的 TC位爲 1,表示數據傳輸完成,如果
USART_CR1寄存器的 TCIE 位置 1,將產生中斷。

在發送數據時,編程的時候有幾個比較重要的標誌位如下表所示

(2)接收器

如果將 USART_CR1寄存器的 RE 位置 1,使能 USART 接收,使得接收器在 RX 線開始搜索起始位。在確定到起始位後就根據 RX 線電平狀態把數據存放在接收移位寄存器內。接收完成後就把接收移位寄存器數據移到 RDR內,並把 USART_SR 寄存器的 RXNE 位置1,同時如果 USART_CR2寄存器的 RXNEIE 置 1的話可以產生中斷。

在接收數據時,編程的時候有幾個比較重要的標誌位如下表所示

爲得到一個信號真實情況,需要用一個比這個信號頻率高的採樣信號去檢測,稱爲過採樣,這個採樣信號的頻率大小決定最後得到源信號準確度,一般頻率越高得到的準確度越高,但爲了得到越高頻率採樣信號越也困難,運算和功耗等等也會增加,所以一般選擇合適就好。
接收器可配置爲不同過採樣技術,以實現從噪聲中提取有效的數據。USART_CR1寄存器的 OVER8位用來選擇不同的採樣採樣方法,如果 OVER8位設置爲 1採用 8倍過採樣,即用 8個採樣信號採樣一位數據;如果 OVER8 位設置爲 0採用 16 倍過採樣,即用 16 個採樣信號採樣一位數據。

4、小數波特率生成

波特率指數據信號對載波的調製速率,它用單位時間內載波調製狀態改變次數來表示,單位爲波特。比特率指單位時間內傳輸的比特數,單位 bit/s(bps)。對於 USART 波特率與比特率相等,以後不區分這兩個概念。波特率越大,傳輸速率越快。USART 的發送器和接收器使用相同的波特率。計算公式如下:。                                                           其中,f PLCK 爲 USART 時鐘,OVER8 爲 USART_CR1 寄存器的 OVER8位對應的值,USARTDIV 是一個存放在波特率寄存器(USART_BRR)的一個無符號定點數。其中 DIV_Mantissa[11:0]位定義 USARTDIV 的整數部分,DIV_Fraction[3:0]位定義USARTDIV 的小數部分,DIV_Fraction[3]位只有在 OVER8 位爲 0 時有效,否則必須清零。當設置波特率時直接調用庫函數即可,原理只需瞭解。

5、校驗控制

STM32F4xx 系列控制器 USART 支持奇偶校驗。當使用校驗位時,串口傳輸的長度將是 8位的數據幀加上 1位的校驗位總共 9位,此時 USART_CR1寄存器的 M 位需要設置爲1,即 9 數據位。將 USART_CR1 寄存器的 PCE 位置 1 就可以啓動奇偶校驗控制,奇偶校驗由硬件自動完成。啓動了奇偶校驗控制之後,在發送數據幀時會自動添加校驗位,接收數據時自動驗證校驗位。接收數據時如果出現奇偶校驗位驗證失敗,會見 USART_SR 寄存器的 PE 位置 1,並可以產生奇偶校驗中斷。使能了奇偶校驗控制後,每個字符幀的格式將變成:起始位+數據幀+校驗位+停止位。

6、中斷控制

USART 有多箇中斷請求事件,具體如下圖所示。

以上就是有關於STM32的USART的基本介紹。關於USART的應用,我會在下一篇中進行操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章