STM32CubeMX HAL庫 串口的使用

1.配置

2.開啟中斷后,生成代碼?

3.串口的接收

1).開啟空閑中斷接收

__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE); // 關鍵步驟:啟用空閑中斷

2).?啟動接收

調用?HAL_UARTEx_ReceiveToIdle_IT?啟動異步接收,可以使用連個數組交替接收

#define RX_BUFFER_SIZE 256
uint8_t rx_buffer[RX_BUFFER_SIZE];// 在 main() 或某個初始化函數中啟動接收
HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);

3).實現接收回調

當以下事件發生時,會觸發?HAL_UARTEx_RxEventCallback?回調函數:

  • 接收到指定長度(RX_BUFFER_SIZE)的數據;
  • 檢測到空閑(IDLE)狀態。

在回調函數中處理接收到的數據

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart == &huart1) {// Size 是實際接收到的數據長度(可能小于 RX_BUFFER_SIZE)if (Size > 0) {// 處理數據(例如解析、轉發等)process_received_data(rx_buffer, Size);}// 重新啟動接收,以持續監聽數據HAL_UARTEx_ReceiveToIdle_IT(&huart1, rx_buffer, RX_BUFFER_SIZE);}
}

接收注意事項? ?

  1. 緩沖區大小?:設置的 RX_BUFFER_SIZE 應足夠大以容納最大預期數據包,否則可能溢出。
  2. 及時重啟接收?:在回調函數中務必重新調用 HAL_UARTEx_ReceiveToIdle_IT,否則后續數據無法接收。 ?
  3. 數據競爭?:避免在數據處理過程中修改 rx_buffer,可以使用雙緩沖區(Ping-Pong Buffer)策略。 ?
  4. 錯誤處理?:檢查 HAL_UARTEx_ReceiveToIdle_IT 的返回值,確保啟動成功(返回 HAL_OK)。

4.串口的數據的發送?

以下是 STM32 HAL 庫中 ?UART 數據發送?的常用方式及使用方法總結:

一、UART 數據發送的三種模式?

根據 HAL 庫設計,可通過以下三種方式實現 UART 數據發送:

輪詢模式(阻塞式)?

調用 HAL_UART_Transmit 函數,CPU 持續等待數據發送完成后再執行后續代碼。
適用場景?:簡單調試、低頻率小數據量傳輸。

// 示例代碼:發送字符串 "Hello"
uint8_t data[] = "Hello";
HAL_UART_Transmit(&huart2, data, sizeof(data), 100); ?// 超時時間 100ms

中斷模式(非阻塞)?

調用 HAL_UART_Transmit_IT 函數啟動發送,數據通過中斷異步傳輸,CPU 可并行處理其他任務。
適用場景?:需提高 CPU 利用率的中等數據量傳輸。

