stm32 USART 串口通信操作寄存器+庫函數
stm32的最多可以提供5路串口,有分數波特率發生器、支持同步單線通信和半雙工單線通信、具有DMA等。使用USART時,stm32的I/O口經RS232電平轉換電路 和電腦的串口連接。
串口使用只需要開始串口時鐘,設置相應的I/O口模式,配置波特率、數據位長度、奇偶校驗位等信息就可以使用了。
我使用了三種方式使用串口通信,只可以開啟一項:
- USART通過使用printf()函數發送信息;
- USART和上位機通信,接收到數據后原數據輸出;
- USART主動發送數據。
操作寄存器
串口的復位是通過配置APB2RSTR 寄存器的第14位,當外設出現故障時,可以通過復位寄存器復位,在系統初始化時,都會執行復位操作。
串口的波特率設置是在USART_BRR寄存器上, 實際上這個寄存器配置的是波特比率的分頻觸發因子的值,波特率是一秒鐘通過的字符,而波特比率是一秒鐘通過的二進制位數,所以設置了波特率需要經過一段算法處理 ,得出特定時鐘下,實現這個波特率的,時鐘分頻值。
串口控制寄存器有3個 USART_CR1~3,常用到的就是USART_CR1,各位描述如下:

UE:USART使能 (USART enable)
M:字長 (Word length)該位定義了數據字的長度,0:一個起始位,8個數據位,n個停止位;
1:一個起始位,9個數據位,n個停止位。 n由USART_CR2中設置。
WAKE:喚醒的方法 (Wakeup method) 0:被空閑總線喚醒; 1:被地址標記喚醒。
PCE:檢驗控制使能 (Parity control enable)
PS:校驗選擇 (Parity selection) 0:偶校驗;1:奇校驗。
PEIE:PE中斷使能 (PE interrupt enable)
TXEIE:發送緩沖區空中斷使能 (TXE interrupt enable)
TCIE:發送完成中斷使能 (Transmission complete interrupt enable)
RXNEIE:接收緩沖區非空中斷使能 (RXNE interrupt enable)
IDLEIE:IDLE中斷使能 (IDLE interrupt enable) 0:禁止產生中斷;1:當USART_SR中的IDLE為’1’時,產生USART中斷。
TE:發送使能 (Transmitter enable)
RE:接收使能 (Receiver enable)
RWU:接收喚醒 (Receiver wakeup) 0:接收器處于正常工作模式;1:接收器處于靜默模式。
注意:1.在把USART置于靜默模式(設置RWU位)之前,USART要已經先接收了一個數據字節。否則在靜默模式下,不能被空閑總線檢測喚醒。
2.當配置成地址標記檢測喚醒(WAKE位=1),在RXNE位被置位時,不能用軟件修改RWU位。
SBK:發送斷開幀 (Send break)
數據的發送和接收是在USART_DR來實現的,這是一個雙寄存器,包含了TDR和RDR,當向該寄存器寫入數據時,串口就會自動發送數據;當收到數據時,也是存在該寄存器內中,可以直接讀出。該寄存器只有低9位有效(8:0),其他位都是保留的。
本文引用地址:http://www.104case.com/article/201611/318194.htm串口狀態是通過狀態寄存器USART_SR讀取的,各位描述如下:

TXE:發送數據寄存器空 (Transmit data register empty)
當TDR寄存器中的數據被硬件轉移到移位寄存器的時候,該位被硬件置位。如果USART_CR1寄存器中的TXEIE為1,則產生中斷。對USART_DR的寫操作,將該位清零。
0:數據還沒有被轉移到移位寄存器;
1:數據已經被轉移到移位寄存器。
TC:發送完成 (Transmission complete)
當包含有數據的一幀發送完成后,并且TXE=1時,由硬件將該位置’1’。如果USART_CR1中的TCIE為’1’,則產生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入’0’來清除,只有在多緩存通訊中才推薦這種清除程序。
RXNE:讀數據寄存器非空 (Read data register not empty)
當RDR移位寄存器中的數據被轉移到USART_DR寄存器中,該位被硬件置位,表示已經接收到了數據。如果USART_CR1寄存器中的RXNEIE為1,則產生中斷。對USART_DR的讀操作可以將該位清零。RXNE位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
直接操作寄存器代碼如下:(system.h 和stm32f10x_it.h等相關代碼參照stm32 直接操作寄存器開發環境配置)
User/main.c
view source
#endif
評論