1、串口通信簡介
通信接口的兩種方式:
並行通信
-傳輸原理:數據各個位同時傳輸。
-優點:速度快
-缺點:占用引腳資源多
串行通信
-傳輸原理:數據按位順序傳輸。
-優點:占用引腳資源少
-缺點:速度相對較慢
目前使用最多的還是串行通信,即便速度相對較慢,所以下面都是講解串行通信。
①串口通信分類:
串口通信按照數據傳送方向,分為:

(1)單工:數據傳輸只支持數據在一個方向上傳輸
(2)半雙工:允許數據在兩個方向上傳輸,但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通信
(3)全雙工:允許數據同時在兩個方向上傳輸,因此,全雙工通信是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力
②STM32的串行通信的方式
同步通信:帶時鍾同步信號傳輸。
異步通信:不帶時鍾同步信號。

注意:一般所說的串口是USART(通用同步異步收發器),同步異步都支持的。STM32F10x系列芯片,包含3個USART和2個UART
2、STM32的串口通信原理
串口通信是單片機最基本的功能,很多傳感器模塊與單片機的連接都會用到串口功能。串口通信,顧名思義就是將一整條的內容,切成一“串”個體來發送或接收。發送的核心思想是:將字符串中的一個字符寫到一個寄存器中(此寄存器只能存一個字符),寫入后會自動通過串口發送,發送結束再寫入下一個字符。接收時會直接裝入單片機緩沖區的一個字符型數組中,由程序依次讀這個數組。

上圖是串口數據發送接收的過程做一個簡單的圖示。收發控制器根據寄存器配置,對數據存儲轉移部分的移位寄存器進行控制。當需要發送數據時,內核或DMA外設把數據從內存(變量)寫入到發送數據寄存器TDR后,發送控制器將自動把數據從TDR加載到發送移位寄存器,然后通過串口線TX,把數據一位一位地發送出去,在數據從TDR轉移到移位寄存器時,會產生發送寄存器TDR已空事件TXE,當數據從移位寄存器全部發送出去時,會產生數據發送完成事件TC,這些事件可以在狀態寄存器中查詢到。而接收數據則是一個逆過程,數據從串口線RX一位一位地輸入到接收移位寄存器,然后自動地轉移到接收數據寄存器RDR,最后用內核指令或DMA讀取到內存(變量)中。發送完畢或者接收完畢都會有相應的狀態或者事件,我們寫代碼時就可以通過這些事件來判斷是否接收或者發送完畢,然后做出下一步。
3、常用的串口相關寄存器
①USART_SR狀態寄存器
這個寄存器用到了10個位,也就代表有10中狀態標志,每個標志都可以作為中斷的標志位,庫函數的定義如下:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)


②USART_DR數據寄存器
發送數據寄存器是TDR,接收數據寄存器是RDR,都只用了前8位,發送和接收用到以下兩個函數:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

4、串口配置的一般步驟
-
串口時鍾使能,GPIO時鍾使能:RCC_APB2PeriphClockCmd();
-
GPIO端口模式設置:GPIO_Init(); 模式設置為GPIO_Mode_AF_PP
-
串口參數初始化:USART_Init();
-
開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟)
NVIC_Init();
USART_ITConfig(); -
使能串口:USART_Cmd();
-
編寫中斷處理函數:USARTx_IRQHandler();
-
串口數據收發:
void USART_SendData();//發送數據到串口,DR
uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據 -
串口傳輸狀態獲取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
歡迎關注我的公眾號:物聯網技術猿
我可以幫你免費下載csdn積分資料!!
