HAl庫開發中斷方式接收Can報文的詳細流程

下面給出一個基于 HAL 庫的中斷方式接收 CAN 報文的詳細流程說明,描述每一步的硬件配置、軟件調用和中斷處理機制,而不涉及具體代碼細節,只講解整體原理和步驟:

在使用 HAL 庫時,不需要手動清除中斷標志位。原因如下:

  • 當你在中斷回調函數(例如 HAL_CAN_RxFifo0MsgPendingCallback)中調用 HAL_CAN_GetRxMessage() 讀取報文時,HAL 庫會自動清除相應的中斷標志,使得 CAN 控制器的 FIFO 可以繼續接收下一條報文。

  • 這種設計保證了用戶只需要專注于數據處理,而不必額外處理中斷標志的清除操作。

因此,只要你按照 HAL 庫的使用流程,在中斷函數中正確調用了 HAL_CAN_GetRxMessage,就無需手動清零中斷標志位。

如果使用 標準庫(寄存器級別編程) 而不是 HAL 庫,那么在 CAN 中斷接收報文后,需要手動清除中斷標志位,否則 CAN 控制器可能無法接收新的報文。


1. 系統與外設初始化

1.1 HAL 庫初始化
  • 調用 HAL_Init()
    初始化 HAL 庫,包括重置外設、初始化系統定時器和配置中斷分組,為后續外設初始化做準備。
1.2 系統時鐘配置
  • 調用 SystemClock_Config()
    配置系統時鐘(如 PLL、總線分頻等),確保 CAN 模塊所屬的總線時鐘正常,為 CAN 外設提供穩定的時鐘信號。
1.3 GPIO 初始化
  • 配置 CAN 引腳
    通過 GPIO 初始化函數(例如 MX_GPIO_Init())配置 CAN_TX 和 CAN_RX 對應的引腳,設置為“復用功能”(Alternate Function),并選擇正確的復用映射(例如 GPIO_AF9_CAN1)。
1.4 CAN 外設低級資源配置(MSP 初始化)
  • 在 HAL_CAN_MspInit() 中完成
    • 使能 CAN 外設及其所在總線的時鐘。
    • 配置 CAN 引腳(如 PA11、PA12)為復用功能。
    • 配置 NVIC:設置 CAN 接收中斷的優先級,并使能相應的中斷通道(例如 CAN1_RX0_IRQn)。

2. CAN 外設初始化與濾波器配置

2.1 CAN 參數初始化
  • 設置 CAN_HandleTypeDef 結構體
    配置 CAN 的基本參數,如波特率、工作模式(正常模式、回環模式等)、時間段、重傳策略等。
  • 調用 HAL_CAN_Init()
    根據配置初始化 CAN 外設,此時 HAL 庫會自動調用 HAL_CAN_MspInit() 完成低級硬件初始化。
2.2 濾波器配置
  • 設置 CAN 濾波器參數
    根據實際應用需求配置 CAN 濾波器(例如使用 ID 掩碼模式或列表模式),以便讓 CAN 模塊只接收符合條件的報文。
  • 調用 HAL_CAN_ConfigFilter()
    將濾波器參數寫入 CAN 濾波器寄存器。
    注:濾波器配置一般在 CAN 初始化之后、啟動之前完成。
2.3 啟動 CAN 模塊
  • 調用 HAL_CAN_Start()
    啟動 CAN 外設,使其進入正常工作狀態,同時使能發送與接收功能。

3. 啟用中斷接收

  • 使能接收中斷
    在 HAL_CAN_MspInit() 中已經配置并使能了 CAN 接收中斷(例如使能 FIFO0 接收中斷),這樣當有報文到達時,CAN 控制器會自動觸發中斷。

4. 中斷處理流程

當 CAN 模塊檢測到 FIFO0 中有新報文等待接收時,自動觸發 CAN 接收中斷,HAL 庫會調用預定義的回調函數,其詳細流程如下:

4.1 進入中斷回調
  • *調用回調函數 HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef CanHandle)
    這是用戶實現的回調函數,專門用于處理 FIFO0 中待接收的 CAN 報文。
4.2 讀取接收到的報文
  • 調用 HAL_CAN_GetRxMessage()
    在回調中,使用該函數從 FIFO0 中讀取報文數據和報文頭信息:
    • 報文頭包含標識符(標準或擴展 ID)、數據長度(DLC)、幀類型(數據幀或遠程幀)等信息。
    • 數據部分為 0~8 字節(或更多字節,在 CAN FD 中)。
  • 返回狀態檢查
    如果返回值為 HAL_OK,則說明報文已正確接收。
4.3 數據處理與分發
  • 解析報文
    根據接收到的報文頭字段判斷報文類型和標識符,決定如何處理:
    • 對于特定 ID 的報文,可直接解析數據內容,例如拆分成多個數據變量、轉換為實際物理量(如角度、速度等)。
    • 如果需要,可以將接收到的數據存入全局變量、結構體或推送到消息隊列中,以便后續任務處理。
  • 業務處理
    根據應用需求,對接收到的數據進行進一步處理(如校驗、轉換、報警處理等)。
