1. 程式人生 > >【STM32】串列埠通訊基本原理(超基礎、詳細版)

【STM32】串列埠通訊基本原理(超基礎、詳細版)

STM32F1xx官方資料:

《STM32中文參考手冊V10》-第25章通用同步非同步收發器(USART)

通訊介面背景知識

裝置之間通訊的方式

一般情況下,裝置之間的通訊方式可以分成並行通訊和序列通訊兩種。它們的區別是:

並、序列通訊的區別
並行通訊序列通訊
傳輸原理資料各個位同時傳輸資料按位順序傳輸
優點速度快佔用引腳資源少
缺點佔用引腳資源多速度相對較慢

序列通訊的分類

1、按照資料傳送方向,分為:

  • 單工:資料傳輸只支援資料在一個方向上傳輸;
  • 半雙工:允許資料在兩個方向上傳輸。但是,在某一時刻,只允許資料在一個方向上傳輸,它實際上是一種切換方向的單工通訊;它不需要獨立的接收端和傳送端,兩者可以合併一起使用一個埠
  • 全雙工:允許資料同時在兩個方向上傳輸
    。因此,全雙工通訊是兩個單工通訊方式的結合,需要獨立的接收端和傳送端


2、按照通訊方式,分為:

  • 同步通訊:帶時鐘同步訊號傳輸。比如:SPI,IIC通訊介面。
  • 非同步通訊:不帶時鐘同步訊號。比如:UART(通用非同步收發器),單匯流排。

在同步通訊中,收發裝置上方會使用一根訊號線傳輸訊號,在時鐘訊號的驅動下雙方進行協調,同步資料。例如,通訊中通常雙方會統一規定在時鐘訊號的上升沿或者下降沿對資料線進行取樣。

在非同步通訊中不使用時鐘訊號進行資料同步,它們直接在資料訊號中穿插一些用於同步的訊號位,或者將主題資料進行打包,以資料幀的格式傳輸資料。通訊中還需要雙方規約好資料的傳輸速率(也就是波特率)等,以便更好地同步。

常用的波特率有4800bps、9600bps、115200bps等。

在同步通訊中,資料訊號所傳輸的內容絕大部分是有效資料,而非同步通訊中會則會包含資料幀的各種識別符號,所以同步通訊效率高,但是同步通訊雙方的時鐘允許誤差小,稍稍時鐘出錯就可能導致資料錯亂,非同步通訊雙方的時鐘允許誤差較大。

常見的序列通訊介面

常見的序列通訊介面
通訊標準引腳說明通訊方式通訊方向

UART

(通用非同步收發器)

TXD:傳送端

RXT:接收端

GND:共地

非同步通訊全雙工

1-wire

(單匯流排)

DQ:傳送/接收端非同步通訊半雙工
SPI

SCK:同步時鐘

MISO:主機輸入,從機輸出

MOSI:主機輸出,從機輸入

同步通訊全雙工
I2C

SCK:同步時鐘

SDA:資料輸入/輸出端

同步通訊半雙工

STM32串列埠通訊基礎

STM32的串列埠通訊介面有兩種,分別是:UART(通用非同步收發器)、USART(通用同步非同步收發器)。而對於大容量STM32F10x系列晶片,分別有3個USART和2個UART。

UART引腳連線方法

  • RXD:資料輸入引腳,資料接受;
  • TXD:資料傳送引腳,資料傳送。


對於兩個晶片之間的連線,兩個晶片GND共地,同時TXD和RXD交叉連線。這裡的交叉連線的意思就是,晶片1的RxD連線晶片2的TXD,晶片2的RXD連線晶片1的TXD。這樣,兩個晶片之間就可以進行TTL電平通訊了


若是晶片與PC機(或上位機)相連,除了共地之外,就不能這樣直接交叉連線了。儘管PC機和晶片都有TXD和RXD引腳,但是通常PC機(或上位機)通常使用的都是RS232介面(通常為DB9封裝),因此不能直接交叉連線。RS232介面是9針(或引腳),通常是TxD和RxD經過電平轉換得到的。故,要想使得晶片與PC機的RS232介面直接通訊,需要也將晶片的輸入輸出埠也電平轉換成rs232型別,再交叉連線。

