USART的概述 2.1.1 什么是USART?USART的作用? USART:通用同步異步收發器。 USART的作用:能夠靈活地與外部設備進行全雙工數據交換 2.1.2 USART的特征 <1> 全雙工異步通信 <2> 可配置為 16 倍過采樣或 8 倍過采樣 <3> 小數波特率發生器系統 <4> 數據字長度可編程( 8 位或 9 位) <5> 停止位可配置 - 支持 1 或 2 個停止位 <6> 發送器和接收器具有單獨使能位 <7>傳輸檢測標志: — 接收緩沖區已滿 — 發送緩沖區為空 — 傳輸結束標志 <8>十個具有標志位的中斷源: — CTS 變化 — LIN 停止符號檢測 — 發送數據寄存器為空 — 發送完成 — 接收數據寄存器已滿 — 接收到線路空閑 — 溢出錯誤 — 幀錯誤 — 噪聲錯誤 — 奇偶校驗錯誤 任何USART雙向通信均需要至少兩個引腳: 接收數據輸入引腳 (RX) 發送數據引腳輸出 (TX) 正常 USART 模式下 發送或接收前保持空閑線路 起始位 數據(字長 8 位或 9 位),最低有效位在前 用于指示幀傳輸已完成的 0.5 個、 1 個、 1.5 個、 2 個停止位 TX引腳在起始位工作期間處于低電平狀態。在停止位工作期間處于高電平狀態。 2.2 USART的框架 2.2.1發送數據過程
放大后的各個部分: GPIO部分: 
映射部分: 
USART部分: 
2.2.2接收數據過程
放大后的各個部分: GPIO部分: 
映射部分: 
USART部分: 
2.2.3 發送與接收過程解讀 GPIO要配為復用功能 復用與通用的區別:這里的外設就是USART 
發送過程: - 內核把數據交給USART的發送數據寄存器(TDR)
- TDR通過并行總線,一次性寫入到發送移位寄存器中
- 發送移位寄存器移位一位一位的傳輸數據,直到數據發送完畢。
- 當發送移位寄存器沒有數據時,TDR才把數據一次寫入。
接收過程: - 接收移位寄存器從外部獲取每一位數據
- 當移位數據寄存器擠滿8位或9位數據時,通過并行總線,一次發送到接收數據寄存器(RDR)
- 只能等移位寄存器湊夠8位或9位數據時,才會把數據發送到RDR,內核此時才能讀取到正確的數據。
注意: 發送數據寄存器(TDR)與接收數據寄存器(RDR)是兩個寄存器,寫代碼時只有DR,DR代表發送數據寄存器還是接收數據寄存器,取決于所在函數是接收還是發送。 2.2.4 USART映射解讀 查看原理圖,可知USART1的發送TX與接收RX對應引腳分別為PA9\PA10。 
這也是M3默認的映射引腳。 
與PA9與PA10可知我們選擇的復用寄存器是GPIOx_AFRH 

由圖可知, - 配置PA9和PA10為復用功能
- 找引腳對應的復用功能寄存器,PA9\PA10對應AFRH寄存器
- 在AFRH中找引腳對應控制位,PA9?AFRH9[3:0]、PA10?AFRH10[3:0]
- 通過映射圖可知,USART1對應的值為AF7
- 把AF7寫入PA9\PA10對應控制位的位置
2.3 USART波特率的配置 2.3.1 配置波特率公式 fCK看USART掛載的外設總線,可知84MHz 
OVER8根據控制寄存器1的位15可知,默認采用16倍過采樣,OVER8=0 
USARTDIV根據下面公式,算得: 


2.3.2 實際配置波特率過程 《1》確定需要配置的波特率、采用默認過采用模式 《2》根據公式1,可求出USARTDIV 《3》USARTDIV是寫入到波特率寄存器 (USART_BRR)的浮點數,由于寄存器不能直接寫入浮點數,所以需要把整數和小數分開寫入到USART_BRR中。 《4》查看寄存器USART_BRR可知,12位控制整數,4位控制小數。 《5》USARTDIV的一個浮點數,進行強制轉換為整型,即可獲得它的整數部分DIV_Mantissa,最后通過USATRDIV公式,可算出小數部分DIV_Fraction。 《6》在寫入整數部分時,整數位要左移4位,因為從位4開始寫入整數部分,小數部分直接寫入。 2.4 軟件設計 2.4.1 USART配置流程 《1》開GPIOA\USART1時鐘 《2》配置GPIOA為復用推挽輸出 《3》映射PA9與PA10到USART_TX\USART_RX 《4》配置波特率 《5》配置USART模塊 2.4.2 USART模塊配置 

- 使能發送器、接受器
- 使能USATR
- 其他位使用默認值。如:16倍過采樣、8位字長、1位停止位等
2.4.3 USAR1初始化函數 2.5 補充 2.5.1 問答 <1>串口是什么?有什么用? 串口是一種串行全雙通信接口,同步或異步收發數據,但一般我們只使用異步功能。 常用于與外部設備通信、交互信息。外部若有串口通信接口,就可以與單片機進行通信,如ESP8266模塊、RS485模塊等。
<2>同步與異步的理解? 同步與異步基于兩個設備討論: 同步:它們有共同的時鐘線,由時鐘線控制收發 異步:它們沒有公共的時鐘線,需要雙方配置一樣的波特率,保證收發的準確。
<3>串行與并行? 串行: 只有一根線或兩個根數據線,一次只能收發一位數據。兩根線的設計是為了兩個設備能同時收發一位數據。 并行: 有多根數據線,一般是8的倍數,假設是8根數據線,一次可傳送一個字節(8位)的數據。
<4>單工、半雙工、全雙工? 單共: 一方只能接收,另一方只能發送,從始至終發送方向不變,單方向固定。例如:廣播與收音機。廣播只能發出信號,收音機只能接收信號,兩者互換不能正常工作。 半雙工: 某一時間段,一方發送。另一方接收;另一個時間段,一方接收,另一方發送。雙方都可以發送和接收,但不能同時發送或接收。例如:對講機。 全雙工: 雙方可以都可以同時收發。例如:電話
<5>波特率是什么?為什么要配置波特率? 一秒鐘能傳輸的二級進制位數。假設9600代表1秒鐘可以一次傳輸9600位。即9.6Kbit。 異步通信雙方需要有個約定,發送方以多少速度(波特率)發送數據過去(例如9600),接收方就必須以對應的速度(速度)接收,從而保證讀取到正確的數據。
<6>如何保證數據準確發送過去呢? USART串口通信自帶有通信協議,一幀數據位10位或11位,常常使用10位作為一幀數據。 一幀數據的構成: - 1個啟動位(低電平)
- 數據幀(8位或9位,如果開啟奇偶校驗,最高位是奇偶檢驗位,位7或位8,但是一般不開啟)
- 停止位(高電平,0.5位、1位、1.5位、2位,一般選1位停止位)
- 綜上,一般串口一幀數據為10位(1個啟動位、8個數據位、1個停止位)

<7>知識領悟 模塊學習心得: - 掌握基本概念
- 理解并記住模塊的特性
- 模塊框圖的工作流程,信號走向,邏輯(重點)
- 看懂模塊的時序圖,理解其他相關知識
- 會配置寄存器(即使上面的不是很理解,但是盡量理解)
|