4.4 清除中斷標志
  • 自動處理
    在調用 HAL_CAN_GetRxMessage 后,CAN 模塊會自動清除相應的 FIFO 標志,確保可以接收下一條報文。

5. 后續處理

  • 非中斷模式下的數據處理
    接收到的數據通常會通過中斷回調保存到某個緩沖區或隊列中,主循環或專門的任務會定期檢查該緩沖區并對數據進行處理。
  • 錯誤處理
    如果在中斷過程中檢測到錯誤(例如報文校驗失敗、溢出等),可以調用 HAL_CAN_ErrorCallback() 或自定義錯誤處理函數,進行必要的錯誤記錄或重傳機制。

總結

整個中斷接收 CAN 報文的詳細流程為:

  1. 初始化階段
    • 完成 HAL 庫、時鐘、GPIO、CAN 外設以及 NVIC 中斷的初始化。
  2. CAN 配置階段
    • 設置 CAN 參數,配置濾波器,啟動 CAN 模塊。
  3. 使能中斷
    • 在 MSP 初始化中使能 CAN 接收中斷,使得接收 FIFO0 報文時能觸發中斷。
  4. 中斷回調處理
    • 當 CAN 檢測到新報文時自動進入 HAL_CAN_RxFifo0MsgPendingCallback 回調函數。
    • 在回調中調用 HAL_CAN_GetRxMessage 從 FIFO0 讀取報文。
    • 對報文頭和數據進行解析,根據報文 ID 和數據內容進行相應處理,如存入隊列或直接計算處理。
  5. 后續數據處理
    • 主循環或后臺任務讀取緩沖隊列中的數據進行后續業務處理。

這種中斷驅動的接收方式能保證 CAN 模塊在實時接收數據時不會漏報,同時將數據處理與中斷服務分離,確保系統穩定高效運行。

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

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

相關文章

【讀書筆記】華為《從偶然到必然》

note 華為的成功并非偶然,而是通過IPD體系、投資組合管理、平臺戰略等系統性工具,將研發投資轉化為可持續的商業競爭力。書中強調的“管理即內部因素”理念,揭示了企業規模擴張與管理能力匹配的深層規律,為高科技企業提供了可借鑒…

6.4考研408數據結構圖論核心知識點深度解析

