通用異步收發傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種
異步收發傳輸器。
首先先來介紹以下同步和異步通信,同步是指,發送方發出資料後,等接收方發回響應以後才發下一個資料包的通訊方式;異步是指,發送方發出資料後,不等接收方發回響應,接着發送下個資料包的通訊方式。換句話說,同步通信是阻塞方式,異步通信是非阻塞方式。在常見通信總線協定中,I2C,SPI屬于同步通信而UART屬于異步通信。同步通信的通信雙方必須先建立同步,即雙方的時鐘要調整到同一個頻率,收發雙方不停地發送和接收連續的同步比特流。異步通信在發送字元時,發送端可以在任意時刻開始發送字元,是以,在UART通信中,資料起始位和停止位是必不可少的。
硬體層
常用RS-232标準,這裡不詳細解釋,主要是對應裝置的Tx線和Rx線要對應正确。
協定層
協定層中,規定了資料包的内容,它由起始位、主體資料、校驗位以及停止位組成,通信雙方的資料包格式要約定一緻才能正常收發資料 。
波特率:異步通信中由于沒有時鐘信号,是以2個通信裝置需約定好波特率,常見的有4800、9600、115200等。
通信的起始和停止信号:序列槽通信的一個資料包從起始信号開始,知道停止信号結束。資料包的起始信号由一個邏輯0的資料位表示,而資料包的停止信号可由0.5、1、1.5或2個邏輯1的資料位表示,隻要雙方約定一緻即可。
有效資料:在資料包的起始位之後緊接着的就是要傳輸的主體資料内容,也稱為有效資料,有效資料的長度常被約定為8位或9位長。
資料校驗:在有效資料之後,有一個可選的資料校驗位。由于資料通信相對容易受到外部幹擾導緻傳輸資料出現偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0校驗(space)、1校驗(mark)以及無校驗(noparity)。
奇校驗要求有效資料和校驗位中“1”的個數為奇數,比如一個 8 位長的有效資料為:01101001,此時總共有 4 個“1”,為達到奇校驗效果,校驗位為“1”,最後傳輸的資料将是 8 位的有效資料加上 1 位的校驗位總共 9 位。偶校驗與奇校驗要求剛好相反,要求幀資料和校驗位中“1”的個數為偶數,比如資料幀:11001010,此時資料幀“1”的個數為 4 個,是以偶校驗位為“0”。0 校驗是不管有效資料中的内容是什麼,校驗位總為“0”,1 校驗是校驗位總為“1”。
UART功能框圖剖析
這張圖是當年上學時使用System C對UART模組化的子產品圖。對于接口部分,重要的即為Tx,Rx資料輸出,接收接口,clk提供波特率生成子產品的初始時鐘信号。有關控制器部分,在這裡使用邏輯電路來實作,具體控制輸出/接收使能,裝置使能等。
在目前的微控制器上,數字電路控制部分已被封裝,現在隻需要操作對應寄存器的對應位即可實作對UART的控制。以手上晶片STM32F411為例,下圖是UART框圖:
波特率生成子產品:USART 的發送器和接收器使用相同的波特率。有以下的計算公式
其中,fck為 USART 時鐘, USARTDIV 是一個存放在波特率寄存器(USART_BRR)的一個無符号定點數。其中 DIV_Mantissa[11:0]位定義 USARTDIV 的整數部分,DIV_Fraction[3:0]位定義 USARTDIV 的小數部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時 USART_BRR 值為0x18A;那麼USARTDIV的小數位10/16=0.625;整數位24,最終USARTDIV的值為24.625。
波特率的常用值有 2400、9600、19200、115200。下面以執行個體講解如何設定寄存器值得到波特率的值。我們知道 USART1 使用APB2總線時鐘,最高可達72MHz,其他USART的最高頻率為36MHz。我們選取USART1作為執行個體講解,即fck=72MHz。為得到115200bps的波特率,此時:115200=72000000/(16∗USARTDIV),解得USARTDIV=39.0625,可算得DIV_Fraction=0.0625*16=1=0x01,DIV_Mantissa=39=0x27,即應該設定USART_BRR的值為0x171。
資料寄存器:UART資料寄存器(USART_DR)隻有低9位有效,并且第9位資料是否有效要取決于UART控制寄存器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。
UART支援DMA傳輸,可以實作高速資料傳輸(不經過CPU),使能UART的DMA功能需要将USART_CR1寄存器DMAT位置1。
控制器:UART有專門控制發送的發送器、控制接收的接收器,還有喚醒單元、中斷控制等。使用UART之前需要向USART_CR1寄存器的UE位置1使能UART,UE位用于開啟供給序列槽的時鐘。發送或者接收資料字長可選8或9位,由USARTT_CR1的M位控制。
1)發送器
當USART_CR1寄存器的發送使能位TE置1時,啟動資料發送,發送移位寄存器的資料會在TX引腳輸出,低位在前,高位在後。
一個字元幀發送需要3部分:起始位、資料幀、停止位。起始位是一個位周期的低電平,位周期就是每一位占用的時間 ;資料幀就是我們要發送的8或9位資料,資料是最低位開始傳輸的;停止位是一定時間周期的高電平。
停止位的時間長短可以通過UART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可選0.5個、1個、1.5個、2個停止位。預設使用1個停止位。2個停止位适用于正常USART模式、單線模式和數據機模式。0.5和1.5個停止位用于智能卡模式。
當發使能位TE置1之後,發送器開始會發送一個空閑幀(一個資料幀長度的高電平),接下來就可以往USART_DR寄存器寫入要發送的資料。在寫入最後一個資料後,需等待UART狀态寄存器(USART_SR)的TC位為1,表示資料傳輸完成。USART_CR1寄存器的TCIE位置1,則産生中斷。
發送資料時,幾個重要的标志位如下:
TE:發送使能。
TXE:發送寄存器為空,發送單個位元組時使用。
TC:發送完成,發送多個位元組資料時候使用。
TXIE:發送完成中斷使能。
2)接收器
将CR1寄存器的RE位置1,使能USART接收,使得接收器在RX線開始搜尋起始位。在确定起始位後,就根據RX線電平狀态把資料存放在接收移位寄存器内。接收完成後就把接收移位寄存器的資料移到PDR内,并把USART_SR寄存器的RXNE位置。如果USART_CR2寄存器的RXNEIE置1可以産生中斷。
接收資料時,幾個重要的标志位如下:
RE: 接收使能。
RXNE:讀資料寄存器非空。
RXNEIE:發送完成中斷使能。
USART_CR1寄存器:
USART_CR2寄存器:
USART_CR3寄存器:
之後會基于STM32繼續介紹怎樣配置并使用UART,包括序列槽輪詢/中斷/DMA方式發送/接收資料。
撐腰會兒:序列槽(UART)STM32實作zhuanlan.zhihu.com
UART寄存器配置介紹:
撐腰會兒:【嵌入式Linux基礎】2.裸機UARTzhuanlan.zhihu.com