准备测试

This commit is contained in:
Robofish 2025-08-28 21:38:12 +08:00
parent 006ee185e9
commit d61dfa3634
5 changed files with 55 additions and 44 deletions

View File

@ -481,10 +481,11 @@ class bsp_can(BspPeripheralBase):
f" can{can_num}_filter.FilterFIFOAssignment = {fifo_assignment};", f" can{can_num}_filter.FilterFIFOAssignment = {fifo_assignment};",
f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);", f" HAL_CAN_ConfigFilter(&hcan{can_num}, &can{can_num}_filter);",
f" HAL_CAN_Start(&hcan{can_num});", f" HAL_CAN_Start(&hcan{can_num});",
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册回调函数", f" // 注册{instance}回调函数",
f" BSP_CAN_RegisterCallback({self.enum_prefix}_{name}, HAL_CAN_RX_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifoCallback);", 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" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;",
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
f" HAL_CAN_Start(&hcan1);", f" HAL_CAN_Start(&hcan1);",
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册CAN1回调函数", f" // 注册CAN1回调函数",
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_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 name, instance = can2_config
init_lines.extend([ init_lines.extend([
f" // 初始化 CAN2 - 使用 FIFO1", f" // 初始化 CAN2 - 使用 FIFO1",
f" CAN_FilterTypeDef can2_filter = {{0}};", f" can1_filter.FilterBank = 14;",
f" can2_filter.FilterBank = 14;", f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO1;",
f" can2_filter.FilterIdHigh = 0;", f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
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" HAL_CAN_Start(&hcan2);", f" HAL_CAN_Start(&hcan2);",
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册CAN2回调函数", 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,10 +559,11 @@ class bsp_can(BspPeripheralBase):
f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;", f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;",
f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);", f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter);",
f" HAL_CAN_Start(&hcan1);", f" HAL_CAN_Start(&hcan1);",
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册CAN1回调函数", f" // 注册CAN1回调函数",
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_FIFO0_MSG_PENDING_CB, BSP_CAN_RxFifo0Callback);",
"",
f" HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);",
"" ""
]) ])
@ -577,22 +572,14 @@ class bsp_can(BspPeripheralBase):
name, instance = can2_config name, instance = can2_config
init_lines.extend([ init_lines.extend([
f" // 初始化 CAN2 - 使用 FIFO0", f" // 初始化 CAN2 - 使用 FIFO0",
f" CAN_FilterTypeDef can2_filter = {{0}};", f" can1_filter.FilterBank = 14;",
f" can2_filter.FilterBank = 14;", f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO0;",
f" can2_filter.FilterIdHigh = 0;", f" HAL_CAN_ConfigFilter(&hcan2, &can1_filter); // 通过 CAN1 配置",
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" HAL_CAN_Start(&hcan2);", f" HAL_CAN_Start(&hcan2);",
f" HAL_CAN_ActivateNotification(&hcan2, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册CAN2回调函数", 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_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)) can_num = ''.join(filter(str.isdigit, instance))
init_lines.extend([ init_lines.extend([
f" // 初始化 {instance} - 使用 FIFO1", f" // 初始化 {instance} - 使用 FIFO1",
f" CAN_FilterTypeDef can{can_num}_filter = {{0}};", f" can1_filter.FilterBank = {filter_bank};",
f" can{can_num}_filter.FilterBank = {filter_bank};", f" can1_filter.FilterFIFOAssignment = CAN_RX_FIFO1;",
f" can{can_num}_filter.FilterIdHigh = 0;", f" HAL_CAN_ConfigFilter(&hcan1, &can1_filter); // 通过 CAN1 配置",
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" HAL_CAN_Start(&hcan{can_num});", f" HAL_CAN_Start(&hcan{can_num});",
f" HAL_CAN_ActivateNotification(&hcan{can_num}, CAN_IT_RX_FIFO0_MSG_PENDING);",
"", "",
f" // 注册{instance}回调函数", 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分配不同的过滤器组 filter_bank += 1 # 为下一个CAN分配不同的过滤器组

BIN
assets/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -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 --------------------------------------------------- */ /* HAL Callback Functions --------------------------------------------------- */
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) { void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan) {
BSP_CAN_t bsp_can = CAN_Get(hcan); BSP_CAN_t bsp_can = CAN_Get(hcan);