HAL_UART_IRQHandler(UART_HandleTypeDef *huart)分析

//接收沒錯誤:執行UART_Receive_IT(huart)
//接收有錯誤:執行UART_Receive_IT(huart)、HAL_UART_ErrorCallback(huart)

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{uint32_t isrflags   = READ_REG(huart->Instance->SR);uint32_t cr1its     = READ_REG(huart->Instance->CR1);uint32_t cr3its     = READ_REG(huart->Instance->CR3);uint32_t errorflags = 0x00U;uint32_t dmarequest = 0x00U;/* If no error occurs */errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));if (errorflags == RESET){/* UART in mode Receiver -------------------------------------------------*/if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)){UART_Receive_IT(huart);		//#1 接收沒錯誤return;}}/* If some errors occur */if ((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET))){/* UART parity error interrupt occurred ----------------------------------*/if (((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET)){huart->ErrorCode |= HAL_UART_ERROR_PE;}/* UART noise error interrupt occurred -----------------------------------*/if (((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)){huart->ErrorCode |= HAL_UART_ERROR_NE;}/* UART frame error interrupt occurred -----------------------------------*/if (((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)){huart->ErrorCode |= HAL_UART_ERROR_FE;}/* UART Over-Run interrupt occurred --------------------------------------*/if (((isrflags & USART_SR_ORE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET)){huart->ErrorCode |= HAL_UART_ERROR_ORE;}/* Call UART Error Call back function if need be --------------------------*/if (huart->ErrorCode != HAL_UART_ERROR_NONE){/* UART in mode Receiver -----------------------------------------------*/if (((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET)){UART_Receive_IT(huart);	//#2 接收有錯誤}/* If Overrun error occurs, or if any error occurs in DMA mode reception,consider error as blocking */dmarequest = HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR);if (((huart->ErrorCode & HAL_UART_ERROR_ORE) != RESET) || dmarequest){/* Blocking error : transfer is abortedSet the UART state ready to be able to start again the process,Disable Rx Interrupts, and disable Rx DMA request, if ongoing */UART_EndRxTransfer(huart);/* Disable the UART DMA Rx request if enabled */if (HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)){CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR);/* Abort the UART DMA Rx channel */if (huart->hdmarx != NULL){/* Set the UART DMA Abort callback :will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */huart->hdmarx->XferAbortCallback = UART_DMAAbortOnError;if (HAL_DMA_Abort_IT(huart->hdmarx) != HAL_OK){/* Call Directly XferAbortCallback function in case of error */huart->hdmarx->XferAbortCallback(huart->hdmarx);}}else{/* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)/*Call registered error callback*/huart->ErrorCallback(huart);
#else/*Call legacy weak error callback*/HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */}}else{/* Call user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)/*Call registered error callback*/huart->ErrorCallback(huart);
#else/*Call legacy weak error callback*/HAL_UART_ErrorCallback(huart);
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */}}else{/* Non Blocking error : transfer could go on.Error is notified to user through user error callback */
#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)/*Call registered error callback*/huart->ErrorCallback(huart);
#else/*Call legacy weak error callback*/HAL_UART_ErrorCallback(huart);		//#3 接收有錯誤
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */huart->ErrorCode = HAL_UART_ERROR_NONE;}}return;} /* End if some error occurs *//* UART in mode Transmitter ------------------------------------------------*/if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET)){UART_Transmit_IT(huart);return;}/* UART in mode Transmitter end --------------------------------------------*/if (((isrflags & USART_SR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET)){UART_EndTransmit_IT(huart);return;}
}

//#1 接收沒錯誤、#2 接收有錯誤,接收數據量達到設定值會自動關閉接收中斷
//HAL_UART_Receive_IT(&huart1,Tx_Buff,1); //設定接收量為1

static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
{uint16_t *tmp;/* Check that a Rx process is ongoing */if (huart->RxState == HAL_UART_STATE_BUSY_RX){if (huart->Init.WordLength == UART_WORDLENGTH_9B){tmp = (uint16_t *) huart->pRxBuffPtr;if (huart->Init.Parity == UART_PARITY_NONE){*tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x01FF);huart->pRxBuffPtr += 2U;}else{*tmp = (uint16_t)(huart->Instance->DR & (uint16_t)0x00FF);huart->pRxBuffPtr += 1U;}}else{if (huart->Init.Parity == UART_PARITY_NONE){*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);}else{*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);}}if (--huart->RxXferCount == 0U){/* Disable the UART Data Register not empty Interrupt */__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);		//自動關閉接收中斷/* Disable the UART Parity Error Interrupt */__HAL_UART_DISABLE_IT(huart, UART_IT_PE);/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);/* Rx process is completed, restore huart->RxState to Ready */huart->RxState = HAL_UART_STATE_READY;#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)/*Call registered Rx complete callback*/huart->RxCpltCallback(huart);
#else/*Call legacy weak Rx complete callback*/HAL_UART_RxCpltCallback(huart);			//#4 接收回調
#endif /* USE_HAL_UART_REGISTER_CALLBACKS */return HAL_OK;}return HAL_OK;}else{return HAL_BUSY;}
}

