嵌入式學習筆記 - STM32 U(S)ART 模塊HAL 庫函數總結

一 串口發送方式:

①輪訓方式發送,也就是主動發送,這個容易理解,使用如下函數:

HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout);

②中斷方式發送,使用如下函數

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);

過程如下:

首先使能發送中斷__HAL_UART_ENABLE_IT(huart, UART_IT_TXE); 如果發送數據寄存器為空(第一次發送前為空),則進入USARTx_IRQHandler()中斷向量入口,這個中斷向量里面會調用總的串口中斷處理函數HAL_UART_IRQHandler(&huart1);

里面有發送中斷處理分支部分UART_Transmit_IT(huart),連續發送想要發送的多個字節下圖紅線部分所示,每調用一次發送一個字節數據,字節發送結束后發送寄存器變為空時再次進入此中斷,每發一次huart->TxXferCount減一次,減為0時,失能發送中斷,打開發送完成中斷,如下圖黃色色部分所示

然后再次回到USARTx_IRQHandler,調用 發送完成處理分支UART_EndTransmit_IT(huart);

UART_EndTransmit_IT函數會調用發送完成回調函數HAL_UART_TxCpltCallback(huart);

用戶可以自行定義此函數進行相應處理

③ DMA 方式發送:

HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size);

二 串口接收方式:

1)輪訓方式接收,也就是主動去檢查,這個容易理解,使用如下函數

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

2)DMA方式接收

HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

3)中斷方式接收,有兩種方式,這里過程比較多比較難理解詳細講述:

不使用HAL庫函數,直接寄存器方式,如下圖,直接在中斷向量表入口里面通過判斷接收標志位RXNE,直接讀寄存器DR,這樣每一個收到一個字節會進一次中斷

使用HAL庫函數的回調函數注意這里有兩種接收方式以及相應的兩種回調函數:

① 標準回調函數(接收完成回調函數):HAL_UART_RxCpltCallback()

接收到啟動時設置的字節數(啟動接收時需要設置接收數據長度)后的回調函數

a) 首先通過HAL_UART_Receive_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE)啟動,這個啟動函數要在初始化時首次啟動,并且要在接收完定長數據后回調函數中再次啟動,如下圖

里面有開啟中斷接收數據的條件

以及條件賦值語句,這是選擇進入標準回調函數的條件,

b) 發生中斷時(接收到一個字節時)中斷向量里面會調用總的串口中斷處理函數HAL_UART_IRQHandler(&huart1);此函數會調用?UART_Receive_IT(huart);

此函數里面會對數據進行接收保存,如下,從此函數可以看出,不開啟上面的a)步驟的條件,UART_Receive_IT是不會讀接收寄存器的是數據的,如下圖,所以想要使用HAL庫回調函數接收數據,必須在初始化時通過HAL_UARTEx_ReceiveToIdle_IT或者HAL_UART_Receive_IT()函數開啟接收狀態,這是HAL庫函數決定的。

c)此函數最終還會調用定長數據接收回調函數HAL_UART_RxCpltCallback(huart);如下圖

用戶可以在回調函數中對數據進行想要的處理。

② 接收完成或者空閑回調函數HAL_UARTEx_RxEventCallback()

接收完成或者空閑回調函數。當接收到預先設置好的字節數或者接收空閑(IDLE中斷)時會回調這個函數

?a) 首先通過HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE);開啟接收狀態如下圖

里面有開啟進入空閑回調函數的條件如下圖

以及開啟中斷接收數據的條件,如下圖

b) 發生中斷時,串口中斷向量入口會調用總處理函數HAL_UART_IRQHandler(&huart1)

此函數會調用函數UART_Receive_IT進行數據讀取,從此函數可以發現如果不開啟上面的a)步驟的條件,UART_Receive_IT是不會讀接收寄存器的是數據的,如下圖,所以想要使用HAL庫回調函數接收數據,必須在初始化時通過HAL_UARTEx_ReceiveToIdle_IT或者HAL_UART_Receive_IT()函數開啟接收狀態,這是HAL庫函數決定的。

c)以及最終調用完成或者空閑回調函數HAL_UARTEx_RxEventCallback(huart, nb_rx_data);

首先第一個情況下UART_Receive_IT里面在發送完成條件下,同標準回調函數一樣,也調用了此回調函數

