新聞中心
PRESS CENTER
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發(fā)傳輸器。
首先先來(lái)介紹以下同步和異步通信,同步是指,發(fā)送方發(fā)出數(shù)據(jù)后,等接收方發(fā)回響應(yīng)以后才發(fā)下一個(gè)數(shù)據(jù)包的通訊方式;異步是指,發(fā)送方發(fā)出數(shù)據(jù)后,不等接收方發(fā)回響應(yīng),接著發(fā)送下個(gè)數(shù)據(jù)包的通訊方式。換句話說(shuō),同步通信是阻塞方式,異步通信是非阻塞方式。在常見(jiàn)通信總線協(xié)議中,I2C,SPI屬于同步通信而UART屬于異步通信。同步通信的通信雙方必須先建立同步,即雙方的時(shí)鐘要調(diào)整到同一個(gè)頻率,收發(fā)雙方不停地發(fā)送和接收連續(xù)的同步比特流。異步通信在發(fā)送字符時(shí),發(fā)送端可以在任意時(shí)刻開(kāi)始發(fā)送字符,所以,在UART通信中,數(shù)據(jù)起始位和停止位是必不可少的。
常用RS-232標(biāo)準(zhǔn),這里不詳細(xì)解釋,主要是對(duì)應(yīng)設(shè)備的Tx線和Rx線要對(duì)應(yīng)正確。
協(xié)議層中,規(guī)定了數(shù)據(jù)包的內(nèi)容,它由起始位、主體數(shù)據(jù)、校驗(yàn)位以及停止位組成,通信雙方的數(shù)據(jù)包格式要約定一致才能正常收發(fā)數(shù)據(jù) 。
波特率:異步通信中由于沒(méi)有時(shí)鐘信號(hào),所以2個(gè)通信設(shè)備需約定好波特率,常見(jiàn)的有4800、9600、115200等。
通信的起始和停止信號(hào):串口通信的一個(gè)數(shù)據(jù)包從起始信號(hào)開(kāi)始,知道停止信號(hào)結(jié)束。數(shù)據(jù)包的起始信號(hào)由一個(gè)邏輯0的數(shù)據(jù)位表示,而數(shù)據(jù)包的停止信號(hào)可由0.5、1、1.5或2個(gè)邏輯1的數(shù)據(jù)位表示,只要雙方約定一致即可。
有效數(shù)據(jù):在數(shù)據(jù)包的起始位之后緊接著的就是要傳輸?shù)闹黧w數(shù)據(jù)內(nèi)容,也稱為有效數(shù)據(jù),有效數(shù)據(jù)的長(zhǎng)度常被約定為8位或9位長(zhǎng)。
數(shù)據(jù)校驗(yàn):在有效數(shù)據(jù)之后,有一個(gè)可選的數(shù)據(jù)校驗(yàn)位。由于數(shù)據(jù)通信相對(duì)容易受到外部干擾導(dǎo)致傳輸數(shù)據(jù)出現(xiàn)偏差,可以在傳輸過(guò)程加上校驗(yàn)位來(lái)解決這個(gè)問(wèn)題。校驗(yàn)方法有奇校驗(yàn)(odd)、偶校驗(yàn)(even)、0校驗(yàn)(space)、1校驗(yàn)(mark)以及無(wú)校驗(yàn)(noparity)。
奇校驗(yàn)要求有效數(shù)據(jù)和校驗(yàn)位中“1”的個(gè)數(shù)為奇數(shù),比如一個(gè) 8 位長(zhǎng)的有效數(shù)據(jù)為:01101001,此時(shí)總共有 4 個(gè)“1”,為達(dá)到奇校驗(yàn)效果,校驗(yàn)位為“1”,最后傳輸?shù)臄?shù)據(jù)將是 8 位的有效數(shù)據(jù)加上 1 位的校驗(yàn)位總共 9 位。偶校驗(yàn)與奇校驗(yàn)要求剛好相反,要求幀數(shù)據(jù)和校驗(yàn)位中“1”的個(gè)數(shù)為偶數(shù),比如數(shù)據(jù)幀:11001010,此時(shí)數(shù)據(jù)幀“1”的個(gè)數(shù)為 4 個(gè),所以偶校驗(yàn)位為“0”。0 校驗(yàn)是不管有效數(shù)據(jù)中的內(nèi)容是什么,校驗(yàn)位總為“0”,1 校驗(yàn)是校驗(yàn)位總為“1”。
這張圖是當(dāng)年上學(xué)時(shí)使用System C對(duì)UART建模的模塊圖。對(duì)于接口部分,重要的即為Tx,Rx數(shù)據(jù)輸出,接收接口,clk提供波特率生成模塊的初始時(shí)鐘信號(hào)。有關(guān)控制器部分,在這里使用邏輯電路來(lái)實(shí)現(xiàn),具體控制輸出/接收使能,設(shè)備使能等。

在目前的微控制器上,數(shù)字電路控制部分已被封裝,現(xiàn)在只需要操作對(duì)應(yīng)寄存器的對(duì)應(yīng)位即可實(shí)現(xiàn)對(duì)UART的控制。以手上芯片STM32F411為例,下圖是UART框圖:

USART 的發(fā)送器和接收器使用相同的波特率。有以下的計(jì)算公式

