diff --git a/app/code_page/bsp_interface.py b/app/code_page/bsp_interface.py index 83848d5..6b84b8b 100644 --- a/app/code_page/bsp_interface.py +++ b/app/code_page/bsp_interface.py @@ -481,10 +481,11 @@ class bsp_can(BspPeripheralBase): f" can{can_num}_filter.FilterFIFOAssignment = {fifo_assignment};", f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);", f" HAL_CAN_Start(&hcan{can_num});", - f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);", "", - f" // 注册回调函数", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifoCallback);", + f" // 注册{instance}回调函数", + f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + "", + f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);", "" ]) @@ -511,10 +512,11 @@ class bsp_can(BspPeripheralBase): f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_Start(&hcan1);", - f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);", "", f" // 注册CAN1回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + "", + f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);", "" ]) @@ -522,22 +524,14 @@ class bsp_can(BspPeripheralBase): name, instance = can2_config init_lines.extend([ f" // 初始化 CAN2 - 使用 FIFO1", - f" CAN_FilterTypeDef can2_filter = {{0}};", - f" can2_filter.FilterBank = 14;", - f" can2_filter.FilterIdHigh = 0;", - f" can2_filter.FilterIdLow = 0;", - f" can2_filter.FilterMode = CAN_FILTERMODE_IDMASK;", - f" can2_filter.FilterScale = CAN_FILTERSCALE_32BIT;", - f" can2_filter.FilterMaskIdHigh = 0;", - f" can2_filter.FilterMaskIdLow = 0;", - f" can2_filter.FilterActivation = ENABLE;", - f" can2_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", - f" HAL_CAN_ConfigFilter(&hcan1, &can2_filter); // 通过 CAN1 配置", + f" can1_filter.FilterBank = 14;", + f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO1;", + f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan2);", - f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);", "", f" // 注册CAN2回调函数", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);", + f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO1_MSG_PENDING);", "" ]) @@ -565,34 +559,27 @@ class bsp_can(BspPeripheralBase): f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_Start(&hcan1);", - f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);", "", f" // 注册CAN1回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + "", + f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);", "" ]) - # CAN2 - FIFO0 + # CAN2 - FIFO0 if can2_config: name, instance = can2_config init_lines.extend([ f" // 初始化 CAN2 - 使用 FIFO0", - f" CAN_FilterTypeDef can2_filter = {{0}};", - f" can2_filter.FilterBank = 14;", - f" can2_filter.FilterIdHigh = 0;", - f" can2_filter.FilterIdLow = 0;", - f" can2_filter.FilterMode = CAN_FILTERMODE_IDMASK;", - f" can2_filter.FilterScale = CAN_FILTERSCALE_32BIT;", - f" can2_filter.FilterMaskIdHigh = 0;", - f" can2_filter.FilterMaskIdLow = 0;", - f" can2_filter.FilterActivation = ENABLE;", - f" can2_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", - f" HAL_CAN_ConfigFilter(&hcan1, &can2_filter); // 通过 CAN1 配置", + f" can1_filter.FilterBank = 14;", + f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", + f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan2);", - f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);", "", f" // 注册CAN2回调函数", f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);", "" ]) @@ -603,22 +590,14 @@ class bsp_can(BspPeripheralBase): can_num = ''.join(filter(str.isdigit, instance)) init_lines.extend([ f" // 初始化 {instance} - 使用 FIFO1", - f" CAN_FilterTypeDef can{can_num}_filter = {{0}};", - f" can{can_num}_filter.FilterBank = {filter_bank};", - f" can{can_num}_filter.FilterIdHigh = 0;", - f" can{can_num}_filter.FilterIdLow = 0;", - f" can{can_num}_filter.FilterMode = CAN_FILTERMODE_IDMASK;", - f" can{can_num}_filter.FilterScale = CAN_FILTERSCALE_32BIT;", - f" can{can_num}_filter.FilterMaskIdHigh = 0;", - f" can{can_num}_filter.FilterMaskIdLow = 0;", - f" can{can_num}_filter.FilterActivation = ENABLE;", - f" can{can_num}_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", - f" HAL_CAN_ConfigFilter(&hcan1, &can{can_num}_filter); // 通过 CAN1 配置", + f" can1_filter.FilterBank = {filter_bank};", + f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO1;", + f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter); // 通过 CAN1 配置", f" HAL_CAN_Start(&hcan{can_num});", - f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);", "", f" // 注册{instance}回调函数", - f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);", + f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO1_MSG_PENDING_CB, BSP_CAN_RxFifo1Callback);", + f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO1_MSG_PENDING);", "" ]) filter_bank += 1 # 为下一个CAN分配不同的过滤器组 diff --git a/assets/.DS_Store b/assets/.DS_Store index 2e7fb4d..739f81d 100644 Binary files a/assets/.DS_Store and b/assets/.DS_Store differ diff --git a/assets/User_code.zip b/assets/User_code.zip deleted file mode 100644 index bbd40f7..0000000 Binary files a/assets/User_code.zip and /dev/null differ diff --git a/assets/User_code/.DS_Store b/assets/User_code/.DS_Store index 087482c..ee966f4 100644 Binary files a/assets/User_code/.DS_Store and b/assets/User_code/.DS_Store differ diff --git a/assets/User_code/bsp/can.c b/assets/User_code/bsp/can.c index e7a4a64..91cf3a3 100644 --- a/assets/User_code/bsp/can.c +++ b/assets/User_code/bsp/can.c @@ -176,6 +176,38 @@ static void BSP_CAN_RxFifo0Callback(void) { } } +/** + * @brief FIFO1接收处理函数 + */ +static void BSP_CAN_RxFifo1Callback(void) { + CAN_RxHeaderTypeDef rx_header; + uint8_t rx_data[BSP_CAN_MAX_DLC]; + for (int can_idx = 0; can_idx < BSP_CAN_NUM; can_idx++) { + CAN_HandleTypeDef *hcan = BSP_CAN_GetHandle((BSP_CAN_t)can_idx); + if (hcan == NULL) continue; + while (HAL_CAN_GetRxFifoFillLevel(hcan, CAN_RX_FIFO1) > 0) { + if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &rx_header, rx_data) == HAL_OK) { + uint32_t original_id = (rx_header.IDE == CAN_ID_STD) ? rx_header.StdId : rx_header.ExtId; + BSP_CAN_FrameType_t frame_type = BSP_CAN_GetFrameType(&rx_header); + uint32_t parsed_id = BSP_CAN_ParseId(original_id, frame_type); + osMessageQueueId_t queue = BSP_CAN_FindQueue((BSP_CAN_t)can_idx, parsed_id); + if (queue != NULL) { + BSP_CAN_Message_t msg = {0}; + msg.frame_type = frame_type; + msg.original_id = original_id; + msg.parsed_id = parsed_id; + msg.dlc = rx_header.DLC; + if (rx_header.RTR == CAN_RTR_DATA) { + memcpy(msg.data, rx_data, rx_header.DLC); + } + msg.timestamp = HAL_GetTick(); + osMessageQueuePut(queue, &msg, 0, BSP_CAN_TIMEOUT_IMMEDIATE); + } + } + } + } +} + /* HAL Callback Functions --------------------------------------------------- */ void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { BSP_CAN_t bsp_can = CAN_Get(hcan);