6.1 STM32串口簡(jiǎn)介
在之前的51單片機(jī)開(kāi)發(fā)中已經(jīng)詳細(xì)地描述過(guò)串行通信協(xié)議,但是51中的串口有一個(gè)缺點(diǎn),就是為了使用串口的波特率必須將晶振更換為11.0592MHz,如果采用12MHz晶振就會(huì)導(dǎo)致波特率誤差太大,以致于串口無(wú)法正常收發(fā),但是如果使用11.0592MHz晶振又會(huì)存在定時(shí)器計(jì)數(shù)誤差(即定時(shí)器計(jì)數(shù)不準(zhǔn)確),在STM32中很好地解決了這個(gè)問(wèn)題,并且擴(kuò)展了串口的應(yīng)用。
STM32F103ZET6最多可提供5路串口,有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持LIN、支持調(diào)制解調(diào)器操作、智能卡協(xié)議和IrDASIRENDEC規(guī)范、具有DMA等。STM32的USART模塊結(jié)構(gòu)框圖如下圖所示。
我們可以從框圖發(fā)現(xiàn),STM32的波特率是低4位表示小數(shù)部分,高12位表示整數(shù)部分,這就是為什么STM32可以在不更換晶振的條件下使用串口通信。
6.2 相關(guān)寄存器
6.2.1 控制寄存器USART_CR1
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | UE | M | WAKE | PCE | PS | PEIE | TXEIE | TCIE | RXNEIE | IDLEIE | TE | RE | RWU | SBK |
Bit 13:USART使能
0:USART分頻器和輸出被禁止
1:USART模塊使能
Bit 12:字長(zhǎng)
0:一個(gè)起始位,8個(gè)數(shù)據(jù)位,n個(gè)停止位
1:一個(gè)起始位,9個(gè)數(shù)據(jù)位,n個(gè)停止位
Bit 11:?jiǎn)拘训姆椒?/p>
0:被空閑總線喚醒
1:被地址標(biāo)記喚醒
Bit 10:檢驗(yàn)控制使能
0:禁止校驗(yàn)控制
1:使能校驗(yàn)控制
Bit 9:校驗(yàn)選擇
0:偶校驗(yàn)
1:奇校驗(yàn)
Bit 8:PE中斷使能
0:禁止產(chǎn)生中斷
1:當(dāng)USART_SR中的PE為1時(shí),產(chǎn)生USART中斷
Bit 7:發(fā)送緩沖區(qū)空中斷使能
0:禁止產(chǎn)生中斷
1:當(dāng)USART_SR中的TXE為1時(shí),產(chǎn)生USART中斷
Bit 6:發(fā)送完成中斷使能
0:禁止產(chǎn)生中斷
1:當(dāng)USART_SR中的TC為1時(shí),產(chǎn)生USART中斷
Bit 5:接收緩沖區(qū)非空中斷使能
0:禁止產(chǎn)生中斷
1:當(dāng)USART_SR中的ORE或者RXNE為1時(shí),產(chǎn)生USART中斷
Bit 4:IDLE中斷使能
0:禁止產(chǎn)生中斷
1:當(dāng)USART_SR中的IDLE為1時(shí),產(chǎn)生USART中斷
Bit 3:發(fā)送使能
0:禁止發(fā)送
1:使能發(fā)送
Bit 2:接收使能
0:禁止接收
1:使能接收,并開(kāi)始搜尋RX引腳上的起始位
Bit 1:接收喚醒
0:接收器處于正常工作模式;
1:接收器處于靜默模式
Bit 0:發(fā)送斷開(kāi)幀
0:沒(méi)有發(fā)送斷開(kāi)字符
1:將要發(fā)送斷開(kāi)字符
6.2.2 波特率寄存器USART_BRR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
USARTDIV_Mantissa[11:0] | USARTDIV_Fraction[3:0] |
Bit 15~Bit 4:波特率整數(shù)部分
Bit 3~Bit 0:波特率小數(shù)部分
注:波特率的計(jì)算公式
6.2.3 數(shù)據(jù)寄存器USART_DR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | DATA[8:0] |
Bit 8~Bit 0:數(shù)據(jù)值
包含了發(fā)送或接收的數(shù)據(jù)。由于它是由兩個(gè)寄存器組成的,一個(gè)給發(fā)送用TDR,一個(gè)給接收用RDR,該寄存器兼具讀和寫(xiě)的功能。當(dāng)USART_CR1中PCE位被置位進(jìn)行發(fā)送時(shí),寫(xiě)到MSB的值(根據(jù)數(shù)據(jù)的長(zhǎng)度不同,MSB是第7位或者第8位)會(huì)被后來(lái)的校驗(yàn)位取代。當(dāng)使能校驗(yàn)位進(jìn)行接收時(shí),讀到的MSB位是接收到的校驗(yàn)位。
6.2.4 狀態(tài)寄存器USART_SR
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- | CTS | LBD | TXE | TC | RXNE | IDLE | ORE | NE | FE | PE |
Bit 9:CTS標(biāo)志(如果設(shè)置了CTSE位,當(dāng)nCTS輸入變化狀態(tài)時(shí),該位被硬件置高,由軟件將其清零)
0:nCTS狀態(tài)線上沒(méi)有變化
1:nCTS狀態(tài)線上發(fā)生變化
Bit 8:LIN斷開(kāi)檢測(cè)標(biāo)志(當(dāng)探測(cè)到LIN斷開(kāi)時(shí),該位由硬件置1,由軟件將其清零)
0:沒(méi)有檢測(cè)到LIN斷開(kāi)
1:檢測(cè)到LIN斷開(kāi)
Bit 7:發(fā)送數(shù)據(jù)寄存器空
當(dāng)TDR寄存器中的數(shù)據(jù)被硬件轉(zhuǎn)移到移位寄存器時(shí),該位被硬件置位,對(duì)USART_DR的寫(xiě)操作,將該位清零。
0:數(shù)據(jù)還沒(méi)有被轉(zhuǎn)移到移位寄存器
1:數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到移位寄存器
Bit 6:發(fā)送完成
當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,并且TXE=1時(shí),由硬件將該位置’1’。然后寫(xiě)入U(xiǎn)SART_DR清除該位。
0:發(fā)送還未完成
1:發(fā)送完成
Bit 5:讀數(shù)據(jù)寄存器非空
當(dāng)數(shù)據(jù)被轉(zhuǎn)移到USART_DR寄存器中,該位被硬件置位。對(duì)USART_DR讀操作可以將該位清零。
0:數(shù)據(jù)沒(méi)有收到;
1:收到數(shù)據(jù),可以讀出
Bit 4:檢測(cè)到總線空閑
當(dāng)檢測(cè)到總線空閑時(shí),該位被硬件置位,則產(chǎn)生中斷。先讀USART_SR,然后讀USART_DR清除該位。
0:沒(méi)有檢測(cè)到空閑總線
1:檢測(cè)到空閑總線
Bit 3:過(guò)載錯(cuò)誤
當(dāng)RXNE仍然是1的時(shí)候,當(dāng)前被接收在移位寄存器中的數(shù)據(jù),需要傳送至RDR寄存器時(shí),硬件將該位置位,先讀USART_SR,然后讀USART_CR清零。
0:沒(méi)有過(guò)載錯(cuò)誤
1:檢測(cè)到過(guò)載錯(cuò)誤
Bit 2:噪聲錯(cuò)誤標(biāo)志
在接收到的幀檢測(cè)到噪音時(shí),由硬件對(duì)該位置位。先讀USART_SR,再讀USART_DR清0。
0:沒(méi)有檢測(cè)到噪聲
1:檢測(cè)到噪聲
Bit 1:幀錯(cuò)誤
當(dāng)檢測(cè)到同步錯(cuò)位,過(guò)多的噪聲或者檢測(cè)到斷開(kāi)符,該位被硬件置位。先讀USART_SR,再讀USART_DR清零
0:沒(méi)有檢測(cè)到幀錯(cuò)誤
1:檢測(cè)到幀錯(cuò)誤或者break符
Bit 0:校驗(yàn)錯(cuò)誤
在接收模式下,如果出現(xiàn)奇偶校驗(yàn)錯(cuò)誤,硬件對(duì)該位置位。依次讀USART_SR和USART_DR清零,在清除PE位前,軟件必須等待RXNE標(biāo)志位被置1。
0:沒(méi)有奇偶校驗(yàn)錯(cuò)誤;
1:奇偶校驗(yàn)錯(cuò)誤
6.3 printf函數(shù)重映射
學(xué)習(xí)C語(yǔ)言的時(shí)候會(huì)經(jīng)常用到一個(gè)函數(shù),就是格式化輸出printf,這個(gè)函數(shù)的源代碼如下所示。
從上圖可以看出來(lái),printf函數(shù)實(shí)際上的核心是putchar函數(shù),在KEIL中,由于我們使用了MicroLIB,所以putchar函數(shù)改為了fputc函數(shù),此時(shí),我們只需要修改fputc函數(shù)就可以完成printf重定向,重定向代碼如下圖所示。
6.4 串口例程
使用printf函數(shù)將串口接收到的字符串發(fā)送出去。
(1)底層寄存器文件stm32f10x.h添加串口寄存器地址。
(2)在SYSTEM目錄下新建usart1目錄,并在usart1目錄下新建usart1.c和usart1.h兩個(gè)文件。
(3)將usart1.c和usart1.h兩個(gè)文件加入工程。
(4)在usart1.c文件內(nèi)寫(xiě)入以下代碼。
(5)在usart1.h添加以下代碼。
(5)在1.c文件中添加以下代碼。
6.5 實(shí)驗(yàn)結(jié)果
-
51單片機(jī)
+關(guān)注
關(guān)注
277文章
5710瀏覽量
127234 -
波特率
+關(guān)注
關(guān)注
2文章
313瀏覽量
34896 -
串行通信協(xié)議
+關(guān)注
關(guān)注
0文章
23瀏覽量
7805
發(fā)布評(píng)論請(qǐng)先 登錄
如何完成STM32的USART窗口通訊實(shí)驗(yàn)
CH32V103基礎(chǔ)教程92-USART-奇偶校實(shí)驗(yàn)
GD32-Colibri-F207實(shí)驗(yàn)板RAM-USART
STM32的USART串口通訊程序

STM32的USART窗口通訊程序

基礎(chǔ)實(shí)驗(yàn)13-USART串口接收實(shí)驗(yàn)

16 . USART 串口通信實(shí)驗(yàn)

外設(shè)資源實(shí)驗(yàn)6-USART2的DMA收發(fā)實(shí)驗(yàn)

STM32中USART串口通信實(shí)驗(yàn)

STM32USART實(shí)驗(yàn)——串口通訊

關(guān)于使用stm32核心板進(jìn)行USART串口通信的實(shí)驗(yàn)

USART的使用

STM32入門學(xué)習(xí)筆記之USART驅(qū)動(dòng)實(shí)驗(yàn)(上)

STM32入門學(xué)習(xí)筆記之USART驅(qū)動(dòng)實(shí)驗(yàn)(下)

評(píng)論