新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > stm32 USART 串口通信操作寄存器+庫函數(shù)

stm32 USART 串口通信操作寄存器+庫函數(shù)

作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
串口通信雖然在如今的電腦上使用的越來越少,因?yàn)槠湓谕ㄐ潘俾?,距離已經(jīng)不適應(yīng)pc的要求,取而代之的是USB口。但是在嵌入式領(lǐng)域,USART仍然廣泛運(yùn)用著。
stm32的最多可以提供5路串口,有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通信、具有DMA等。使用USART時(shí),stm32的I/O口經(jīng)RS232電平轉(zhuǎn)換電路 和電腦的串口連接。
串口使用只需要開始串口時(shí)鐘,設(shè)置相應(yīng)的I/O口模式,配置波特率、數(shù)據(jù)位長度、奇偶校驗(yàn)位等信息就可以使用了。
我使用了三種方式使用串口通信,只可以開啟一項(xiàng):
  • USART通過使用printf()函數(shù)發(fā)送信息;
  • USART和上位機(jī)通信,接收到數(shù)據(jù)后原數(shù)據(jù)輸出;
  • USART主動(dòng)發(fā)送數(shù)據(jù)。
操作寄存器
串口的復(fù)位是通過配置APB2RSTR 寄存器的第14位,當(dāng)外設(shè)出現(xiàn)故障時(shí),可以通過復(fù)位寄存器復(fù)位,在系統(tǒng)初始化時(shí),都會(huì)執(zhí)行復(fù)位操作。
串口的波特率設(shè)置是在USART_BRR寄存器上, 實(shí)際上這個(gè)寄存器配置的是波特比率的分頻觸發(fā)因子的值,波特率是一秒鐘通過的字符,而波特比率是一秒鐘通過的二進(jìn)制位數(shù),所以設(shè)置了波特率需要經(jīng)過一段算法處理 ,得出特定時(shí)鐘下,實(shí)現(xiàn)這個(gè)波特率的,時(shí)鐘分頻值。
串口控制寄存器有3個(gè) USART_CR1~3,常用到的就是USART_CR1,各位描述如下:
UE:USART使能 (USART enable)
M:字長 (Word length)該位定義了數(shù)據(jù)字的長度,0:一個(gè)起始位,8個(gè)數(shù)據(jù)位,n個(gè)停止位;
1:一個(gè)起始位,9個(gè)數(shù)據(jù)位,n個(gè)停止位。 n由USART_CR2中設(shè)置。
WAKE:喚醒的方法 (Wakeup method) 0:被空閑總線喚醒; 1:被地址標(biāo)記喚醒。
PCE:檢驗(yàn)控制使能 (Parity control enable)
PS:校驗(yàn)選擇 (Parity selection) 0:偶校驗(yàn);1:奇校驗(yàn)。
PEIE:PE中斷使能 (PE interrupt enable)
TXEIE:發(fā)送緩沖區(qū)空中斷使能 (TXE interrupt enable)
TCIE:發(fā)送完成中斷使能 (Transmission complete interrupt enable)
RXNEIE:接收緩沖區(qū)非空中斷使能 (RXNE interrupt enable)
IDLEIE:IDLE中斷使能 (IDLE interrupt enable) 0:禁止產(chǎn)生中斷;1:當(dāng)USART_SR中的IDLE為’1’時(shí),產(chǎn)生USART中斷。
TE:發(fā)送使能 (Transmitter enable)
RE:接收使能 (Receiver enable)
RWU:接收喚醒 (Receiver wakeup) 0:接收器處于正常工作模式;1:接收器處于靜默模式。
注意:1.在把USART置于靜默模式(設(shè)置RWU位)之前,USART要已經(jīng)先接收了一個(gè)數(shù)據(jù)字節(jié)。否則在靜默模式下,不能被空閑總線檢測(cè)喚醒。
2.當(dāng)配置成地址標(biāo)記檢測(cè)喚醒(WAKE位=1),在RXNE位被置位時(shí),不能用軟件修改RWU位。
SBK:發(fā)送斷開幀 (Send break)
數(shù)據(jù)的發(fā)送和接收是在USART_DR來實(shí)現(xiàn)的,這是一個(gè)雙寄存器,包含了TDR和RDR,當(dāng)向該寄存器寫入數(shù)據(jù)時(shí),串口就會(huì)自動(dòng)發(fā)送數(shù)據(jù);當(dāng)收到數(shù)據(jù)時(shí),也是存在該寄存器內(nèi)中,可以直接讀出。該寄存器只有低9位有效(8:0),其他位都是保留的。

本文引用地址:http://butianyuan.cn/article/201611/318194.htm

串口狀態(tài)是通過狀態(tài)寄存器USART_SR讀取的,各位描述如下:
TXE:發(fā)送數(shù)據(jù)寄存器空 (Transmit data register empty)
當(dāng)TDR寄存器中的數(shù)據(jù)被硬件轉(zhuǎn)移到移位寄存器的時(shí)候,該位被硬件置位。如果USART_CR1寄存器中的TXEIE為1,則產(chǎn)生中斷。對(duì)USART_DR的寫操作,將該位清零。
0:數(shù)據(jù)還沒有被轉(zhuǎn)移到移位寄存器;
1:數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到移位寄存器。
TC:發(fā)送完成 (Transmission complete)
當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,并且TXE=1時(shí),由硬件將該位置’1’。如果USART_CR1中的TCIE為’1’,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入U(xiǎn)SART_DR)。TC位也可以通過寫入’0’來清除,只有在多緩存通訊中才推薦這種清除程序。
RXNE:讀數(shù)據(jù)寄存器非空 (Read data register not empty)
當(dāng)RDR移位寄存器中的數(shù)據(jù)被轉(zhuǎn)移到USART_DR寄存器中,該位被硬件置位,表示已經(jīng)接收到了數(shù)據(jù)。如果USART_CR1寄存器中的RXNEIE為1,則產(chǎn)生中斷。對(duì)USART_DR的讀操作可以將該位清零。RXNE位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
直接操作寄存器代碼如下:(system.h 和stm32f10x_it.h等相關(guān)代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)
User/main.c
view source
#endif



評(píng)論


技術(shù)專區(qū)

關(guān)閉