其中,fck為 USART 時(shí)鐘, USARTDIV 是一個(gè)存放在波特率寄存器(USART_BRR)的一個(gè)無(wú)符號(hào)定點(diǎn)數(shù)。其中 DIV_Mantissa[11:0]位定義 USARTDIV 的整數(shù)部分,DIV_Fraction[3:0]位定義 USARTDIV 的小數(shù)部分。
例如:DIV_Mantissa=24(0x18),DIV_Fraction=10(0x0A),此時(shí) USART_BRR 值為0x18A;那么USARTDIV的小數(shù)位10/16=0.625;整數(shù)位24,最終USARTDIV的值為24.625。
波特率的常用值有 2400、9600、19200、115200。下面以實(shí)例講解如何設(shè)定寄存器值得到波特率的值。我們知道 USART1 使用APB2總線時(shí)鐘,最高可達(dá)72MHz,其他USART的最高頻率為36MHz。我們選取USART1作為實(shí)例講解,即fck=72MHz。為得到115200bps的波特率,此時(shí):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時(shí)表示8位數(shù)據(jù)字長(zhǎng),當(dāng)M位為1表示9位數(shù)據(jù)字長(zhǎng),我們一般使用8位數(shù)據(jù)字長(zhǎng)。
USART_DR包含了已發(fā)送的數(shù)據(jù)或者接收到的數(shù)據(jù)。USART_DR實(shí)際是包含了兩個(gè)寄存器,一個(gè)專門用于發(fā)送的可寫TDR,一個(gè)專門用于接收的可讀RDR。當(dāng)進(jìn)行發(fā)送操作時(shí),往USART_DR寫入數(shù)據(jù)會(huì)自動(dòng)存儲(chǔ)在TDR內(nèi);當(dāng)進(jìn)行讀取操作時(shí),向USART_DR讀取數(shù)據(jù)會(huì)自動(dòng)提取RDR數(shù)據(jù)。
TDR和RDR都是介于系統(tǒng)總線和移位寄存器之間。串行通信是一個(gè)位一個(gè)位傳輸?shù)?,發(fā)送時(shí)把TDR內(nèi)容轉(zhuǎn)移到發(fā)送移位寄存器,然后把移位寄存器數(shù)據(jù)每一位發(fā)送出去,接時(shí)把接收到的每一位順序保存在接收移位寄存器內(nèi)然后才轉(zhuǎn)移到RDR。
UART支持DMA傳輸,可以實(shí)現(xiàn)高速數(shù)據(jù)傳輸(不經(jīng)過(guò)CPU),使能UART的DMA功能需要將USART_CR1寄存器DMAT位置1。
UART有專門控制發(fā)送的發(fā)送器、控制接收的接收器,還有喚醒單元、中斷控制等。使用UART之前需要向USART_CR1寄存器的UE位置1使能UART,UE位用于開(kāi)啟供給串口的時(shí)鐘。發(fā)送或者接收數(shù)據(jù)字長(zhǎng)可選8或9位,由USARTT_CR1的M位控制。
1)發(fā)送器
當(dāng)USART_CR1寄存器的發(fā)送使能位TE置1時(shí),啟動(dòng)數(shù)據(jù)發(fā)送,發(fā)送移位寄存器的數(shù)據(jù)會(huì)在TX引腳輸出,低位在前,高位在后。
一個(gè)字符幀發(fā)送需要3部分:起始位、數(shù)據(jù)幀、停止位。起始位是一個(gè)位周期的低電平,位周期就是每一位占用的時(shí)間 ;數(shù)據(jù)幀就是我們要發(fā)送的8或9位數(shù)據(jù),數(shù)據(jù)是最低位開(kāi)始傳輸?shù)?;停止位是一定時(shí)間周期的高電平。
停止位的時(shí)間長(zhǎng)短可以通過(guò)UART控制寄存器2(USART_CR2)的STOP[1:0]位控制,可選0.5個(gè)、1個(gè)、1.5個(gè)、2個(gè)停止位。默認(rèn)使用1個(gè)停止位。2個(gè)停止位適用于正常USART模式、單線模式和調(diào)制解調(diào)器模式。0.5和1.5個(gè)停止位用于智能卡模式。
當(dāng)發(fā)使能位TE置1之后,發(fā)送器開(kāi)始會(huì)發(fā)送一個(gè)空閑幀(一個(gè)數(shù)據(jù)幀長(zhǎng)度的高電平),接下來(lái)就可以往USART_DR寄存器寫入要發(fā)送的數(shù)據(jù)。在寫入最后一個(gè)數(shù)據(jù)后,需等待UART狀態(tài)寄存器(USART_SR)的TC位為1,表示數(shù)據(jù)傳輸完成。USART_CR1寄存器的TCIE位置1,則產(chǎn)生中斷。
發(fā)送數(shù)據(jù)時(shí),幾個(gè)重要的標(biāo)志位如下:
TE:發(fā)送使能。
TXE:發(fā)送寄存器為空,發(fā)送單個(gè)字節(jié)時(shí)使用。
TC:發(fā)送完成,發(fā)送多個(gè)字節(jié)數(shù)據(jù)時(shí)候使用。
TXIE:發(fā)送完成中斷使能。
2)接收器
將CR1寄存器的RE位置1,使能USART接收,使得接收器在RX線開(kāi)始搜索起始位。在確定起始位后,就根據(jù)RX線電平狀態(tài)把數(shù)據(jù)存放在接收移位寄存器內(nèi)。接收完成后就把接收移位寄存器的數(shù)據(jù)移到PDR內(nèi),并把USART_SR寄存器的RXNE位置。如果USART_CR2寄存器的RXNEIE置1可以產(chǎn)生中斷。
接收數(shù)據(jù)時(shí),幾個(gè)重要的標(biāo)志位如下:
RE:接收使能。
RXNE:讀數(shù)據(jù)寄存器非空。
RXNEIE:發(fā)送完成中斷使能。
USART_CR1寄存器:

USART_CR2寄存器:

USART_CR3寄存器:

關(guān)鍵詞:串口模塊