USART 初始化結構體詳解
標准庫函數對每個外設都建立了一個初始化結構體,比如USART_InitTypeDef,結構體成員用於設置外設工作參數,並由外設初始化配置函數,比如USART_Init()調用,這些設定參數將會設置外設相應的寄存器,達到配置外設工作環境的目的。
初始化結構體和初始化庫函數配合使用是標准庫精髓所在,理解了初始化結構體每個成員意義基本上就可以對該外設運用自如了。初始化結構體定義在stm32f10x_usart.h 文件中,初始化庫函數定義在stm32f10x_usart.c 文件中,編程時我們可以結合這兩個文件內注釋使用。

USART_BaudRate:波特率設置。一般設置為2400、9600、19200、115200。標准庫函數會根據設定值計算得到USARTDIV 值,從而設置USART_BRR 寄存器值。
USART_WordLength:數據幀字長,可選8 位或9 位。它設定USART_CR1 寄存器的M 位的值。如果沒有使能奇偶校驗控制,一般使用8 數據位;如果使能了奇偶校驗則一般設置為9 數據位。
USART_StopBits:停止位設置,可選0.5 個、1 個、1.5 個和2 個停止位,它設定USART_CR2 寄存器的STOP[1:0]位的值,一般我們選擇1 個停止位。
USART_Parity : 奇偶校驗控制選擇, 可選USART_Parity_No( 無校驗) 、USART_Parity_Even( 偶校驗) 以及USART_Parity_Odd( 奇校驗) , 它設定USART_CR1 寄存器的PCE 位和PS 位的值。
USART_Mode:USART 模式選擇,有USART_Mode_Rx 和USART_Mode_Tx,允許使用邏輯或運算選擇兩個,它設定USART_CR1 寄存器的RE 位和TE 位。
USART_HardwareFlowControl:硬件流控制選擇,只有在硬件流控制模式才有效,可選有⑴使能RTS、⑵使能CTS、⑶同時使能RTS 和CTS、⑷不使能硬件流。
當使用同步模式時需要配置SCLK 引腳輸出脈沖的屬性,標准庫使用一個時鍾初始化結構體USART_ClockInitTypeDef 來設置,該結構體內容也只有在同步模式才需要設置。

USART_Clock:同步模式下SCLK 引腳上時鍾輸出使能控制,可選禁止時鍾輸出(USART_Clock_Disable)或開啟時鍾輸出(USART_Clock_Enable);如果使用同步模式發送,一般都需要開啟時鍾。它設定USART_CR2 寄存器的CLKEN 位的值。
USART_CPOL:同步模式下SCLK 引腳上輸出時鍾極性設置,可設置在空閑時SCLK 引腳為低電平(USART_CPOL_Low)或高電平(USART_CPOL_High)。它設定USART_CR2 寄存器的CPOL 位的值。
USART_CPHA:同步模式下SCLK 引腳上輸出時鍾相位設置,可設置在時鍾第一個變化沿捕獲數據(USART_CPHA_1Edge)或在時鍾第二個變化沿捕獲數據。它設定USART_CR2 寄存器的CPHA 位的值。USART_CPHA 與USART_CPOL 配合使用可以獲得多種模式時鍾關系。
USART_LastBit:選擇在發送最后一個數據位的時候時鍾脈沖是否在SCLK 引腳輸出, 可以是不輸出脈沖(USART_LastBit_Disable) 、輸出脈沖(USART_LastBit_Enable)。它設定USART_CR2 寄存器的LBCL 位的值。
USART1 接發通信實驗
USART 只需兩根信號線即可完成雙向通信,對硬件要求低,使得很多模塊都預留USART 接口來實現與其他模塊或者控制器進行數據傳輸,比如GSM模塊,WIFI 模塊、藍牙模塊等等。在硬件設計時,注意還需要一根“共地線”。
我們經常使用USART 來實現控制器與電腦之間的數據傳輸。這使得我們調試程序非常方便,比如我們可以把一些變量的值、函數的返回值、寄存器標志位等等通過USART發送到串口調試助手,這樣我們可以非常清楚程序的運行狀態,當我們正式發布程序時再把這些調試信息去除即可。
我們不僅僅可以將數據發送到串口調試助手,我們還可以在串口調試助手發送數據給控制器,控制器程序根據接收到的數據進行下一步工作。
首先,我們來編寫一個程序實現開發板與電腦通信,在開發板上電時通過USART 發送一串字符串給電腦,然后開發板進入中斷接收等待狀態,如果電腦有發送數據過來,開發板就會產生中斷,我們在中斷服務函數接收數據,並馬上把數據返回發送給電腦。
硬件設計
為利用USART 實現開發板與電腦通信,需要用到一個USB 轉USART 的IC,我們選擇CH340G 芯片來實現這個功能,CH340G 是一個USB 總線的轉接芯片,實現USB 轉USART、USB 轉lrDA紅外或者USB 轉打印機接口,我們使用其USB 轉USART 功能。具體電路設計見圖 21-9。
我們將CH340G 的TXD 引腳與USART1 的RX 引腳連接,CH340G 的RXD 引腳與USART1 的TX 引腳連接。CH340G 芯片集成在開發板上,其地線(GND)已與控制器的GND 連通。

