當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > STM32 USART串口
什么是串口
串口是串行接口 (Serial Interface)的簡(jiǎn)稱,它是指數(shù)據(jù)一位一位地順序傳送,其特點(diǎn)是通信線路簡(jiǎn)單,只要一對(duì)傳輸線就可以實(shí)現(xiàn)雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠(yuǎn)距離通信,但傳送速度較慢。一條信息的各位數(shù)據(jù)被逐位按順序傳送的通訊方式稱為串行通訊。串行通訊的特點(diǎn)是:數(shù)據(jù)位的傳送,按位順序進(jìn)行,最少只需一根傳輸線即可完成;成本低但傳送速度慢。串行通訊的距離可以從幾米到幾千米;根據(jù)信息的傳送方向,串行通訊可以進(jìn)一步分為單工、半雙工和全雙工三種。
STM32的USART簡(jiǎn)介
在STM32的參考手冊(cè)中,串口被描述成通用同步異步收發(fā)器(USART),它提供了一種靈活的方法與使用工業(yè)標(biāo)準(zhǔn)NRZ異步串行數(shù)據(jù)格式的外部設(shè)備之間進(jìn)行全雙工數(shù)據(jù)交換。有別與USART,還有一個(gè)UART,它在USART基礎(chǔ)上裁剪掉了同步通信功能,只有異步通信。簡(jiǎn)單區(qū)分同步和異步就是看通信時(shí)需不需要對(duì)外提供時(shí)鐘輸出,我們平時(shí)用的串口通信基本都是 UART。
串口通信一般是以幀格式傳輸數(shù)據(jù),即一幀一幀傳輸,每幀包含有起始信號(hào)、數(shù)據(jù)信息、停止信息,可能還有校驗(yàn)信息。USART 滿足外部設(shè)備對(duì)工業(yè)標(biāo)準(zhǔn) NRZ 異步串行數(shù)據(jù)格式的要求,并且使用了小數(shù)波特率發(fā)生器,可以提供多種波特率,使得它的應(yīng)用更加廣泛。USART 支持同步單向通信和半雙工單線通信;還支持局域互連網(wǎng)絡(luò) LIN、智能卡(SmartCard)協(xié)議與 lrDA(紅外線數(shù)據(jù)協(xié)會(huì)) SIR ENDEC規(guī)范。USART支持使用 DMA,可實(shí)現(xiàn)高速數(shù)據(jù)通信。
硬件連接
USART通過3個(gè)引腳與其他設(shè)備連接在一起,任何USART雙向通信至少需要2個(gè)引腳:接受數(shù)據(jù)輸入(RX)和發(fā)送數(shù)據(jù)輸出(TX)。
RX: 接受數(shù)據(jù)串行輸入。通過過采樣技術(shù)來區(qū)別數(shù)據(jù)和噪音,從而恢復(fù)數(shù)據(jù)。
TX: 發(fā)送數(shù)據(jù)輸出。當(dāng)發(fā)送器被禁止時(shí),輸出引腳恢復(fù)到它的I/O端口配置。當(dāng)發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時(shí),TX引腳處處于高電平。在單線和智能卡模式里,此I/O口被同時(shí)用于數(shù)據(jù)的發(fā)送和接收。
USART功能框圖剖析
1、功能引腳
TX:發(fā)送數(shù)據(jù)輸出引腳。
RX:接收。
SW_RX:數(shù)據(jù)接收引腳,屬于內(nèi)部引腳。
nRTS:請(qǐng)求以發(fā)送,n表示低電平有效。如果使能 RTS 流控制,當(dāng)USART接收器準(zhǔn)備好接收新數(shù)據(jù)時(shí)就會(huì)將nRTS變成低電平;當(dāng)接收寄存器已滿時(shí),nRTS將被設(shè)置為高電平。該引腳只適用于硬件流控制。
nCTS:清除以發(fā)送(Clear To Send),n表示低電平有效。如果使能 CTS流控制,發(fā)送器在發(fā)送下一幀數(shù)據(jù)之前會(huì)檢測(cè) nCTS 引腳,如果為低電平,表示可以發(fā)送數(shù)據(jù),如果為高電平則在發(fā)送完當(dāng)前數(shù)據(jù)幀之后停止發(fā)送。該引腳只適用于硬件流控制。
SCLK:發(fā)送器時(shí)鐘輸出引腳。這個(gè)引腳僅適用于同步模式。
以STM32F103RC系列為例,USART1的時(shí)鐘來源于APB2總線時(shí)鐘,最大頻率為72MHZ,其他4個(gè)時(shí)鐘來源于APB1總線時(shí)鐘,最大頻率36MHZ。UART只有異步傳輸功能,沒有SCLK、nCTS和nRTS功能引腳。
2.數(shù)據(jù)寄存器
USART說數(shù)據(jù)寄存器(USART_DR)只有低 9 位有效,并且第 9 位數(shù)據(jù)是否有效要取決于USART 控制寄存器 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ù)模l(fā)送時(shí)把 TDR 內(nèi)容轉(zhuǎn)移到發(fā)送移位寄存器,然后把移位寄存器數(shù)據(jù)每一位發(fā)送出去,接時(shí)把接收到的每一位順序保存在接收移位寄存器內(nèi)然后才轉(zhuǎn)移到 RDR。
USART 支持 DMA 傳輸,可以實(shí)現(xiàn)高速數(shù)據(jù)傳輸。
3.控制器
USART有專門控制發(fā)送的發(fā)送器、控制接收的接收器,還有喚醒單元、中斷控制等。
使用USART之前需要向USART_CR1寄存器的UE位置1使能USART,UE位用于開啟供給串口的時(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引腳輸出,低位在前,高位在后。如果是同步模式SCLK也輸出時(shí)鐘信號(hào)。
一個(gè)字符幀發(fā)送需要3部分:起始位、數(shù)據(jù)幀、停止位。起始位是一個(gè)位周期的低電平,位周期就是每一位占用的時(shí)間 ;數(shù)據(jù)幀就是我們要發(fā)送的8或9位數(shù)據(jù),數(shù)據(jù)是最低位開始傳輸?shù)模煌V刮皇且欢〞r(shí)間周期的高電平。
停止位的時(shí)間長(zhǎng)短可以通過USART控制寄存器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ā)送器開始會(huì)發(fā)送一個(gè)空閑幀(一個(gè)數(shù)據(jù)幀長(zhǎng)度的高電平),接下來就可以往USART_DR寄存器寫入要發(fā)送的數(shù)據(jù)。在寫入最后一個(gè)數(shù)據(jù)后,需等待USART狀態(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線開始搜索起始位。在確定起始位后,就根據(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ā)送完成中斷使能。
4.小數(shù)波特率生成
USART 的發(fā)送器和接收器使用相同的波特率。計(jì)算公式如下:
其中,f PLCK 為 USART 時(shí)鐘, USARTp 是一個(gè)存放在波特率寄存器(USART_BRR)的一個(gè)無符號(hào)定點(diǎn)數(shù)。其中 p_Mantissa[11:0]位定義 USARTp 的整數(shù)部分,p_Fraction[3:0]位定義 USARTp 的小數(shù)部分。
例如:p_Mantissa=24(0x18),p_Fraction=10(0x0A),此時(shí) USART_BRR 值為0x18A;那么USARTp的小數(shù)位10/16=0.625;整數(shù)位24,最終USARTp的值為24.625。
如果知道 USARTp 值為 27.68,那么 p_Fraction=16*0.68=10.88,最接近的正整數(shù)為 11,所以 p_Fraction[3:0]為 0xB;p_Mantissa=整數(shù)(27.68)=27,即為 0x1B。
波特率的常用值有 2400、9600、19200、115200。下面以實(shí)例講解如何設(shè)定寄存器值得到波特率的值。
我們知道 USART1 使用 APB2 總線時(shí)鐘,最高可達(dá) 72MHz,其他 USART 的最高頻率為 36MHz。我們選取 USART1 作為實(shí)例講解,即 f PLCK =72MHz。為得到 115200bps 的波特率,此時(shí):
115200 =72000000/(16 ∗ USARTp)
解 得 USARTp=39.0625,可 算 得 p_Fraction=0.0625*16=1=0x01 ,p_Mantissa=39=0x27,即應(yīng)該設(shè)置 USART_BRR 的值為 0x171。
5.校驗(yàn)控制
STM32F103系列控制器USART支持奇偶校驗(yàn)。使用校驗(yàn)位時(shí),串口傳輸?shù)拈L(zhǎng)度將在8位數(shù)據(jù)幀上加上1位的校驗(yàn)位,總共9位,此時(shí)USART_CR1寄存器的M位需要設(shè)置位1,即9數(shù)據(jù)位。將USART_CR1寄存器的PCE位置1就可以啟動(dòng)奇偶校驗(yàn)控制,奇偶校驗(yàn)由硬件自動(dòng)完成。啟動(dòng)了奇偶校驗(yàn)控制之后,發(fā)送數(shù)據(jù)幀時(shí)會(huì)自動(dòng)添加校驗(yàn)位,接收數(shù)據(jù)自動(dòng)驗(yàn)證校驗(yàn)位。接收數(shù)據(jù)時(shí)如果出現(xiàn)奇偶校驗(yàn)位驗(yàn)證失敗,會(huì)將USART_SR寄存器的PE置1,并可以產(chǎn)生奇偶校驗(yàn)中斷。
使用了奇偶校驗(yàn)控制位后,每個(gè)字符幀的格式變成了:起始位+數(shù)據(jù)幀+校驗(yàn)位+停止位。
根據(jù)M位定義的幀長(zhǎng)度,可能的USART幀格式列在下表中。
6.中斷請(qǐng)求