另外注意黃線所示語句,huart->ReceptionType = HAL_UART_RECEPTION_STANDARD;如果這是一個發送滿一個RxBuffer量程的情況,就賦值接收模式為標準模式,就不會進入下面這個情況進行空閑模式分析與調用。

第二個情況:

首先有個條件,就是在第a)步驟中提及的條件,啟動了HAL_UARTEx_ReceiveToIdle_IT空閑接收狀態,并且前面沒有接收滿一個量程上面紫色字體所述,如下圖

其次是接收未滿一個RxBuffer量程的條件,圓圈處代表總線空閑,接收未達到RxBuffer 滿量程,進行此函數調用

兩個回調函數的使用總結如下:

比如定義接收緩沖區大小為RxBuffer[10],也就是函數HAL_UART_Receive_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE)或者HAL_UARTEx_ReceiveToIdle_IT(&huart1,(uint8_t *)RxBuff,BUFFSIZE);中的BUFFERSIZE=10,調用機制如下圖

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

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

相關文章

AI無法解決的Bug系列(一)跨時區日期過濾問題

跨時區開發中,React Native如何處理新西蘭的日期過濾問題 有些Bug,不是你寫錯代碼,而是現實太魔幻。 比如我最近給新西蘭客戶開發一個React Native應用,功能非常樸素:用戶選一個日期范圍,系統返回該范圍內…

基于天貓 API 的高效商品詳情頁實時數據接入方法解析

一、引言 在電商大數據分析、競品監控及智能選品等場景中,實時獲取天貓商品詳情頁數據是關鍵需求。本文將詳細解析通過天貓開放平臺 API 高效接入商品詳情數據的技術方案,涵蓋接口申請、數據獲取邏輯及代碼實現,幫助開發者快速構建實時數據采…

系分論文《論遺產系統演化》

系統分析師論文范文系列 摘要 2022年6月,某金融機構啟動核心業務系統的技術升級項目,旨在對其運行超過十年的遺留系統進行演化改造。該系統承擔著賬戶管理、支付結算等關鍵業務功能,但其技術架構陳舊、擴展性不足,難以適應數字化轉型與業務快速增長的需求。作為系統分析師,…

Spark Core基礎與源碼剖析全景手冊

Spark Core基礎與源碼剖析全景手冊 Spark作為大數據領域的明星計算引擎,其核心原理、源碼實現與調優方法一直是面試和實戰中的高頻考點。本文將系統梳理Spark Core與Hadoop生態的關系、經典案例、聚合與分區優化、算子底層原理、集群架構和源碼剖析,結合…

人工智能賦能產業升級:AI在智能制造、智慧城市等領域的應用實踐

人工智能賦能產業升級:AI在智能制造、智慧城市等領域的應用實踐 近年來,人工智能(AI)技術的快速發展為各行各業帶來了深刻的變革。無論是制造業、城市管理,還是交通、醫療等領域,AI技術都展現出了強大的應用…

React Native打包報錯: Task :react-native-picker:verifyReleaseResources FAILE

RN打包報錯: Task :react-native-picker:verifyReleaseResources FAILED Execution failed for task :react-native-picker:verifyReleaseResources. 解決方法: 修改文件react-native-picker中的版本信息。 路徑:node_modules/react-native-p…

虛擬網絡編輯器

vmnet1 僅主機模式 hostonly 功能:虛擬機只能和宿主機通過vmnet1通信,不可連接其他網絡(包括互聯網) vmnet8 地址轉換模式 NAT 功能:虛擬機可以和宿主通過vmnet8通信,并且可以連接其他網絡,但是…

docker環境和dockerfile制作

docker 一、環境和安裝 1、 docker安裝 使用 root 權限登錄 CentOS。確保 yum 包更新到最新sudo yum update卸載舊版本yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux …

[luogu12542] [APIO2025] 排列游戲 - 交互 - 博弈 - 分類討論 - 構造

傳送門:https://www.luogu.com.cn/problem/P12542 題目大意:給定一個長為 n n n 的排列和一張 m m m 個點 e e e 條邊的簡單連通圖。每次你可以在圖上每個點設置一個 0 ~ n ? 1 0\sim n-1 0~n?1、兩兩不同的權值發給交互庫,交互庫會…

智能體agent概述