//#3 接收有錯誤回調

__weak void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function should not be modified, when the callback is needed,the HAL_UART_ErrorCallback could be implemented in the user file*/
}

//#4 接收回調

__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{/* Prevent unused argument(s) compilation warning */UNUSED(huart);/* NOTE: This function should not be modified, when the callback is needed,the HAL_UART_RxCpltCallback could be implemented in the user file*/
}

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

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

相關文章

java項目部署腳本

一、java項目部署腳本示例 在Java項目中,部署腳本通常依賴于項目的構建工具(如Maven或Gradle)以及部署環境(如Docker、Tomcat、Kubernetes等)。以下是一個基于Maven和Shell腳本的Java項目部署示例,假設我們…

8*8LED點陣點亮一個點

#include<reg51.h> typedef unsigned int u16; //對系統默認數據進行重定義 typedef unsigned char u8; //定義74HC595控制管腳 sbit SRCLKP3^6; //移位寄存器時鐘輸入 sbit RCLKP3^5; //存儲寄存器時鐘輸入 sbit SERP3^4; //串…

SpaceX: 太空火箭自主精準著陸

本文是根據Lars Blackmore在16年的一篇公開論文翻譯而來&#xff0c;雖然有些早而且是科普文章&#xff0c;但是可以初見一些SpaceX火箭著陸的細節&#xff0c;后面我會對spaceX landing control 技術主管MIT博士期間研究火箭控制算法的論文進行講解&#xff0c;敬請期待。 Lar…

Linux系統常用命令

Linux 系統常用命令 1、文件操作2、目錄操作 1、文件操作 創建文件&#xff1a; touch 文件名 創建文件并編輯&#xff1a;vim 文件名 查看文件全部內容&#xff1a;cat 文件名 帶行號查看文件內容&#xff1a; cat -n file 查看文件內容并監視內容更新&#xff1a; 以翻頁形…

【電機】步進電機相關指標

一 靜態指標&#xff1a; 相數&#xff1a;線圈的組數&#xff0c;兩相步進電機步距角一般為 1.8&#xff0c;三相的步進電機步距角為 1.2&#xff0c;相數越多步距角越小。 步距角&#xff1a;一個脈沖信號所對應的電機轉動的角度&#xff0c;這個步距角他不一定是電機實際工…

OpenEuler華為歐拉系統安裝—從零開始,小白也能學會

介紹 openEuler&#xff08;歐拉&#xff09;是一款開源操作系統。 當前openEuler內核源于Linux&#xff0c;支持鯤鵬及其它多種處理器&#xff0c; 能夠充分釋放計算芯片的潛能&#xff0c;是由全球開源貢獻者構建的高效、 穩定、安全的開源操作系統&#xff0c;適用于數據庫…

JVM運行數據區-Java堆

Java堆 堆區&#xff08;Heap區&#xff09;是JVM運行時數據區占用內存最大的一塊區域&#xff0c;每一個JVM進程只存在一個堆區&#xff0c;它在JVM啟動時被創建&#xff0c;JVM規范中規定堆區可以是物理上不連續的內存&#xff0c;但必須是邏輯上連續的內存。 1、堆區是線程…

Java面試題-基礎

Java面試題-基礎 1、Java語言有哪些特點&#xff1f;2、面向對象和面向過程的區別是什么&#xff1f;3、說說標識符的命名規則&#xff1f;4、說說Java八種基本數據類型的大小以及他們的封裝類&#xff1f;5、instanceof關鍵字有什么作用&#xff1f;6、自動裝箱與自動拆箱是什…

「網絡編程」基于 UDP 協議實現回顯服務器

&#x1f387;個人主頁&#xff1a;Ice_Sugar_7 &#x1f387;所屬專欄&#xff1a;計網 &#x1f387;歡迎點贊收藏加關注哦&#xff01; 實現回顯服務器 &#x1f349;socket api&#x1f349;回顯服務器&#x1f34c;實現&#x1f95d;服務器&#x1f95d;客戶端 &#x1f3…

