stm32 cubemx can通訊(3)bsp_can

文章目錄

  • 前言
  • 一、bsp
    • bsp_can.h
    • bsp_can.c
  • 二、如何使用
  • 總結


前言

stm32 cubemx can通訊(1)回環模式
stm32 cubemx can通訊(2)過濾器設置說明代碼分析
根據前兩篇文章已經能夠實現can標準幀的收發,但是調用的函數沒有標準化和可擴展性。
所以本文講解bsp,在bsp中已經有了發送函數和接受回調函數的任務映射處理回調函數。
暫時(2023.8.10)還未加入過濾器配置,所以過濾器還是需要在can_init中進行配置。

文件


一、bsp

bsp_can.h

#ifndef __BSP_CAN_H
#define __BSP_CAN_H
#include "main.h"#include "can.h"uint8_t  CANSend(CAN_HandleTypeDef *hcan,uint32_t Source_ID,uint32_t IDE,uint32_t RTR,uint8_t* Datum,uint8_t DataLength);typedef struct {uint32_t id;uint32_t idType;  // CAN_ID_STD or CAN_ID_EXTvoid (*callback)(uint8_t* data);
} CAN_CallbackMapType;#endif

bsp_can.c

#include "bsp_can.h"/*** 發送CAN數據* @param hcan: 使用的CAN句柄* @param Source_ID: 消息ID* @param IDE: 標識符類型 (CAN_ID_STD 或 CAN_ID_EXT)* @param RTR: 消息類型 (CAN_RTR_DATA 或 CAN_RTR_REMOTE)* @param Datum: 要發送的數據* @param DataLength: 數據長度* @return: HAL的狀態 (		1 成功 		0 失敗			)*/
#define CAN_MAX_DATA_LENGTH 8
uint8_t  CANSend(CAN_HandleTypeDef *hcan,uint32_t Source_ID,uint32_t IDE,uint32_t RTR,uint8_t* Datum,uint8_t DataLength)
{// 參數驗證if (!hcan || !Datum || (IDE != CAN_ID_STD && IDE != CAN_ID_EXT) || DataLength > CAN_MAX_DATA_LENGTH) {return 0;}CAN_TxHeaderTypeDef TXHeader;  uint32_t pTxMailbox = 0;if (IDE == CAN_ID_STD) {TXHeader.StdId = Source_ID;} else {TXHeader.ExtId = Source_ID;               }TXHeader.IDE = IDE;TXHeader.DLC = DataLength;TXHeader.RTR = RTR;TXHeader.TransmitGlobalTime = DISABLE;HAL_StatusTypeDef status = HAL_CAN_AddTxMessage(hcan, &TXHeader, Datum, &pTxMailbox);if (status == HAL_OK) {return 1;  // 返回1表示成功} else {return 0;  // 返回0表示失敗}		
}/* USER CODE BEGIN mapping_function */
int  cc =0;
// 示例的回調函數
void handle_ID_0x01(uint8_t *data) {// 對于ID 0x01的處理代碼cc=1;
}void handle_ID_0x02(uint8_t *data) {// 對于ID 0x02的處理代碼cc=2;
}
void handle_ID_0x12345678(uint8_t *data) {// 對于ID 0x02的處理代碼cc=4;
}
// 初始化映射表
CAN_CallbackMapType callbackMap[] = {{0x01, CAN_ID_STD, handle_ID_0x01},{0x02, CAN_ID_STD, handle_ID_0x02},// 添加一個擴展ID的例子{0x12345678, CAN_ID_EXT, handle_ID_0x12345678}  
};/* USER CODE mapping_function */
const uint8_t mapSize = sizeof(callbackMap) / sizeof(CAN_CallbackMapType);void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) 
{if(hcan->Instance == CAN1) {// 獲取數據CAN_RxHeaderTypeDef RXHeader;uint8_t RXmessage[8];  // 確保這里的數組大小正確if(HAL_CAN_GetRxMessage(hcan, CAN_FILTER_FIFO0, &RXHeader, RXmessage) == HAL_OK) {for(uint8_t i = 0; i < mapSize; i++) {if(RXHeader.IDE == callbackMap[i].idType && (RXHeader.IDE == CAN_ID_STD && RXHeader.StdId == callbackMap[i].id || RXHeader.IDE == CAN_ID_EXT && RXHeader.ExtId == callbackMap[i].id) && callbackMap[i].callback) {callbackMap[i].callback(RXmessage);break;}}}}
}

二、如何使用

發送函數可以直接調用。

uint8_t TXmessage[8] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77};
CANSend(&hcan,0x12,CAN_ID_STD,CAN_RTR_DATA,TXmessage,8);