智能體概述 智能體是一個能夠感知環境并在環境中自主行動以實現特定目標的系統。它具有以下幾個關鍵特征: 自主性 - 智能體可以在沒有直接人為干預的情況下運作,能夠自行決策和行動。 響應性 - 能夠感知環境并對環境變化做出及時響應。 主動性 - 不僅…

2:OpenCV—加載顯示圖像

加載和顯示圖像 從文件和顯示加載圖像 在本節中&#xff0c;我將向您展示如何使用 OpenCV 庫函數從文件加載圖像并在窗口中顯示圖像。 首先&#xff0c;打開C IDE并創建一個新項目。然后&#xff0c;必須為 OpenCV 配置新項目。 #include <iostream> #include <ope…

python訓練 60天挑戰-day31

知識點回顧 規范的文件命名規范的文件夾管理機器學習項目的拆分編碼格式和類型注解 昨天我們已經介紹了如何在不同的文件中&#xff0c;導入其他目錄的文件&#xff0c;核心在于了解導入方式和python解釋器檢索目錄的方式。 搞清楚了這些&#xff0c;那我們就可以來看看&#x…

構建自動收集并總結互聯網熱門話題的網站

構建自動收集并總結互聯網熱門話題的網站的具體方案&#xff1a; 一、系統架構設計 數據采集層 ? 使用Python的Scrapy或BeautifulSoup抓取新聞網站/社交媒體API # 示例&#xff1a;微博熱點爬蟲 import requests def fetch_weibo_hot():url "https://weibo.com/ajax/st…

pycharm無需科學上網工具下載插件的解決方案

以下是兩種無需科學上網即可下載 PyCharm 插件的解決思路&#xff1a; 方法 1&#xff1a;設置 PyCharm 代理 打開 PyCharm選擇菜單&#xff1a;File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理設置中進行如下配置&#xff1a; 代理地…

機器學習自然語言處理

在自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;詞向量&#xff08;Word Embedding&#xff09;是將人類語言轉化為計算機可理解形式的關鍵技術。它通過數學空間中的向量表示&#xff0c;捕捉詞語的語義和語法信息&#xff0c;有效解決了傳統離散表示的 “維數災難…

如何自學FPGA設計?

眾所周知&#xff0c;FPGA設計自學難度不小&#xff0c;更不存在速成的捷徑。這里簡單說一下學習的規劃&#xff0c;希望能給入門者提供一些方向。 學會相應的知識 不論是科班畢業還是理工科專業出身&#xff0c;想要入行FPGA開發&#xff0c;基礎知識必須扎實。尤其是在高校…

南航無人機大規模戶外環境視覺導航框架!SM-CERL:基于語義地圖與認知逃逸強化學習的無人機戶外視覺導航

作者&#xff1a; Shijin Zhao, Fuhui Zhou, Qihui Wu單位&#xff1a;南京航空航天大學電子信息工程學院論文標題&#xff1a; UAV Visual Navigation in the Large-Scale Outdoor Environment: A Semantic Map-Based Cognitive Escape Reinforcement Learning Method論文鏈接…

Linux-進程間通信

1.進程間通信介紹 1.1通信目的 數據傳輸&#xff1a;?個進程需要將它的數據發送給另?個進程 資源共享&#xff1a;多個進程之間共享同樣的資源。 通知事件&#xff1a;?個進程需要向另?個或?組進程發送消息&#xff0c;通知它&#xff08;它們&#xff09;發?了某種事…

精益數據分析(69/126):最小可行化產品(MVP)的設計、驗證與數據驅動迭代

精益數據分析&#xff08;69/126&#xff09;&#xff1a;最小可行化產品&#xff08;MVP&#xff09;的設計、驗證與數據驅動迭代 在創業旅程中&#xff0c;從需求洞察到產品落地的關鍵一躍是打造最小可行化產品&#xff08;MVP&#xff09;。今天&#xff0c;我們結合《精益…

從JavaScript快速上手Python:關鍵差異與核心技巧

引言 如果你是JavaScript開發者&#xff0c;可能會對Python的簡潔語法和豐富的生態感興趣。但兩種語言的設計哲學和實現細節存在顯著差異。本文將通過對比JS與Python的核心概念&#xff0c;幫助你快速過渡&#xff0c;避免“踩坑”。 一、語法差異&#xff1a;告別大括號&#…