學習理解STM32的串口通信,中斷以及I2C的使用。
應用:使用中斷和串口通通信獲取按鍵值發送出來並顯示到數碼管上。使用I2C 將獲取到的按鍵值保存到內存中。
串口通信
計算機的CPU與外部設備之間的信息交換,以及計算機與計算機之間的信息交換過程稱爲通信。
- 並行通信
數據字節的各位同時傳送的通信方式。並行通信的優點是數據傳送速度快,缺點是佔用的傳輸線條數多,適用於近距離通信。 - 串行通信(Serial Communication):
數據字節的各位一位(bit)一位地依次傳送的通信方式。串行通信的速度慢,但佔用的傳輸線條數少,適用於遠距離的數據傳送。
這裏我們講串口通信
- 串口通訊協議分爲物理層和協議層。
物理層規定通訊系統中具有機械、電子功能部分的特性,確保原始數據在物理媒體的傳輸。
協議層主要規定通訊邏輯,統一收發雙方的數據打包、解包標準。
- STM32有3-5個的全雙工的異步串行通信USART( 通用同步異步收發器USART)接口
USART的功能是通過操作相應寄存器實現的,數據寄存器,控制寄存器,控制寄存器等等。
有兩個引腳TX:發送數據輸出引腳。
RX:接收數據輸入引腳。
常用庫函數
//查詢模式(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實現
- 查看原理圖可知 A9 爲數據發送引腳 A10爲數據接收引腳 對應的UART1
- 使用CubeMx配置
引腳配置
PA9 配置 GPIO mode:Alternate Function push pull
PA10配置 GPIO mode:input mode
初始化UART1
配置模式:異步
配置參數:
波特率,115200bps
字長,8
奇偶校驗,無
停止位,1
中斷設置
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文件
打開串口工具 (下面所使用到的安裝包我都放到了個人網盤上,下載鏈接
打開串口後 從板子執行發送的字符串就會顯示到上面,下面可以進行手動發送
(板子不在身邊… 沒法發測試圖了… )
綜合應用
綜合應用放到另一篇文章上
使用串口通信將按鍵值發送出來 ,並使用I2C將按鍵值保存
更多STM32學習教程
- STM32 cubemx keil5搭建學習環境
- 使用STM32 cubemx keil5實現led燈與數碼管控制
- 基於STM32 CubeMx keil5實現鍵盤的應用
- 基於STM32 CubeMx keil5實現串口通信 I2C與GPIO綜合應用
- 基於STM32 CubeMx keil5實現AD轉換獲取溫度
- 基於STM32 CubeMx keil5 學習使用I2C
- 基於STM32 CubeMx keil5 學習使用串口通信
- 基於STM32 CubeMx keil5應用定時器
- 基於STM32 cubemx keil5學習使用中斷
- 基於STM32 cubemx keil5綜合應用實現溫度控制系統