圖 21-9 USB 轉串口硬件設計
軟件設計
這里只講解核心的部分代碼,有些變量的設置,頭文件的包含等並沒有涉及到,完整的代碼請參考本章配套的工程。我們創建了兩個文件:bsp_usart.c 和bsp _usart.h 文件用來存放USART 驅動程序及相關宏定義。
編程要點
使能RX 和TX 引腳GPIO時鍾和USART 時鍾;
初始化GPIO,並將GPIO 復用到USART 上;
配置USART 參數;
配置中斷控制器並使能USART 接收中斷;
使能USART;
在USART 接收中斷服務函數實現數據接收和發送。
代碼分析
GPIO 和USART 宏定義

使用宏定義方便程序移植和升級 。開發板中的CH340G 的收發引腳默認通過跳帽連接到USART1,如果想使用其他串口,可以把CH340G 跟USART1 直接的連接跳帽拔掉,然后再把其他串口的IO 用杜邦線接到CH340G的收發引腳即可。
這里我們使用USART1,設定波特率為115200,選定USART 的GPIO為PA9 和PA10。

在中斷章節已對嵌套向量中斷控制器的工作機制做了詳細的講解,這里我們就直接使用,配置USART 作為中斷源,因為本實驗沒有使用其他中斷,對優先級什么具體要求。

使用GPIO_InitTypeDef 和USART_InitTypeDef 結構體定義一個GPIO 初始化變量以及一個USART 初始化變量,這兩個結構體內容我們之前已經有詳細講解。
調用RCC_APB2PeriphClockCmd 函數開啟GPIO 端口時鍾,使用GPIO 之前必須開啟對應端口的時鍾。使用RCC_APB2PeriphClockCmd 函數開啟USART 時鍾。
使用GPIO 之前都需要初始化配置它,並且還要添加特殊設置,因為我們使用它作為外設的引腳,一般都有特殊功能。我們在初始化時需要把它的模式設置為復用功能。這里把串口的Tx 引腳配置為復用推挽輸出,Rx 引腳為浮空輸入,數據完全由外部輸入決定。
接下來,我們配置USART1 通信參數為:波特率115200,字長為8,1 個停止位,沒有校驗位,不使用硬件流控制,收發一體工作模式,然后調用USART 初始化函數完成配置。
程序用到USART 接收中斷,需要配置NVIC,這里調用NVIC_Configuration 函數完成配置。配置完NVIC 之后調用USART_ITConfig 函數使能USART 接收中斷。
最后調用USART_Cmd 函數使能USART,這個函數最終配置的是USART_CR1 的UE位,具體的作用是開啟USART 的工作時鍾,沒有時鍾那USART 這個外設自然就工作不了。

Usart_SendByte 函數用來在指定USART 發送一個ASCLL 碼值字符,它有兩個形參,第一個為USART,第二個為待發送的字符。它是通過調用庫函數USART_SendData 來實現的,並且增加了等待發送完成功能。通過使用USART_GetFlagStatus 函數來獲取USART事件標志來實現發送完成功能等待,它接收兩個參數,一個是USART,一個是事件標志。這里我們循環檢測發送數據寄存器為空這個標志,當跳出while 循環時說明發送數據寄存器為空這個事實。
Usart_SendString 函數用來發送一個字符串,它實際是調用Usart_SendByte 函數發送每個字符,直到遇到空字符才停止發送。最后使用循環檢測發送完成的事件標志TC 來實現保證數據發送完成后才退出函數。

這段代碼是存放在stm32f4xx_it.c 文件中的,該文件用來集中存放外設中斷服務函數。當我們使能了中斷並且中斷發生時就會執行這里的中斷服務函數。
我們在代碼清單 21-3 使能了USART 接收中斷,當USART 有接收到數據就會執行USART_IRQHandler 函數。USART_GetITStatus 函數與USART_GetFlagStatus 函數類似用來獲取標志位狀態,但USART_GetITStatus 函數是專門用來獲取中斷事件標志的,並返回該標志位狀態。使用if 語句來判斷是否是真的產生USART 數據接收這個中斷事件,如果是真的就使用USART 數據讀取函數USART_ReceiveData 讀取數據到指定存儲區。然后再調用USART 數據發送函數USART_SendData 把數據又發送給源設備,即PC 端的串口調試助手。

首先我們需要調用USART_Config 函數完成USART 初始化配置,包括GPIO 配置,USART 配置,接收中斷使能等等信息。
接下來就可以調用字符發送函數把數據發送給串口調試助手了。最后主函數什么都不做,只是靜靜地等待USART 接收中斷的產生,並在中斷服務函數把數據回傳。
下載驗證
保證開發板相關硬件連接正確,用USB 線連接開發板的USB 轉串口跟電腦,在電腦端打開串口調試助手並配置好相關參數:115200 8-N-1,把編譯好的程序下載到開發板,此時串口調試助手即可收到開發板發過來的數據。我們在串口調試助手發送區域輸入任意字符,點擊發送按鈕,馬上在串口調試助手接收區即可看到相同的字符。

(stm32 USART串口應用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051
PWM脈寬調制技術
http://www.makeru.com.cn/live/4034_2146.html?s=45051
基於STM32講解串口操作
http://www.makeru.com.cn/live/1758_490.html?s=45051
通過Z-stack協議棧實現串口透傳
http://www.makeru.com.cn/live/1758_330.html?s=45051
(stm32直流電機驅動)
http://www.makeru.com.cn/live/1392_1218.html?s=45051