文章目錄
- 前言
- 4-2 USART與串口通信(2)
- 數據發送過程
- 雙緩沖與連續發送
- 數據發送過程中的問題
- 數據接收過程
- TXE標志位(發送數據寄存器空)
- TC標志位(發送完成標志位)
- 單個數據的發送
- 數據的連續發送
- 接收過程中遇到的問題
- 問題描述:
- RXNE標志位
- 接收單個數據
- 接收多個數據
- 錯誤標志位
- 錯誤標志位的使用方法
- 隨堂檢測
- 說出USART這5個字母所代表的含義
- 我們使用的這顆芯片有幾個USART接口
- 簡述波特率寄存器BRR的計算方法
- 簡述串并轉換電路的工作原理
- TXE,TC,RXNE和ORE這4個標志位所代表的含義
- 什么是噪聲錯
- 請寫出連續發送多個數據的偽代碼
- 請寫出連續發送多個數據的偽代碼
前言
-
本筆記內容,為本人依據B站UP主“鐵頭山羊”視頻內容(本人為其粉絲),歸納整理總結而來,如有侵權,聯系立即刪除,同時有想詳細了解的也可進行觀看bilibili鐵頭山羊 。
-
硬件:STM32F103C8T6
-
軟件:Keil
4-2 USART與串口通信(2)
數據發送過程
雙緩沖與連續發送
-
TDR(發送數據寄存器)
-
移位寄存器
數據發送過程中的問題
-
問題1:數據發送過快導致的覆蓋問題
-
問題2:數據什么時候發送完成的問題
數據接收過程
TXE標志位(發送數據寄存器空)
-
含義:Transmit Date Register Empty 發送數據寄存器空
-
狀態
-
TXE == 0:TDR寄存器為有數據
-
TXE == 1:TDR寄存器為無數據,空
-
-
示例代碼:
while(TXE == 0); // 等待發送數據寄存器空
TDR = XXX; // 將要發送的數據寫入到TDR
TC標志位(發送完成標志位)
-
**含義:**TC(Transmit Complete) 發送完成
-
**條件:**TDR空 && 移位寄存器空
-
示例代碼:
while(TXE == 0); // 等待發送數據寄存器空
TDR = XXX; // 將要發送的數據寫入到TDR
while(TC == 0); // 等待數據發送的完成
單個數據的發送
- 示例代碼
// 1. 等待TDR清空
while(TXE == 0);// 2. 寫入要發送的數據
TDR = 0X5A;// 3. 等待數據發送完成
while(TC == 0);
數據的連續發送
- 示例代碼:
for(i=0;i<n;i++)
{
// 1. 等待TDR清空
while(TXE == 0);
// 2. 寫入要發送的數據
TDR = 0X5A;
}// 3. 等待數據發送完成
while(TC == 0);
接收過程中遇到的問題
問題描述:
不知道什么時候去讀數據。
RXNE標志位
-
**含義:**RXNE(Receive date register Not Empty), 接收數據寄存器非空
-
狀態:
-
RXNE == 0:無數據
-
RXNE == 1:有數據
-
接收單個數據
- 示例代碼:
uint8_t a;
//1.等待RDR有數據需要讀取
while(RXNE == 0);//2.立即把數據讀取出來
a = RDR;
接收多個數據
- 示例代碼:
uint_8 a[10];for(i=0;i<n;i++){// 1. 等待RDR有數據需要讀取while(RXNE == 0);// 2. 立即把數據讀取出來a[i] = RDR;
}
錯誤標志位
標志位 | 全稱 | 含義 | 置位條件 |
---|---|---|---|
PE | Parity Error | 奇偶校驗錯 | 校驗失敗時置 1 |
FE | Frame Error | 幀格式錯誤 | 幀格式錯誤時置 1 |
NE | Noise Error | 噪聲錯誤 | 檢測到噪聲時置 1 |
ORE | Overrun Error | 過載錯誤 | 數據未及時讀取時置 1 |
錯誤標志位的使用方法
uint8_t a;// 1. 等待RDR有數據需要讀取
while(RXNE == 0);// 2. 先備份SR寄存器
uint32_t srcpy = SR;// 3. 把數據讀取出來
a = USARTx -> RDR;// 4. 處理錯誤
if((srcpy & PE) !=0){} // 校驗錯
if((srcpy & FE) !=0){} // 幀格式錯誤
if((srcpy & NE) != 0){} // 噪聲錯
if((srcpy & ORE) !=0){} // 過載錯
隨堂檢測
說出USART這5個字母所代表的含義
答:
1. Universal 通用;
2. Synchronous 同步;
3. Asynchronous 異步;
4. Receive 接收器;
5. Transmit 發送器。
我們使用的這顆芯片有幾個USART接口
答:
1. 3個;
2. USART1;
3. USART2;
4. USART3。
簡述波特率寄存器BRR的計算方法
答:
1. 波特率 = 72000000/16/分頻值.
2. 分頻值1. Mantissa整數部分:高12表示整數部分;2. 低4位表示小數部分.
簡述串并轉換電路的工作原理
答:
1. 并轉串:移位寄存器并行傳輸數據 -> 接收數據寄存器 -> 數據寄存器從右往左1位1位的輸出;
2. 串轉并:數據從左到右進入發送數據寄存器 -> 進入完成 -> 并行進入移位寄存器.
TXE,TC,RXNE和ORE這4個標志位所代表的含義
答:
1. TXE 發送數據寄存為空;
2. TC 發送完成;
3. RXNE 接收數據寄存器為空;
4. ORE 過載錯誤。
什么是噪聲錯
我們在電平采樣時,通過高頻率的采樣,確定是高低電平,如果我們3次采樣都是低電平,則電平位低電平,反之,為高電平但是(以輸出高電平為例),如果兩次采樣是高電平,第3次為低電平,就會產生錯誤,這種錯誤被認為是噪聲錯
請寫出連續發送多個數據的偽代碼
uint8_t a[10];for(i=0;i<n;i++){// 1. 檢查TXE標志位,直到TXE=1為止while(TXE == 0);// 2. 發送數據TDR = a[i];
}// 3. TC == 1
while(TC == 0);
請寫出連續發送多個數據的偽代碼
uint8_t a[10];for(i=0;i<n;i++){// 1. 檢查TXE標志位,直到TXE=1為止while(TXE == 0);// 2. 發送數據TDR = a[i];
}// 3. TC == 1
while(TC == 0);