STM32 串口通信介紹及cubemx配置

學習理解STM32的串口通信,中斷以及I2C的使用。
應用:使用中斷和串口通通信獲取按鍵值發送出來並顯示到數碼管上。使用I2C 將獲取到的按鍵值保存到內存中。

串口通信

計算機的CPU與外部設備之間的信息交換,以及計算機與計算機之間的信息交換過程稱爲通信。

  1. 並行通信
    數據字節的各位同時傳送的通信方式。並行通信的優點是數據傳送速度快,缺點是佔用的傳輸線條數多,適用於近距離通信。
  2. 串行通信(Serial Communication):
    數據字節的各位一位(bit)一位地依次傳送的通信方式。串行通信的速度慢,但佔用的傳輸線條數少,適用於遠距離的數據傳送。

這裏我們講串口通信

  1. 串口通訊協議分爲物理層和協議層。
    物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始數據在物理媒體的傳輸。
    enter description here
    協議層主要規定通訊邏輯,統一收發雙方的數據打包、解包標準。
    enter description here
  2. STM32有3-5個的全雙工的異步串行通信USART( 通用同步異步收發器USART)接口
    USART的功能是通過操作相應寄存器實現的,數據寄存器,控制寄存器,控制寄存器等等。
    有兩個引腳TX:發送數據輸出引腳。
    RX:接收數據輸入引腳。
    enter description here =600*500

常用庫函數

//查詢模式(blocking mode阻塞模式)調用這個函數並在等待時間內一直等待操作完成。
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
//中斷模式(non- blocking mode)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//DMA模式
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//中斷服務函數
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart);
//中斷回調函數
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart);

串口接收包括查詢模式和中斷模式

若單片機作爲主機(主動發起通信任務)與其他從機雙向通信:
根據任務,查詢方式發送、查詢方式接收或中斷方式接收。
若單片機作爲從機與其他主機機雙向通信:
中斷方式接收,查詢方式發送(在接收中斷程序中發送)。

STM32 CubeMx實現

  1. 查看原理圖可知 A9 爲數據發送引腳 A10爲數據接收引腳 對應的UART1
    enter description here
  2. 使用CubeMx配置
    引腳配置
    PA9 配置 GPIO mode:Alternate Function push pull
    PA10配置 GPIO mode:input mode
    enter description here
    初始化UART1
    配置模式:異步
    配置參數:
    波特率,115200bps
    字長,8
    奇偶校驗,無
    停止位,1
    enter description here
    中斷設置
    USART global interrupt:使能
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WTGEidB1-1581689856542)(https://gitee.com/nie_hen/test/raw/master/小書匠/1567758987267.png)]
    在System core 中NVIC下
    設置中斷優先級 主優先級1 次優先級0 (可不設)
    生成工程
    填寫工程 名字 位置 ,使用IDE ,然後生成工程。

編寫代碼

查詢發送 代碼

在main.c 中主函數裏 添加 發送代碼

HAL_UART_Transmit(&huart1,connctt,15,500);

上面的receive_str 要在前面聲明
uint8_t connctt[15]=“hello world”;
上面 發送函數裏面參數,第一個爲使用中斷地址,第二個要發送的數組首地址,第三個發送字符串長度,第四個timeout (超過那個時間沒法送成功,就會報錯)
如果需要連續發送的到 while循環中,進行發送,加上延時,不然會一直連續發送。
查詢接收代碼

HAL_UART_Receive(&huart1,receive,15,500);

和查詢發送一樣 需要對receive進行聲明,uint8_t receive[15];
參數也都一樣
中斷接收代碼
/定義變量

uint8_t aRxBuffer;

//開啓中斷接收

HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1);

中斷回調函數

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
HAL_UART_Transmit(&huart1,(uint8_t ))&aRxBuffer,1,0xffff);  //爲驗證進入這個函數,把接收到的數據通過串口發送出去
HAL_UART_Receive_IT(&huart1,(uint8_t ))&aRxBuffer,1);   //重新打開串口中斷
}

注意中斷接收每次接收必須要定長 如果接受到的數據是4個,而函數參數接受5個,那麼中斷接受不到結束的信號會一直等直到timeout。(查詢方式的不需要)

編譯
選擇要使用的發送方式 和接收方式 寫入代碼 。
編譯 傳入hex文件
打開串口工具 (下面所使用到的安裝包我都放到了個人網盤上,下載鏈接
打開串口後 從板子執行發送的字符串就會顯示到上面,下面可以進行手動發送
enter description here
(板子不在身邊… 沒法發測試圖了… )
綜合應用
綜合應用放到另一篇文章上
使用串口通信將按鍵值發送出來 ,並使用I2C將按鍵值保存

更多STM32學習教程

  1. STM32 cubemx keil5搭建學習環境
  2. 使用STM32 cubemx keil5實現led燈與數碼管控制
  3. 基於STM32 CubeMx keil5實現鍵盤的應用
  4. 基於STM32 CubeMx keil5實現串口通信 I2C與GPIO綜合應用
  5. 基於STM32 CubeMx keil5實現AD轉換獲取溫度
  6. 基於STM32 CubeMx keil5 學習使用I2C
  7. 基於STM32 CubeMx keil5 學習使用串口通信
  8. 基於STM32 CubeMx keil5應用定時器
  9. 基於STM32 cubemx keil5學習使用中斷
  10. 基於STM32 cubemx keil5綜合應用實現溫度控制系統
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章