經過電平轉換後,晶片串列埠和rs232的電平標準是不一樣的:

  • 微控制器的電平標準(TTL電平):+5V表示1,0V表示0;
  • Rs232的電平標準:+15/+13 V表示1,-15/-13表示0。

RS-232通訊協議標準串列埠的裝置間通訊結構圖如下: 


所以單片機串列埠與PC串列埠通訊就應該遵循下面的連線方式:在微控制器串列埠與上位機給出的rs232口之間,通過電平轉換電路(如下面圖中的Max232晶片) 實現TTL電平與RS232電平之間的轉換。


具體要了解RS232串列埠的,可以檢視連結RS232串列埠簡介

STM32的UART特點

  • 全雙工非同步通訊
  • 分數波特率發生器系統,提供精確的波特率。傳送和接受共用的可程式設計波特率,最高可達4.5Mbits/s;
  • 可程式設計的資料字長度(8位或者9位);
  • 可配置的停止位(支援1或者2位停止位);
  • 可配置的使用DMA多緩衝器通訊
  • 單獨的傳送器和接收器使能位
  • 檢測標誌:① 接受緩衝器  ②傳送緩衝器空 ③傳輸結束標誌;
  • 多個帶標誌的中斷源,觸發中斷
  • 其他:校驗控制,四個錯誤檢測標誌。

串列埠通訊過程


STM32中UART引數

串列埠通訊的資料包由傳送裝置通過自身的TXD介面傳輸到接收裝置的RXD介面,通訊雙方的資料包格式要規約一致才能正常收發資料。STM32中串列埠非同步通訊需要定義的引數:起始位、資料位(8位或者9位)、奇偶校驗位(第9位)、停止位(1,15,2位)、波特率設定。

UART串列埠通訊的資料包以幀為單位,常用的幀結構為:1位起始位+8位資料位+1位奇偶校驗位(可選)+1位停止位。如下圖所示:


奇偶校驗位分為奇校驗和偶校驗兩種,是一種簡單的資料誤碼校驗方法。奇校驗是指每幀資料中,包括資料位和奇偶校驗位的全部9個位中1的個數必須為奇數;偶校驗是指每幀資料中,包括資料位和奇偶校驗位的全部9個位中1的個數必須為偶數。

校驗方法除了奇校驗(odd)、偶校驗(even)之外,還可以有:0 校驗(space)、1 校驗(mark)以及無校驗(noparity)。 0/1校驗:不管有效資料中的內容是什麼,校驗位總為0或者1。

UART(USART)框圖


這個框圖分成上、中、下三個部分。本文大概地講述一下各個部分的內容,具體的可以看《STM32中文參考手冊》中的描述。

框圖的上部分,資料從RX進入到接收移位暫存器,後進入到接收資料暫存器,最終供CPU或者DMA來進行讀取;資料從CPU或者DMA傳遞過來,進入傳送資料暫存器,後進入傳送移位暫存器,最終通過TX傳送出去。

然而,UART的傳送和接收都需要波特率來進行控制的,波特率是怎樣控制的呢?

這就到了框圖的下部分,在接收移位暫存器、傳送移位暫存器都還有一個進入的箭頭,分別連線到接收器控制、傳送器控制。而這兩者連線的又是接收器時鐘、傳送器時鐘。也就是說,非同步通訊儘管沒有時鐘同步訊號,但是在串列埠內部,是提供了時鐘訊號來進行控制的。而接收器時鐘和傳送器時鐘有是由什麼控制的呢?

可以看到,接收器時鐘和傳送器時鐘又被連線到同一個控制單元,也就是說它們共用一個波特率發生器。同時也可以看到接收器時鐘(發生器時鐘)的計算方法、USRRTDIV的計算方法。

這裡需要知道一個知識點:

  • UART1的時鐘:PCLK2(高速);
  • UART2、UART3、UART4的時鐘:PCLK1(低速)。

框圖的中部分,涉及到UART(USART)的中斷控制部分,在後面的文章中會具體介紹到。