新聞中心
PRESS CENTER通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發(fā)傳輸器。
首先先來介紹以下同步和異步通信,同步是指,發(fā)送方發(fā)出數(shù)據(jù)后,等接收方發(fā)回響應(yīng)以后才發(fā)下一個數(shù)據(jù)包的通訊方式;異步是指,發(fā)送方發(fā)出數(shù)據(jù)后,不等接收方發(fā)回響應(yīng),接著發(fā)送下個數(shù)據(jù)包的通訊方式。換句話說,同步通信是阻塞方式,異步通信是非阻塞方式。在常見通信總線協(xié)議中,I2C,SPI屬于同步通信而UART屬于異步通信。同步通信的通信雙方必須先建立同步,即雙方的時鐘要調(diào)整到同一個頻率,收發(fā)雙方不停地發(fā)送和接收連續(xù)的同步比特流。異步通信在發(fā)送字符時,發(fā)送端可以在任意時刻開始發(fā)送字符,所以,在UART通信中,數(shù)據(jù)起始位和停止位是必不可少的。
常用RS-232標(biāo)準(zhǔn),這里不詳細(xì)解釋,主要是對應(yīng)設(shè)備的Tx線和Rx線要對應(yīng)正確。
協(xié)議層中,規(guī)定了數(shù)據(jù)包的內(nèi)容,它由起始位、主體數(shù)據(jù)、校驗位以及停止位組成,通信雙方的數(shù)據(jù)包格式要約定一致才能正常收發(fā)數(shù)據(jù) 。
波特率:異步通信中由于沒有時鐘信號,所以2個通信設(shè)備需約定好波特率,常見的有4800、9600、115200等。
通信的起始和停止信號:串口通信的一個數(shù)據(jù)包從起始信號開始,知道停止信號結(jié)束。數(shù)據(jù)包的起始信號由一個邏輯0的數(shù)據(jù)位表示,而數(shù)據(jù)包的停止信號可由0.5、1、1.5或2個邏輯1的數(shù)據(jù)位表示,只要雙方約定一致即可。
有效數(shù)據(jù):在數(shù)據(jù)包的起始位之后緊接著的就是要傳輸?shù)闹黧w數(shù)據(jù)內(nèi)容,也稱為有效數(shù)據(jù),有效數(shù)據(jù)的長度常被約定為8位或9位長。
數(shù)據(jù)校驗:在有效數(shù)據(jù)之后,有一個可選的數(shù)據(jù)校驗位。由于數(shù)據(jù)通信相對容易受到外部干擾導(dǎo)致傳輸數(shù)據(jù)出現(xiàn)偏差,可以在傳輸過程加上校驗位來解決這個問題。校驗方法有奇校驗(odd)、偶校驗(even)、0校驗(space)、1校驗(mark)以及無校驗(noparity)。
奇校驗要求有效數(shù)據(jù)和校驗位中“1”的個數(shù)為奇數(shù),比如一個 8 位長的有效數(shù)據(jù)為:01101001,此時總共有 4 個“1”,為達到奇校驗效果,校驗位為“1”,最后傳輸?shù)臄?shù)據(jù)將是 8 位的有效數(shù)據(jù)加上 1 位的校驗位總共 9 位。偶校驗與奇校驗要求剛好相反,要求幀數(shù)據(jù)和校驗位中“1”的個數(shù)為偶數(shù),比如數(shù)據(jù)幀:11001010,此時數(shù)據(jù)幀“1”的個數(shù)為 4 個,所以偶校驗位為“0”。0 校驗是不管有效數(shù)據(jù)中的內(nèi)容是什么,校驗位總為“0”,1 校驗是校驗位總為“1”。
這張圖是當(dāng)年上學(xué)時使用System C對UART建模的模塊圖。對于接口部分,重要的即為Tx,Rx數(shù)據(jù)輸出,接收接口,clk提供波特率生成模塊的初始時鐘信號。有關(guān)控制器部分,在這里使用邏輯電路來實現(xiàn),具體控制輸出/接收使能,設(shè)備使能等。
在目前的微控制器上,數(shù)字電路控制部分已被封裝,現(xiàn)在只需要操作對應(yīng)寄存器的對應(yīng)位即可實現(xiàn)對UART的控制。以手上芯片STM32F411為例,下圖是UART框圖:
USART 的發(fā)送器和接收器使用相同的波特率。有以下的計算公式
其中,fck為 USART 時鐘, USARTDIV 是一個存放在波特率寄存器(USART_BRR)的一個無符號定點數(shù)。其中 DIV_Mantissa[11:0]位定義 USARTDIV 的整數(shù)部分,DIV_Fraction[3:0]位定義 USARTDIV 的小數(shù)部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時 USART_BRR 值為0x18A;那么USARTDIV的小數(shù)位10/16=0.625;整數(shù)位24,最終USARTDIV的值為24.625。
波特率的常用值有 2400、9600、19200、115200。下面以實例講解如何設(shè)定寄存器值得到波特率的值。我們知道 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,即應(yīng)該設(shè)置USART_BRR的值為0x171。
UART數(shù)據(jù)寄存器(USART_DR)只有低9位有效,并且第9位數(shù)據(jù)是否有效要取決于UART控制寄存器1(USART_CR1)的M位設(shè)置,當(dāng)M位為0時表示8位數(shù)據(jù)字長,當(dāng)M位為1表示9位數(shù)據(jù)字長,我們一般使用8位數(shù)據(jù)字長。
USART_DR包含了已發(fā)送的數(shù)據(jù)或者接收到的數(shù)據(jù)。USART_DR實際是包含了兩個寄存器,一個專門用于發(fā)送的可寫TDR,一個專門用于接收的可讀RDR。當(dāng)進行發(fā)送操作時,往USART_DR寫入數(shù)據(jù)會自動存儲在TDR內(nèi);當(dāng)進行讀取操作時,向USART_DR讀取數(shù)據(jù)會自動提取RDR數(shù)據(jù)。
TDR和RDR都是介于系統(tǒng)總線和移位寄存器之間。串行通信是一個位一個位傳輸?shù)模l(fā)送時把TDR內(nèi)容轉(zhuǎn)移到發(fā)送移位寄存器,然后把移位寄存器數(shù)據(jù)每一位發(fā)送出去,接時把接收到的每一位順序保存在接收移位寄存器內(nèi)然后才轉(zhuǎn)移到RDR。
UART支持DMA傳輸,可以實現(xiàn)高速數(shù)據(jù)傳輸(不經(jīng)過CPU),使能UART的DMA功能需要將USART_CR1寄存器DMAT位置1。
UART有專門控制發(fā)送的發(fā)送器、控制接收的接收器,還有喚醒單元、中斷控制等。使用UART之前需要向USART_CR1寄存器的UE位置1使能UART,UE位用于開啟供給串口的時鐘。發(fā)送或者接收數(shù)據(jù)字長可選8或9位,由USARTT_CR1的M位控制。
1)發(fā)送器
當(dāng)USART_CR1寄存器的發(fā)送使能位TE置1時,啟動數(shù)據(jù)發(fā)送,發(fā)送移位寄存器的數(shù)據(jù)會在TX引腳輸出,低位在前,高位在后。
一個字符幀發(fā)送需要3部分:起始位、數(shù)據(jù)幀、停止位。起始位是一個位周期的低電平,位周期就是每一位占用的時間 ;數(shù)據(jù)幀就是我們要發(fā)送的8或9位數(shù)據(jù),數(shù)據(jù)是最低位開始傳輸?shù)?;停止位是一定時間周期的高電平。
停止位的時間長短可以通過UART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可選0.5個、1個、1.5個、2個停止位。默認(rèn)使用1個停止位。2個停止位適用于正常USART模式、單線模式和調(diào)制解調(diào)器模式。0.5和1.5個停止位用于智能卡模式。
當(dāng)發(fā)使能位TE置1之后,發(fā)送器開始會發(fā)送一個空閑幀(一個數(shù)據(jù)幀長度的高電平),接下來就可以往USART_DR寄存器寫入要發(fā)送的數(shù)據(jù)。在寫入最后一個數(shù)據(jù)后,需等待UART狀態(tài)寄存器(USART_SR)的TC位為1,表示數(shù)據(jù)傳輸完成。USART_CR1寄存器的TCIE位置1,則產(chǎn)生中斷。
發(fā)送數(shù)據(jù)時,幾個重要的標(biāo)志位如下:
TE:發(fā)送使能。
TXE:發(fā)送寄存器為空,發(fā)送單個字節(jié)時使用。
TC:發(fā)送完成,發(fā)送多個字節(jié)數(shù)據(jù)時候使用。
TXIE:發(fā)送完成中斷使能。
2)接收器
將CR1寄存器的RE位置1,使能USART接收,使得接收器在RX線開始搜索起始位。在確定起始位后,就根據(jù)RX線電平狀態(tài)把數(shù)據(jù)存放在接收移位寄存器內(nèi)。接收完成后就把接收移位寄存器的數(shù)據(jù)移到PDR內(nèi),并把USART_SR寄存器的RXNE位置。如果USART_CR2寄存器的RXNEIE置1可以產(chǎn)生中斷。
接收數(shù)據(jù)時,幾個重要的標(biāo)志位如下:
RE:接收使能。
RXNE:讀數(shù)據(jù)寄存器非空。
RXNEIE:發(fā)送完成中斷使能。
USART_CR1寄存器:
USART_CR2寄存器:
USART_CR3寄存器:
關(guān)鍵詞:串口模塊