接收函數的回調函數不需要進行修改,當有任務需要處理的時候先寫任務處理的回調函數也就是示例代碼中的void handle_ID_0x01(uint8_t *data)之類的。
然后再進行初始化映射CAN_CallbackMapType callbackMap[]
所以只需要在/* USER CODE BEGIN mapping_function */之間修改函數即可。其他的不需要更改。


總結

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

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

相關文章

2023年國賽數學建模思路 - 案例:異常檢測

文章目錄 賽題思路一、簡介 -- 關于異常檢測異常檢測監督學習 二、異常檢測算法2. 箱線圖分析3. 基于距離/密度4. 基于劃分思想 建模資料 賽題思路 &#xff08;賽題出來以后第一時間在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 一、簡介 – 關于異常…

軟考高級之系統架構師之數據通信與計算機網絡

概念 OSPF 在劃分區域之后&#xff0c;OSPF網絡中的非主干區域中的路由器對于到外部網絡的路由&#xff0c;一定要通過ABR(區域邊界路由器)來轉發&#xff0c;既然如此&#xff0c;對于區域內的路由器來說&#xff0c;就沒有必要知道通往外部網絡的詳細路由&#xff0c;只要由…

保持城市天際線(力扣)貪心 JAVA

給你一座由 n x n 個街區組成的城市&#xff0c;每個街區都包含一座立方體建筑。給你一個下標從 0 開始的 n x n 整數矩陣 grid &#xff0c;其中 grid[r][c] 表示坐落于 r 行 c 列的建筑物的 高度 。 城市的 天際線 是從遠處觀察城市時&#xff0c;所有建筑物形成的外部輪廓。…

html2canvas生成圖片地址Base64格式轉成blob在轉成file(二進制)可正常發送(保姆教程,復制粘貼可用)