一、最小生成樹(Minimum Spanning Tree) 1.1 Prim算法 易錯點與難點 lowcost數組更新邏輯 錯誤將已加入生成樹的頂點距離重置為0后繼續參與計算,導致后續頂點選擇錯誤未正確處理非連通圖情況,可能陷入死循環(需結合visited數組判斷)示例錯誤:for(int j=0; j<G.vexn…

HashMap添加元素的流程圖

文章目錄 JDK7 vs JDK8 的 HashMap 結構變化Java8 中哈希表的紅黑樹優化機制HashMap 添加元素的完整流程解析1. 計算 key 的哈希值并確定索引2. 檢查該索引位置是否已有元素3. 處理哈希沖突4. 判斷當前存儲結構&#xff08;鏈表還是紅黑樹&#xff09;5. 判斷鏈表長度是否超過 …

Excel(進階篇):powerquery詳解、PowerQuery的各種用法,逆透視表格、雙行表頭如何制作透視表、不規則數據如何制作數據透視表

目錄 PowerQuery工具基礎修改現有數據理規則PowerQuery抓取數據的兩種方式多文件合并透視不同表結構多表追加數據透視追加與合并整理橫向表格:逆透視 數據用拆分工具整理數據算賬齡 不等步長值組合合并文件夾中所有文件PowerQuery處理CSV文件雙行表頭、帶合并單元格如何做數據…

從零開始:使用 Cython + JNI 在 Android 上運行 Python 算法

1. 引言 在 Android 設備上運行 Python 代碼通常面臨性能、兼容性和封裝等挑戰。尤其是當你希望在 Android 應用中使用 Python 編寫的計算密集型算法時&#xff0c;直接運行 Python 代碼可能導致較高的 CPU 占用和較差的性能。為了解決這個問題&#xff0c;我們可以使用 Cytho…

請為下面的html添加一個修改按鈕,以便對書名、價格進行修改

下面的HTML段落&#xff0c;在書名和價格輸入錯誤的情況下&#xff0c;無法進行修改。添加一個按鈕&#xff0c;對已經輸入的信息進行修改。 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></…

FFmpeg + ?Qt? 簡單視頻播放器代碼

一個基于 ?FFmpeg 4.x? 和 ?Qt? 的簡單視頻播放器代碼示例&#xff0c;實現視頻解碼和渲染到 Qt 窗口的功能。 1&#xff09;ffmpeg庫界面&#xff0c;視頻解碼支持軟解和硬解方式。 2&#xff09;QImage/QPixmap顯示視頻圖片。 ?1. Qt 項目配置&#xff08;.pro 文件&…

如何在百度搜索上刪除與自己名字相關的資料

個人信息的網絡足跡如同一張無形的網&#xff0c;將我們與世界的每一個角落緊密相連。然而&#xff0c;當某些與自己名字相關的資料不再希望被公眾輕易檢索到時&#xff0c;如何在百度搜索中有效“隱身”&#xff0c;成為了一個亟待解決的問題。面對復雜多變的網絡環境&#xf…

WebSocket:現代實時通信協議的深度解析與實踐

一、背景與演進歷程 1.1 傳統實時通信的困境 // 典型的HTTP輪詢偽代碼 while(true) {auto response http_client.get("/messages");if(response.has_data()) process(response);std::this_thread::sleep_for(1s); // 固定間隔輪詢 } 高延遲&#xff1a;輪詢間隔導…

[貪心算法]最長回文串 增減字符串匹配 分發餅干

1.最長回文串 我們可以存下每個字母的個數&#xff0c;然后分類討論 如果是奇數就減一加到結果中如果是偶數就直接加入即可 最后判斷長度跟原字符串的差距&#xff0c;如果小于原數組說明有奇數結果1 class Solution { public:int longestPalindrome(string s) {int ret0;//1.計…

STM32 的tf卡驅動

基于STM32的TF卡驅動的基本實現步驟和相關代碼示例,主要使用SPI接口來與TF卡進行通信。 硬件連接 將TF卡的SPI接口與STM32的SPI引腳連接,通常需要連接SCK(時鐘)、MOSI(主出從入)、MISO(主入從出)和CS(片選)引腳。 軟件實現 初始化SPI 配置SPI的工作模式、時鐘頻率…

目標檢測中的非極大值抑制(NMS)原理與實現解析

一、技術背景 在目標檢測任務中&#xff0c;模型通常會對同一目標生成多個重疊的候選框&#xff08;如錨框或預測框&#xff09;。非極大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09; 是一種關鍵的后處理技術&#xff0c;用于去除冗余的檢測結果&#xff0c;保…

探秘鴻蒙 HarmonyOS NEXT:鴻蒙存儲核心技術全解析

引言 本文章基于HarmonyOS NEXT操作系統&#xff0c;API12以上的版本。 在 ArkTS (ArkUI 框架) 中&#xff0c;用戶首選項 (Preferences) 和 持久化存儲 (PersistentStorage) 都用于數據存儲&#xff0c;但它們有不同的應用場景和特點。 1. 用戶首選項 (Preferences) 概念&a…

Leetcode—15. 三數之和(哈希表—基礎算法)

題目&#xff1a; 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為 0 且不重復的三元組。 注意&#xff1a;答案中不可以包含重復的…

Linux 啟動Jar腳本設置開機自啟【超級詳細】

Linux 啟動Jar腳本&&設置開機自啟【超級詳細】 概要服務器開機自啟服務重啟腳本 概要 最近在Linux服務器中部署了一個項目&#xff08;單機版&#xff09;&#xff0c;每次更新服務的時候需要用到好幾個命令&#xff0c;停止服務&#xff0c;再重啟&#xff0c;并且服…

【第21節】windows sdk編程:網絡編程基礎

目錄 引言&#xff1a;網絡編程基礎 一、socket介紹(套接字) 1.1 Berkeley Socket套接字 1.2 WinSocket套接字 1.3 WSAtartup函數 1.4 socket函數 1.5 字節序轉換 1.6 綁定套接字 1.7 監聽 1.8 連接 1.9 接收數據 1.10 發送數據 1.11 關閉套接字 二、UDP連接流程…

QT 圖表(拆線圖,欄狀圖,餅狀圖 ,動態圖表)

效果 折線圖 // 創建折線數據系列// 創建折線系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 創建圖表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…

vector和list的區別是什么

vector 和 list 都是C 標準模板庫&#xff08;STL&#xff09;中的容器&#xff0c;它們的區別如下&#xff1a; 內存結構 - vector &#xff1a;是連續的內存空間&#xff0c;就像數組一樣&#xff0c;元素在內存中依次排列。 - list &#xff1a;是由節點組成的雙向鏈表…

【AI】【AIGC】降低AIGC檢測率:技術、挑戰與應對策略

引言 隨著生成式人工智能&#xff08;AIGC&#xff09;技術的迅速發展&#xff0c;越來越多的內容開始由人工智能生成。AIGC技術的應用非常廣泛&#xff0c;包括文本生成、圖像生成、音頻生成等。然而&#xff0c;隨著這些技術的普及&#xff0c;如何有效識別并檢測AIGC生成的…

vue3 ts 請求封裝后端接口

一 首頁-廣告區域-小程序 首頁-廣告區域-小程序 GET/home/banner1.1 請求封裝 首頁-廣告區域 home.ts export const getHomeBannerApi (distributionSite 1) > {return http<BannerItem[]>({method: GET,url: /home/banner,data: {distributionSite,},}) }函數定…