在 STM32 微控制器中,UART(通用異步收發傳輸器)通信通過多個寄存器實現配置和數據傳輸。下面詳細解析 UART 的核心寄存器及其功能。
1. 狀態寄存器(USART_SR)
狀態寄存器反映 UART 當前的工作狀態,用于判斷數據傳輸是否完成、是否接收到數據等。
主要位功能
位 | 名稱 | 功能 |
---|---|---|
7 | TXE | 發送緩沖區為空(1 = 空,可寫入新數據)。寫入 DR 寄存器后自動清零。 |
6 | TC | 發送完成(1 = 傳輸結束)。需軟件清零(寫 1 清除)。 |
5 | RXNE | 接收緩沖區非空(1 = 接收到數據)。讀取 DR 寄存器后自動清零。 |
3 | IDLE | 檢測到總線空閑(1 = 空閑)。需先讀 SR,再讀 DR 清零。 |
2 | ORE | 溢出錯誤(1 = 數據丟失)。需讀 SR,再讀 DR 清零。 |
0 | PE | 奇偶校驗錯誤(1 = 校驗失敗)。需軟件清零。 |
應用場景
- 發送數據:檢查
TXE
或TC
標志,確保緩沖區為空或傳輸完成。 - 接收數據:檢查
RXNE
標志,確認有新數據可讀。 - 錯誤處理:檢查
ORE
、PE
等標志,處理通信異常。
2. 數據寄存器(USART_DR)
數據寄存器用于存儲發送和接收的數據,實際由兩個獨立的寄存器組成:
- 發送緩沖區寄存器(TDR):寫入
DR
時,數據被存入 TDR,隨后傳輸到移位寄存器。 - 接收緩沖區寄存器(RDR):接收到的數據先存入移位寄存器,再轉移到 RDR,讀取
DR
時獲取 RDR 內容。
注意事項
- 數據位寬由
CR1
的M
位決定(8 位或 9 位)。 - 寫入
DR
會清除TXE
標志,讀取DR
會清除RXNE
標志。
3. 波特率寄存器(USART_BRR)
波特率寄存器用于配置 UART 的通信速率,計算公式如下:
波特率 = fPCLK / (16 * USARTDIV)
其中:
fPCLK
:UART 時鐘頻率(APB 總線時鐘)。USARTDIV
:分頻系數,由BRR
寄存器的整數部分([15:4])和小數部分([3:0])組成。
示例
假設fPCLK = 84MHz
,波特率為 115200:
USARTDIV = 84000000 / (16 * 115200) ≈ 45.5729
整數部分 = 45 (0x2D)
小數部分 = 0.5729 * 16 ≈ 9 (0x9)
BRR = 0x2D9
4. 控制寄存器 1(USART_CR1)
控制寄存器 1 用于配置 UART 的基本功能,如使能、字長、奇偶校驗等。
主要位功能
位 | 名稱 | 功能 |
---|---|---|
13 | UE | UART 使能(1 = 使能)。 |
12 | M | 字長(0=8 位 + 校驗,1=9 位 + 校驗)。 |
10 | PCE | 奇偶校驗使能(1 = 使能)。 |
9 | PS | 奇偶校驗類型(0 = 偶校驗,1 = 奇校驗)。 |
7 | TXEIE | 發送緩沖區空中斷使能(1 = 使能)。 |
6 | TCIE | 發送完成中斷使能(1 = 使能)。 |
5 | RXNEIE | 接收緩沖區非空中斷使能(1 = 使能)。 |
4 | IDLEIE | 空閑線路檢測中斷使能(1 = 使能)。 |
3 | TE | 發送使能(1 = 使能)。 |
2 | RE | 接收使能(1 = 使能)。 |
0 | OVER8 | 過采樣模式(0=16 倍,1=8 倍)。 |
5. 控制寄存器 2(USART_CR2)
控制寄存器 2 主要用于配置停止位、LIN 模式等。
主要位功能
位 | 名稱 | 功能 |
---|---|---|
13:12 | STOP | 停止位設置: 00=1 位,01=0.5 位,10=2 位,11=1.5 位。 |
6 | LINEN | LIN 模式使能(1 = 使能)。 |
0 | CLKEN | SCLK 引腳使能(用于同步模式)。 |
6. 控制寄存器 3(USART_CR3)
控制寄存器 3 用于配置高級功能,如硬件流控制、DMA 等。
主要位功能
位 | 名稱 | 功能 |
---|---|---|
14 | ONEBIT | 采樣方法(0=3 采樣位,1=1 采樣位)。 |
11 | CTSE | CTS 硬件流控制使能(1 = 使能)。 |
10 | RTSE | RTS 硬件流控制使能(1 = 使能)。 |
7 | DMAT | 發送 DMA 使能(1 = 使能)。 |
6 | DMAR | 接收 DMA 使能(1 = 使能)。 |
7. 中斷和狀態寄存器(USART_ISR)
在 STM32F4 及更高系列中,ISR
替代了SR
寄存器,功能類似但增加了更多狀態位,如忙標志(BUSY
)。
寄存器操作示例
1. 初始化 UART(115200 波特率,8N1)
// 假設fPCLK=84MHz
USART1->BRR = 0x2D9; // 設置波特率為115200
USART1->CR1 = USART_CR1_TE | // 使能發送USART_CR1_RE | // 使能接收USART_CR1_UE; // 使能UART
USART1->CR2 = 0; // 1個停止位
USART1->CR3 = 0; // 禁用硬件流控制
2. 發送單個字符
while (!(USART1->SR & USART_SR_TXE)); // 等待發送緩沖區為空
USART1->DR = 'A'; // 發送字符'A'
3. 接收單個字符
while (!(USART1->SR & USART_SR_RXNE)); // 等待接收緩沖區非空
char c = USART1->DR; // 讀取接收到的字符
4. 啟用接收中斷
USART1->CR1 |= USART_CR1_RXNEIE; // 使能接收緩沖區非空中斷
NVIC_EnableIRQ(USART1_IRQn); // 使能USART1中斷
總結
UART 寄存器的核心操作包括:
- 初始化:配置波特率(
BRR
)、字長(CR1.M
)、停止位(CR2.STOP
)、校驗位(CR1.PCE
)。 - 發送控制:通過
SR.TXE
或SR.TC
判斷發送狀態,寫入DR
發送數據。 - 接收控制:通過
SR.RXNE
判斷接收狀態,讀取DR
獲取數據。 - 中斷配置:通過
CR1
使能各類中斷(如RXNEIE
、TXEIE
),并配置 NVIC。