開始: 最終結果: 1. html2canvas方法生成的圖片地址已Base64編碼形式放在img標簽src中可直接展示生成的圖片(注意頁面標簽獲取位置,還有個setTimeout頁面渲染需要時間) setTimeout(function () {var result {};v…

Python 使用Hadoop 3 之HDFS 總結

Hadoop 概述 Hadoop 是一個由Apache 軟件基金會開發的分布式基礎架構。用戶可以在不了解分布式底層細節的情況下&#xff0c;開發分布式程序&#xff0c;充分利用集群的威力進行高速運算和存儲。 Hadoop 實現一個分布式文件系統&#xff08;Hadoop Distributed File Sy…

Python爬蟲——selenium_交互

交互&#xff1a; 點擊&#xff1a;button.click() 輸入&#xff1a;inputs.send_keys() 后退操作&#xff1a;browser.back() 前進操作&#xff1a;browser.forword() 模擬js滾動&#xff1a;browser. js_bottom document.documentElement.scrollTop100000 browser.execute_…

將本地項目上傳至gitee的詳細步驟

將本地項目上傳至gitee的詳細步驟 1.在gitee上創建以自己項目名稱命名的空項目2.進入想上傳的項目的文件夾&#xff0c;然后右鍵點擊3. 初始化本地環境&#xff0c;把該項目變成可被git管理的倉庫4.添加該項目下的所有文件5.使用如下命令將文件添加到倉庫中去6.將本地代碼庫與遠…

Stable Diffusion 插件開發基礎講解

近來Stable diffusion擴散網絡大熱,跟上時代,簡單的文生圖,圖生圖,其實可以滿足絕大多數設計師的應用,但是有什么是賽博畫手無法做到的呢? 那就是他們使用到的stable diffusion的插件開發,他們并不清楚stable diffusino的代碼結構,如果遇到一些代碼層面的報錯問題,他們…

生信豆芽菜-單基因KM曲線

網址&#xff1a;http://www.sxdyc.com/panCancerKMCurve 該工具主要用于查看單基因在泛癌組織中&#xff0c;高低表達的預后情況&#xff0c;這里可以選擇合適的截斷值&#xff0c;比如最佳截斷&#xff0c;中位值&#xff0c;平均值&#xff0c;當然也可以自己輸入&#xff0…

基于長短期神經網絡的客流量預測,基于長短期神經網絡的超短期客流量預測,lstm詳細原理

目錄 背影 摘要 LSTM的基本定義 LSTM實現的步驟 基于長短期神經網絡LSTM的客流量預測 完整代碼: 基于長短期神經網絡LSTM的公交站客流量預測資源-CSDN文庫 https://download.csdn.net/download/abc991835105/88184734 效果圖 結果分析 展望 參考論文 背影 碳排放越來越受到重…

java將字符串中文轉為拼音

可以使用第三方庫來實現中文轉拼音的功能&#xff0c;比如使用pinyin4j這個庫。 首先&#xff0c;需要將pinyin4j庫添加到項目的依賴中。可以通過Maven或者Gradle來添加依賴。 對于Maven&#xff0c;可以在pom.xml文件中添加以下代碼&#xff1a; <dependency><group…

原生信息流廣告特點,如何幫APP開發者增加變現收益?

簡單來說&#xff1a;原生廣告&#xff0c;就是把廣告片和賬號&#xff0c;一起用消耗推流的買量模式&#xff0c;一同投放出去。 用戶看到的廣告/內容&#xff0c;與原生視頻沒有差別——用戶可以點頭像關注、也可以查看賬號歷史信息。原生廣告本質&#xff0c;是顯得真實、原…

聊一聊Sentinel背后的原理

Sentinel簡介 Sentinel是阿里開源的一款面向分布式、多語言異構化服務架構的流量治理組件。 主要以流量為切入點&#xff0c;從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。 上面兩句話來自Sentin…

Android自定義側滑Item

源碼地址&#xff1a;https://github.com/LanSeLianMa/CustomizeView/tree/master/cehuaitem 使用方式一&#xff1a;XML布局中直接使用 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com…

Python爬蟲 爬取圖片

在我們日常上網瀏覽網頁的時候&#xff0c;經常會看到一些好看的圖片&#xff0c;我們就希望把這些圖片保存下載&#xff0c;或者用戶用來做桌面壁紙&#xff0c;或者用來做設計的素材。 我們最常規的做法就是通過鼠標右鍵&#xff0c;選擇另存為。但有些圖片鼠標右鍵的時候并沒…

CVPR 2023 | 用戶可控的條件圖像到視頻生成方法(基于Diffusion)

注1:本文系“計算機視覺/三維重建論文速遞”系列之一&#xff0c;致力于簡潔清晰完整地介紹、解讀計算機視覺&#xff0c;特別是三維重建領域最新的頂會/頂刊論文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, NeurIPS, ICLR, ICML, TPAMI, IJCV 等)。 本次介紹的論…

使用chatGPT-4 暢聊量子物理學(二)

Omer 量子力學的主導哲學或模型或解釋是什么&#xff1f; ChatGPT 量子力學是一門描述微觀世界中粒子行為的物理學理論&#xff0c;但它的解釋和哲學觀點在學術界存在多種不同的觀點和爭議。以下是幾種主要的哲學觀點或解釋&#xff1a; 哥本哈根解釋&#xff1a;這是最為廣泛…

Windows 11清除無效、回收站、過期、緩存、補丁更新文件

Windows 11與之前的Windows版本類似&#xff0c;也需要定期清理無效、垃圾、過期、緩存文件來保持系統性能和存儲空間的優化。以下是在Windows 11中進行這些清理操作的一些建議方法&#xff1a; 磁盤清理工具 Windows 11內置了磁盤清理工具&#xff0c;可以幫助你刪除臨時文件…

Node.js學習筆記-03

七、網絡編程 1. 構建 TCP 服務 TCP 是面向連接的協議&#xff0c;顯著特征 在傳輸之前需要3次握手形成會話。 客戶端 ——請求連接——> 服務器端 ——響應——> 客戶端 ——開始傳輸——> 服務器端。 2. 構建 UDP 服務 3. 構建 HTTP 服務 http模塊 在node中HTT…