// 步驟:
// 1. 啟動發送
HAL_UART_Transmit_IT(&huart2, data, len);// 2. 實現發送完成回調函數
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {if (huart == &huart2) {// 發送完成后的處理(如啟動下一次發送)}
}

DMA 模式(非阻塞)?

調用 HAL_UART_Transmit_DMA 函數,DMA 控制器直接搬運數據至 UART 外設,完全釋放 CPU。
適用場景?:高速、大數據量傳輸(如音頻流、圖像數據)。

// CubeMX 配置:
// 1. 開啟 UART DMA 發送通道
// 2. 啟動發送
HAL_UART_Transmit_DMA(&huart2, data, len);

二、發送模式選擇建議?

模式?? ?優點? ? ? ? ? ? ? ? ? ? ? ? ? ? 缺點? ? ? ? ? ? ? ? ? ? ? ? ? 典型應用場景


輪詢?? ?實現簡單? ? ? ? ? ? ? ? ? ? ?阻塞 CPU? ? ? ? ? ? ? ? ?調試輸出、簡單指令
中斷?? ?非阻塞、? ? ? ? ? ? ? ? ? ? ?中等效率? ? ? ? ? ? ? ? ? 頻繁中斷可能影響系統實時性?? ?中速數據包傳輸
DMA?? ?零 CPU 占用、高效?? ?需配置 DMA 通道?? ?高速大數據傳輸

三、關鍵配置步驟?

1.CubeMX 基礎配置?

啟用 UART 外設并配置波特率、數據位等參數。
中斷模式?:使能 UART 全局中斷(NVIC 設置優先級)。
DMA 模式?:添加 DMA 通道(方向為 Memory-to-Peripheral)。

2.代碼實現要點?

中斷模式?需實現 HAL_UART_TxCpltCallback 回調函數處理發送完成事件。
DMA 模式?需確保發送緩沖區在 DMA 傳輸期間保持有效(避免使用棧內存)。

四、注意事項?

  1. 錯誤處理?:檢查函數返回值(如 HAL_OK),并在 HAL_UART_ErrorCallback 中處理超時或硬件錯誤。
  2. 緩沖區管理?:避免在發送過程中修改發送緩沖區數據(尤其在使用 DMA 時)。可使用雙緩沖區交替發送以提高效率。
  3. 重新啟動發送?:在中斷或 DMA 回調中需手動重啟發送流程(如需連續傳輸)。

五、進階優化?

自定義協議?:結合空閑中斷(IDLE)實現不定長數據幀接收,與發送邏輯配合使用。
混合模式?:對關鍵數據使用中斷/DMA,非關鍵數據使用輪詢,平衡系統負載。


通過合理選擇發送模式并優化配置,可顯著提升 STM32 UART 通信的效率和可靠性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82997.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82997.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82997.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IIS服務器URL重寫配置完整教程

1.下載URL Rewrite Module 2.1 https://www.iis.net/downloads/microsoft/url-rewrite https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_zh-CN.msi 2.安裝

vite+vue建立前端工程

? 參考 開始 | Vite 官方中文文檔 VUE教程地址 https://cn.vuejs.org/tutorial/#step-1 第一個工程 https://blog.csdn.net/qq_35221977/article/details/137171497 腳本 chcp 65001 echo 建立vite工程 set PRO_NAMEmy-vue-appif not exist %PRO_NAME% (call npm i…

負進制轉換

當一個數的基數是負數時,將這個數轉換為負進制數時,大體思路和正數的情況一樣,但是因為基數是負數,所以計算出來的余數就有可能是負數所以,需要在余數是負數時:將余數 基數的絕對值,商 1。 代…

K8S已經成為了Ai應用運行的平臺工具

AI應用與K8s的深度融合:加速云原生時代的智能運維與業務創新 摘要: 隨著人工智能(AI)技術的飛速發展,Kubernetes(K8s)作為容器編排領域的領軍者,正逐步成為承載AI應用的核心基礎設施…

NVMe簡介1

它分為兩部分,這里是第一部分。 NVM Express(NVMe)是一種高性能、可擴展的接口協議,用于通過PCI express(PCIe)總線,實現主機軟件與NVM設備之間的通信。目前,由于NVMe SSD相比于SATA…

微服務商城(1)開篇、服務劃分

參考:https://mp.weixin.qq.com/s?__bizMzg2ODU1MTI0OA&mid2247485597&idx1&sn7e85894b7847cc50df51d66092792453&scene21#wechat_redirect 為什么選擇go-zero go-zero 為我們提供了許多高并發場景下的實用工具,比如為了降低接口耗時…

《隱私計算:數據安全與隱私保護的新希望》

一、引言 在數字化時代,數據已成為企業和組織的核心資產。然而,數據的收集、存儲和使用過程中面臨著諸多隱私和安全挑戰。隱私計算作為一種新興技術,旨在解決數據隱私保護和數據共享之間的矛盾。本文將深入探討隱私計算的基本概念、技術原理、…

MySQL 學習(九)bin log 與 redo log 的區別有哪些,為什么快速恢復使用 redo log 而不用 bin log?

目錄 一、bin log 與 redo log 的區別1)實現方式不同:2)日志內容不同:3)記錄方式不同:4)使用場合不同: 二、為什么快速恢復使用 redo log 而不用 bin log? 面試題&#x…

用Array.from實現創建一個1-100的數組