純血鴻蒙實戰開發—如何添加頂部tab頁面

1.Tabs組件 Tabs組件的頁面組成包含兩個部分&#xff0c;分別是TabContent和TabBar。TabContent是內容頁&#xff0c;TabBar是導航頁簽欄. 根據不同的導航類型&#xff0c;布局會有區別&#xff0c;可以分為底部導航、頂部導航、側邊導航&#xff0c;其導航欄分別位于底部、頂…

react基礎學習 JSX

JSX的測試網站 Babel Babel 可以測試代碼的效果 JSX實現map列表 注意 key不一樣&#xff08;使用遍歷的時候&#xff09; 簡單條件渲染 復雜條件渲染 綁定事件 function App() {const colorse (e)>{console.log("測試點擊",e);}const colorse1 (name)>{…

代碼隨想錄訓練營第六十天 | 84.柱狀圖中最大的矩形

84.柱狀圖中最大的矩形 題目鏈接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文檔講解&#xff1a;代碼隨想錄 視頻講解&#xff1a;單調棧&#xff0c;又一次經典來襲&#xff01; LeetCode&#xff1a;84.柱狀圖中最大的矩形_嗶哩嗶哩_bilibili 狀態&#xff1a;未…

地理信息科學中的大數據挑戰

在信息化爆炸的時代&#xff0c;地理信息科學&#xff08;GIScience&#xff09;正經歷著前所未有的變革&#xff0c;其中&#xff0c;地理空間大數據的涌現為科學研究與應用帶來了前所未有的機遇與挑戰。作為地理信息與遙感領域的探索者&#xff0c;本文旨在深入剖析地理空間大…

揭秘HubSpot集客營銷:如何吸引并轉化全球潛在客戶

隨著全球數字化浪潮的推進&#xff0c;企業出海已經成為許多公司擴大市場、增加品牌曝光度的重要戰略。HubSpot集客營銷作為一種以客戶為中心、數據驅動的營銷策略&#xff0c;為企業在海外市場的成功提供了強有力的支持。作為HubSpot亞太地區的合作伙伴&#xff0c;NetFarmer將…

[AIGC] 自定義Spring Boot中BigDecimal的序列化方式

在很多場景下&#xff0c;我們需要對BigDecimal類型的數據進行特殊處理&#xff0c;比如保留三位小數。Spring Boot使用Jackson作為默認的JSON序列化工具&#xff0c;我們可以通過自定義Jackson的序列化器&#xff08;Serializer&#xff09;來實現&#xff0c;下面將詳細介紹實…

力扣2730.找到最長的半重復子字符串

力扣2730.找到最長的半重復子字符串 找到相鄰的相同字母后same 再雙指針找到前一組相同字母位置 class Solution {public:int longestSemiRepetitiveSubstring(string s) {int res1,n s.size(),same0;for(int i1,j0;i<n;i){if(s[i] s[i-1] && same > 1)for…

godot的安裝和使用 1

今天是第一節&#xff0c;因此呢先做godot的安裝&#xff0c;其實很簡單 godot官網&#xff1a;https://godotengine.org/ 進入官網&#xff0c; 安裝好之后呢&#xff0c;會有兩個文件 打開第一個就是可視化界面的&#xff0c;進入后是這個樣子 說明安裝成功了

【ArcGIS微課1000例】0115:字段數據類型案例詳解

文章目錄 一、ArcGIS數據類型概述二、案例1. 數字2. 文本3. 日期4. BLOB5. 對象標識符6. 全局標識符一、ArcGIS數據類型概述 創建要素類和表時,需要為各字段選擇數據類型。可用的類型包括多種數字類型、文本類型、日期類型、二進制大對象 (BLOB) 或全局唯一標識符 (GUID)。選…

python高級面試題

1. Python 中的 GIL (Global Interpreter Lock) 是什么? 解答: Python 的 GIL 是全局解釋器鎖,限制了在 CPython 解釋器中同時執行多個線程。GIL 確保在任意時刻只有一個線程執行 Python 字節碼。這是為了保護訪問 Python 對象的內部數據結構免受并發問題的影響。盡管 GIL 會…

鴻蒙開發接口安全:【@ohos.abilityAccessCtrl (訪問控制管理)】

訪問控制管理 說明&#xff1a; 本模塊首批接口從API version 8開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口的起始版本。 導入模塊 import abilityAccessCtrl from ohos.abilityAccessCtrlabilityAccessCtrl.createAtManager createAtManager(): AtMan…