STM32 串口通訊基礎知識

一、串口通訊簡介

通訊接口的兩種方式:數組

並行通訊
-傳輸原理:數據各個位同時傳輸。
-優勢:速度快
-缺點:佔用引腳資源多異步

串行通訊
-傳輸原理:數據按位順序傳輸。
-優勢:佔用引腳資源少
-缺點:速度相對較慢函數

目前使用最多的仍是串行通訊,即使速度相對較慢,因此下面都是講解串行通訊。ui

①串口通訊分類:3d

串口通訊按照數據傳送方向,分爲:
在這裏插入圖片描述code

(1)單工:數據傳輸只支持數據在一個方向上傳輸
(2)半雙工:容許數據在兩個方向上傳輸,可是,在某一時刻,只容許數據在一個方向上傳輸,它其實是一種切換方向的單工通訊
(3)全雙工:容許數據同時在兩個方向上傳輸,所以,全雙工通訊是兩個單工通訊方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力blog

②STM32的串行通訊的方式接口

同步通訊:帶時鐘同步信號傳輸。
異步通訊:不帶時鐘同步信號。
在這裏插入圖片描述事件

注意:通常所說的串口是USART(通用同步異步收發器),同步異步都支持的。STM32F10x系列芯片,包含3個USART和2個UART圖片

二、STM32的串口通訊原理

串口通訊是單片機最基本的功能,不少傳感器模塊與單片機的鏈接都會用到串口功能。串口通訊,顧名思義就是將一整條的內容,切成一「串」個體來發送或接收。發送的核心思想是:將字符串中的一個字符寫到一個寄存器中(此寄存器只能存一個字符),寫入後會自動經過串口發送,發送結束再寫入下一個字符。接收時會直接裝入單片機緩衝區的一個字符型數組中,由程序依次讀這個數組。
在這裏插入圖片描述

上圖是串口數據發送接收的過程作一個簡單的圖示。收發控制器根據寄存器配置,對數據存儲轉移部分的移位寄存器進行控制。當須要發送數據時,內核或DMA外設把數據從內存(變量)寫入到發送數據寄存器TDR後,發送控制器將自動把數據從TDR加載到發送移位寄存器,而後經過串口線TX,把數據一位一位地發送出去,在數據從TDR轉移到移位寄存器時,會產生髮送寄存器TDR已空事件TXE,當數據從移位寄存器所有發送出去時,會產生數據發送完成事件TC,這些事件能夠在狀態寄存器中查詢到。而接收數據則是一個逆過程,數據從串口線RX一位一位地輸入到接收移位寄存器,而後自動地轉移到接收數據寄存器RDR,最後用內核指令或DMA讀取到內存(變量)中。發送完畢或者接收完畢都會有相應的狀態或者事件,咱們寫代碼時就能夠經過這些事件來判斷是否接收或者發送完畢,而後作出下一步。

三、經常使用的串口相關寄存器

①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);

在這裏插入圖片描述

四、串口配置的通常步驟

  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積分資料!!

相關文章
相關標籤/搜索