串口通信指串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。
UART串口時(shí)序
UART串口配置
1)串口時(shí)鐘使能。串口作為 STM32 的一個(gè)外設(shè),其時(shí)鐘由外設(shè)時(shí)鐘使能寄存器控制,這里我們使用的串口1是APB2ENR寄存器的第14位。(除了串口 1 的時(shí)鐘使能在 APB2ENR 寄存器,其他串口的時(shí)鐘使能位都在 APB1ENR 寄存器,而 APB2(72M)的頻率一般是 APB1(36M)的一倍。)
2)串口復(fù)位。當(dāng)外設(shè)出現(xiàn)異常的時(shí)候可以通過復(fù)位寄存器里面的對應(yīng)位設(shè)置,實(shí)現(xiàn)該外設(shè)的復(fù)位,然后重新配置這個(gè)外設(shè)達(dá)到讓其重新工作的目的。一般在系統(tǒng)剛開始配置外設(shè)的時(shí)候,都會先執(zhí)行復(fù)位該外設(shè)的操作。
串口 1 的復(fù)位是通過配置 APB2RSTR 寄存器的第 14 位來實(shí)現(xiàn)的。串口1的復(fù)位設(shè)置位在APB2RSTR的第14位。通過向該位寫1復(fù)位串口1,寫 0 結(jié)束復(fù)位。
APB2RSTR 寄存器的各位描述如圖 8.1.1 所示
3)串口波特率設(shè)置。每個(gè)串口都有一個(gè)自己獨(dú)立的波特率寄存器 USART_BRR,通過設(shè)置該寄存器就可以達(dá)到配置不同波特率的目的。
串口波特率計(jì)算公式:見《STM32中文數(shù)據(jù)參考手冊》。
4)STM32 的每個(gè)串口都有 3 個(gè)控制寄存USART_CR1~3,串口的很多配置都是通過這 3 個(gè)寄存器來設(shè)置的。這里我們只要用到 USART_CR1 就可以實(shí)現(xiàn)我們的功能了。
關(guān)于寄存器的具體描述請看《STM32中文數(shù)據(jù)參考手冊》。
該寄存器的高 18 位沒有用到,低 14 位用于串口的功能設(shè)置。
UE 為串口使能位,通過該位置 1,以使能串口。
M 為字長選擇位,當(dāng)該位為 0 的時(shí)候設(shè)置串口為 8 個(gè)字長外加 n 個(gè)停止位,停止位的個(gè)數(shù)(n)是根據(jù)USART_CR2 的[13:12]位設(shè)置來決定的,默認(rèn)為 0。
PCE 為校驗(yàn)使能位,設(shè)置為 0,則禁止校驗(yàn),否則使能校驗(yàn)。
PS 為校驗(yàn)位選擇,設(shè)置為 0 則為偶校驗(yàn),否則為奇校驗(yàn)。
TXIE 為發(fā)送緩沖區(qū)空中斷使能位,設(shè)置該位為 1,當(dāng) USART_SR 中的 TXE 位為1 時(shí),將產(chǎn)生串口中斷。
TCIE 為發(fā)送完成中斷使能位,設(shè)置該位為 1,當(dāng) USART_SR 中的 TC位為 1 時(shí),將產(chǎn)生串口中斷。RXNEIE 為接收緩沖區(qū)非空中斷使能,設(shè)置該位為 1,當(dāng) USART_SR中的 ORE 或者 RXNE 位為 1 時(shí),將產(chǎn)生串口中斷。
TE 為發(fā)送使能位,設(shè)置為 1,將開啟串口的發(fā)送功能。
RE 為接收使能位,用法同 TE。
5)數(shù)據(jù)發(fā)送與接收。STM32 的發(fā)送與接收是通過數(shù)據(jù)寄存器USART_DR 來實(shí)現(xiàn)的,這是一個(gè)雙寄存器,包含了 TDR 和 RDR。當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會自動發(fā)送,當(dāng)收到數(shù)據(jù)的時(shí)候,也是存在該寄存器內(nèi)。
DR[8:0]為串口數(shù)據(jù),包含了發(fā)送或接收的數(shù)據(jù)。
當(dāng)使能校驗(yàn)位(USART_CR1 中 PCE 位被置位)進(jìn)行發(fā)送時(shí),寫到 MSB 的值(根據(jù)數(shù)據(jù)的長度不同,MSB 是第 7 位或者第 8 位)會被后來的校驗(yàn)位取代。當(dāng)使能校驗(yàn)位進(jìn)行接收時(shí),讀到的 MSB 位是接收到的校驗(yàn)位
6)串口狀態(tài)。串口的狀態(tài)可以通過狀態(tài)寄存器 USART_SR 讀取。USART_SR 的各位描述:
RXNE(讀數(shù)據(jù)寄存器非空),當(dāng)該位被置 1 的時(shí)候,就是提示已經(jīng)有數(shù)據(jù)被接收到了,并且可以讀出來了。這時(shí)候我們要做的就是盡快去讀取 USART_DR,通過讀 USART_DR 可以將該位清零,也可以向該位寫 0,直接清除。
TC(發(fā)送完成),當(dāng)該位被置位的時(shí)候,表示 USART_DR 內(nèi)的數(shù)據(jù)已經(jīng)被發(fā)送完成了。如果設(shè)置了這個(gè)位的中斷,則會產(chǎn)生中斷。該位也有兩種清零方式:1)讀 USART_SR,寫USART_DR。2)直接向該位寫 0。
評論
查看更多