#ifndef BSP_CAN_H #define BSP_CAN_H #include "stm32f4xx_hal.h" // clang-format off #define BOARD_DATA_ANY ((uint16_t)0x500) #define BOARD_DATA_UINT16 ((uint16_t)0x600) // clang-format on typedef CAN_HandleTypeDef hcan_t; typedef struct __CanCtrlData { hcan_t * hcan; CAN_TxHeaderTypeDef tx_header; uint8_t tx_data[8]; } CanCtrlData_s; /* CAN 接收回调:在 CAN RX0 中断上下文中执行,必须尽量短 */ typedef void (*can_rx_callback_f)(uint32_t std_id, const uint8_t rx_data[8], uint32_t dlc); extern hcan_t hcan1; extern hcan_t hcan2; /* 初始化过滤器并启动两路 CAN,同时使能 CAN1_RX0/CAN2_RX0 NVIC(ioc 未开 CAN2 中断,由代码补齐) * 必须在 osKernelStart 之后的任务上下文中调用一次 */ extern void can_start(void); /* 注册按 (hcan, 标准ID) 分发的接收回调,返回 0-成功,-1-表满 */ extern int can_rx_register(hcan_t * hcan, uint32_t std_id, can_rx_callback_f callback); extern void CAN_SendTxMessage(CanCtrlData_s * can_ctrl_data); #endif