一、代碼實現 let arr Array.from({length: 100}, (_, i) > i 1); 二、代碼分析 1、Array.from(arrayLike, mapFn) (1)arrayLike 類數組對象(如 { length: 100 })本身沒有索引屬性(如 0: undefined, 1: undefi…

javaScript簡單版

簡介 JavaScript(簡稱:JS)是一門跨平臺、面向對象的腳本語言,是用來控制網頁行為,實現頁面的交互效果。 JavaScript和Java是完全不同的語言,不論是概念還是設計。但是基礎語法類似。 組成: ECMAScript:規定了JS基礎語法核心知…

Python刷題練習

文章目錄 1.尋找相同字串2.密鑰格式化3.五鍵鍵盤的輸出4.單詞重量5.輸出指定字母在字符串的中的索引6.污染水域7.九宮格按鍵輸入8.任務最優調度9.高效的任務規劃 1.尋找相同字串 題目描述: 給你兩個字符串t和p,要求從t中找到一個和p相同的連續子串,并輸…

MATLAB實現振幅調制(AM調制信號)

AM調制是通信專業非常重要的一個知識點。今天我們使用MATLAB編程實現AM調制。 我們實現輸入一個載波信號的頻率與調制信號的頻率后,再輸入調幅度,得到已調信號的波形與包絡信號的波形,再使用FFT算法分析出已調信號的頻譜圖。 源代碼&#x…

JJJ:linux ida

文章目錄 1.總結2.各類函數2.1 分配一個倉庫2.2 銷毀倉庫2.3 從倉庫里面分配一個整數id2.4 將上面分配的整數id從倉庫里面刪除2.5 在指定范圍內分配一個id 1.總結 ida使用起來很簡單,就是先分配一個倉庫一樣的實例,再從這個倉庫里面分配一個獨一無二的整…

FastByteArrayOutputStream和ByteArrayInputStream有什么區別

FastByteArrayOutputStream 和 ByteArrayInputStream 是兩種完全不同的 Java I/O 類,它們的主要區別體現在 設計目的 和 使用場景 上。以下是詳細對比: 1. 核心區別總結 特性FastByteArrayOutputStream (Spring框架)ByteArrayInputStream (JDK原生)所屬…

docker-compose——安裝redis

文章目錄 一、編寫docker-compose.yaml文件二、編寫redis.conf文件三、啟動docker-compose 一、編寫docker-compose.yaml文件 version: 3.3 services:redis:image: redis:latestcontainer_name: redisrestart: alwaysports:- 6379:6379volumes:- ./redis/data:/data- ./redis/…

東芝推出新的SCiB模塊,散熱性能加倍,適用于電動公交車、電動船舶和固定應用

東京—東芝公司推出了一種新的SCiB模塊,這是一種專為電動汽車、電動船舶和固定應用而設計的鋰離子電池。新產品采用鋁制底板,散熱量約為當前模塊的兩倍。它將于2025年4月中旬在日本和全球上市。 鋰離子電池的使用越來越多,而且越來越多樣化&a…

【進程控制二】進程替換和bash解釋器

【進程控制二】進程替換 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2總結 4.實現一個bash解釋器4.1內建命令 通過fork創建的子進程,會繼承父進程的代碼和數據,因此本質上還是在執行父進程的代碼 進程替換可以將…

Java基礎語法之數組

數組 一、認識數組 1.什么是數組 數組就是一個容器,用來存一批同種類型的數據。 舉例 20, 10, 80, 60, 90 int[] arr {20, 10, 80, 60, 90};張三, 李四, 王五 String[] names {"張三", "李四", "王五"};2.為什么要使用數組 假設…

Java死鎖排查:線上救火實戰指南

想象一下,你正在值班,突然監控告警紅成一片,用戶反饋雪花般飄來:“系統卡死了!用不了了!” —— 這很可能就是Java應用遭遇了“死鎖”這個大魔王。這時候,你就是救火隊長,首要任務不…

006-nlohmann/json 結構轉換-C++開源庫108杰

絕大多數情況下,程序和外部交換的數據,都是結構化的數據。 1. 手工實現——必須掌握的基本功 在的業務類型的同一名字空間下,實現 from_json 和 to_json 兩個自由函數(必要時,也可定義為類型的友元函數)&a…