STM32 串口通信基礎知識


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、串口配置的一般步驟

  1. 串口時鍾使能,GPIO時鍾使能:RCC_APB2PeriphClockCmd();

  2. GPIO端口模式設置:GPIO_Init(); 模式設置為GPIO_Mode_AF_PP

  3. 串口參數初始化:USART_Init();

  4. 開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟)
    NVIC_Init();
    USART_ITConfig();

  5. 使能串口:USART_Cmd();

  6. 編寫中斷處理函數:USARTx_IRQHandler();

  7. 串口數據收發:
    void USART_SendData();//發送數據到串口,DR
    uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據

  8. 串口傳輸狀態獲取:
    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
    void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);

歡迎關注我的公眾號:物聯網技術猿
我可以幫你免費下載csdn積分資料!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM