1. 摘要
本篇筆記主要介紹,在STM32H743芯片上實現CAN通信,封裝為BSP驅動,為之后實現CAN的高層通信打下基礎。
2. 準備工作
1, IAR 8.32.1
2, STM32Cube_FW_H7_V1.6.0
3. 簡介
STM32H743的控制器局域網絡 (CAN) 子系統由兩個 CAN 模塊、一個共享消息 RAM 存儲器和一個時鐘校準單元組成。關于這四個組成部分的基址,請參見存儲器映射。兩個 CAN 模塊(FDCAN1 和 FDCAN2)均符合 ISO 11898-1: 2015(CAN 協議規范第 2.0 版A、 B 部分)和 CAN FD 協議規范第 1.0 版。此外,第一個 CAN 模塊 FDCAN1 支持 ISO 11898-4 中規定的時間觸發 CAN (TTCAN),包括事件同步時間觸發通信、全局系統時間和時鐘漂移補償。FDCAN1 還額外包含專供時間觸發功能使用的寄存器。CAN FD 選項可與事件觸發和時間觸發 CAN 通信一起使用。10 KB 的消息 RAM 存儲器可實現過濾器、接收 FIFO、接收緩沖區、發送事件 FIFO、發送緩沖器( TTCAN 觸發)功能。該消息 RAM 在 FDCAN1 和 FDCAN2 模塊之間共用。通用時鐘校準單元是可選的。通過評估 FDCAN1 接收到的 CAN 消息,該單元可基于 HSI 內部 RC 振蕩器和 PLL 為 FDCAN1 和 FDCAN2 生成經過校準的時鐘。
CAN 框圖
CAN的底層大部分ST已經在HAL庫里面封裝好,如果你細看HAL源碼,搞懂這張圖,H743的CAN 你基本上就沒有問題了,在結合HAL庫的學習。
4. 驅動實現
良好的驅動封裝,可以方便應用開發,并且可以容易移植到其他項目,代碼重用率高,所以數據和接口是你不得不考慮的問題,怎么樣方便的實現,還要通用易用。
4.1 數據封裝
首先根據stm32h7xx_hal_fdcan.h文件我們來封裝兩個個結構體,方便后面軟件實現開發,可以新建bsp_can.c和bsp_can.h, 在頭文件中封裝結構體定義。
在.c文件中定義封裝一些變量,這些變量數組也是通用,在多款產品中都采用,大家也可以參照。
可以實現多個CAN口驅動。如果只有一個CAN口,將CAN_PORTS宏定義為1,幾個就定義為幾。
這個封裝大家可以記著,我在多款器件上都是這么封裝的,之前在NXP的KE06, KEA, KV46, K64等系列,在ST的F103, F446, H743等等CAN通信都采用這種封裝BSP驅動。
4.2 初始化
參考官方的例程,根據自己的硬件去實現,做相應修改。例程中只使能了接收中斷,我們一般發送也要采用中斷,所以也要開發送中斷,根據實際可能還需要添加濾波,配置緩沖等。
配置時鐘管腳,中斷。
4.3 中斷回調函數
最主要的就是接收和發送的回調函數的實現,首先來看接收中斷回調函數。
發送完成回調函數
4.4 測試代碼
在freeRTOS下建立一個CAN通信的簡單測試任務,實現收到什么在發送出去。
在10ms的任務里去調用這個測試函數,實現收發測試。
測試的可以這樣寫,正式的我們需要解析收到的內容,并且重新組織發送的幀,這些解析和重組我們將會在高層的協議驅動文件中實現,有了這個驅動就可以實現CANopen, J1939, DeviceNet等CAN的高層協議了。
5. 測試
測試,擴展幀,500k 位速率,發送數據 aa,01,02,03,04,05,06,bb。板卡收到電腦發送的數據后,回送給電腦。發送100000次, 10ms一次。使用USB-CAN連接到電腦端測試。
至此我們的CAN通信BSP驅動封裝就驗證完成,可以輕松移植到其他板卡上。關注我,為您帶來更多精彩內容
-
CAN通信
+關注
關注
5文章
94瀏覽量
17923
原文標題:CAN通信之BSP封裝
文章出處:【微信號:gccanzx,微信公眾號:廣成工控】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論