6.1 STM32串口簡介
在之前的51單片機開發中已經詳細地描述過串行通信協議,但是51中的串口有一個缺點,就是為了使用串口的波特率必須將晶振更換為11.0592MHz,如果采用12MHz晶振就會導致波特率誤差太大,以致于串口無法正常收發,但是如果使用11.0592MHz晶振又會存在定時器計數誤差(即定時器計數不準確),在STM32中很好地解決了這個問題,并且擴展了串口的應用。
STM32F103ZET6最多可提供5路串口,有分數波特率發生器、支持同步單線通信和半雙工單線通訊、支持LIN、支持調制解調器操作、智能卡協議和IrDASIRENDEC規范、具有DMA等。STM32的USART模塊結構框圖如下圖所示。
我們可以從框圖發現,STM32的波特率是低4位表示小數部分,高12位表示整數部分,這就是為什么STM32可以在不更換晶振的條件下使用串口通信。
6.2 相關寄存器
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:字長
0:一個起始位,8個數據位,n個停止位
1:一個起始位,9個數據位,n個停止位
Bit 11:喚醒的方法
0:被空閑總線喚醒
1:被地址標記喚醒
Bit 10:檢驗控制使能
0:禁止校驗控制
1:使能校驗控制
Bit 9:校驗選擇
0:偶校驗
1:奇校驗
Bit 8:PE中斷使能
0:禁止產生中斷
1:當USART_SR中的PE為1時,產生USART中斷
Bit 7:發送緩沖區空中斷使能
0:禁止產生中斷
1:當USART_SR中的TXE為1時,產生USART中斷
Bit 6:發送完成中斷使能
0:禁止產生中斷
1:當USART_SR中的TC為1時,產生USART中斷
Bit 5:接收緩沖區非空中斷使能
0:禁止產生中斷
1:當USART_SR中的ORE或者RXNE為1時,產生USART中斷
Bit 4:IDLE中斷使能
0:禁止產生中斷
1:當USART_SR中的IDLE為1時,產生USART中斷
Bit 3:發送使能
0:禁止發送
1:使能發送
Bit 2:接收使能
0:禁止接收
1:使能接收,并開始搜尋RX引腳上的起始位
Bit 1:接收喚醒
0:接收器處于正常工作模式;
1:接收器處于靜默模式
Bit 0:發送斷開幀
0:沒有發送斷開字符
1:將要發送斷開字符
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:波特率整數部分
Bit 3~Bit 0:波特率小數部分
注:波特率的計算公式
6.2.3 數據寄存器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:數據值
包含了發送或接收的數據。由于它是由兩個寄存器組成的,一個給發送用TDR,一個給接收用RDR,該寄存器兼具讀和寫的功能。當USART_CR1中PCE位被置位進行發送時,寫到MSB的值(根據數據的長度不同,MSB是第7位或者第8位)會被后來的校驗位取代。當使能校驗位進行接收時,讀到的MSB位是接收到的校驗位。
6.2.4 狀態寄存器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標志(如果設置了CTSE位,當nCTS輸入變化狀態時,該位被硬件置高,由軟件將其清零)
0:nCTS狀態線上沒有變化
1:nCTS狀態線上發生變化
Bit 8:LIN斷開檢測標志(當探測到LIN斷開時,該位由硬件置1,由軟件將其清零)
0:沒有檢測到LIN斷開
1:檢測到LIN斷開
Bit 7:發送數據寄存器空
當TDR寄存器中的數據被硬件轉移到移位寄存器時,該位被硬件置位,對USART_DR的寫操作,將該位清零。
0:數據還沒有被轉移到移位寄存器
1:數據已經被轉移到移位寄存器
Bit 6:發送完成
當包含有數據的一幀發送完成后,并且TXE=1時,由硬件將該位置’1’。然后寫入USART_DR清除該位。
0:發送還未完成
1:發送完成
Bit 5:讀數據寄存器非空
當數據被轉移到USART_DR寄存器中,該位被硬件置位。對USART_DR讀操作可以將該位清零。
0:數據沒有收到;
1:收到數據,可以讀出
Bit 4:檢測到總線空閑
當檢測到總線空閑時,該位被硬件置位,則產生中斷。先讀USART_SR,然后讀USART_DR清除該位。
0:沒有檢測到空閑總線
1:檢測到空閑總線
Bit 3:過載錯誤
當RXNE仍然是1的時候,當前被接收在移位寄存器中的數據,需要傳送至RDR寄存器時,硬件將該位置位,先讀USART_SR,然后讀USART_CR清零。
0:沒有過載錯誤
1:檢測到過載錯誤
Bit 2:噪聲錯誤標志
在接收到的幀檢測到噪音時,由硬件對該位置位。先讀USART_SR,再讀USART_DR清0。
0:沒有檢測到噪聲
1:檢測到噪聲
Bit 1:幀錯誤
當檢測到同步錯位,過多的噪聲或者檢測到斷開符,該位被硬件置位。先讀USART_SR,再讀USART_DR清零
0:沒有檢測到幀錯誤
1:檢測到幀錯誤或者break符
Bit 0:校驗錯誤
在接收模式下,如果出現奇偶校驗錯誤,硬件對該位置位。依次讀USART_SR和USART_DR清零,在清除PE位前,軟件必須等待RXNE標志位被置1。
0:沒有奇偶校驗錯誤;
1:奇偶校驗錯誤
6.3 printf函數重映射
學習C語言的時候會經常用到一個函數,就是格式化輸出printf,這個函數的源代碼如下所示。
從上圖可以看出來,printf函數實際上的核心是putchar函數,在KEIL中,由于我們使用了MicroLIB,所以putchar函數改為了fputc函數,此時,我們只需要修改fputc函數就可以完成printf重定向,重定向代碼如下圖所示。
6.4 串口例程
使用printf函數將串口接收到的字符串發送出去。
(1)底層寄存器文件stm32f10x.h添加串口寄存器地址。
(2)在SYSTEM目錄下新建usart1目錄,并在usart1目錄下新建usart1.c和usart1.h兩個文件。
(3)將usart1.c和usart1.h兩個文件加入工程。
(4)在usart1.c文件內寫入以下代碼。
(5)在usart1.h添加以下代碼。
(5)在1.c文件中添加以下代碼。
6.5 實驗結果
-
51單片機
+關注
關注
273文章
5697瀏覽量
123186 -
波特率
+關注
關注
2文章
303瀏覽量
34064 -
串行通信協議
+關注
關注
0文章
21瀏覽量
7638
發布評論請先 登錄
相關推薦
評論