From e3f59518813d885bac04c33209528f4c1852d161 Mon Sep 17 00:00:00 2001 From: TuxMonkey <8196772+tuxmonkey@user.noreply.gitee.com> Date: Mon, 9 Mar 2026 18:28:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=90=97=EF=BC=9F?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=EF=BC=8C=E5=BE=88=E9=9A=BE=E7=9A=84=E5=95=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/stm32h7xx_it.h | 3 ++ Core/Src/fdcan.c | 9 ++++++ Core/Src/freertos.c | 14 ++------- Core/Src/stm32h7xx_it.c | 42 +++++++++++++++++++++++++ TronOneH7_Scaffold.ioc | 3 ++ User_Code/bsp/fdcan/bsp_fdcan.c | 11 +++++-- User_Code/user_task/dev_tasks/dev_cmd.c | 2 +- 7 files changed, 68 insertions(+), 16 deletions(-) diff --git a/Core/Inc/stm32h7xx_it.h b/Core/Inc/stm32h7xx_it.h index d81a194..61d1fc7 100644 --- a/Core/Inc/stm32h7xx_it.h +++ b/Core/Inc/stm32h7xx_it.h @@ -62,6 +62,8 @@ void DMA1_Stream6_IRQHandler(void); void ADC_IRQHandler(void); void FDCAN1_IT0_IRQHandler(void); void FDCAN2_IT0_IRQHandler(void); +void FDCAN1_IT1_IRQHandler(void); +void FDCAN2_IT1_IRQHandler(void); void SPI1_IRQHandler(void); void SPI2_IRQHandler(void); void USART1_IRQHandler(void); @@ -80,6 +82,7 @@ void OTG_HS_IRQHandler(void); void UART7_IRQHandler(void); void USART10_IRQHandler(void); void FDCAN3_IT0_IRQHandler(void); +void FDCAN3_IT1_IRQHandler(void); void TIM23_IRQHandler(void); /* USER CODE BEGIN EFP */ diff --git a/Core/Src/fdcan.c b/Core/Src/fdcan.c index fbf8cbd..c5df5d1 100644 --- a/Core/Src/fdcan.c +++ b/Core/Src/fdcan.c @@ -216,6 +216,8 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN1 interrupt Init */ HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn); + HAL_NVIC_SetPriority(FDCAN1_IT1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(FDCAN1_IT1_IRQn); /* USER CODE BEGIN FDCAN1_MspInit 1 */ /* USER CODE END FDCAN1_MspInit 1 */ @@ -256,6 +258,8 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN2 interrupt Init */ HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn); + HAL_NVIC_SetPriority(FDCAN2_IT1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(FDCAN2_IT1_IRQn); /* USER CODE BEGIN FDCAN2_MspInit 1 */ /* USER CODE END FDCAN2_MspInit 1 */ @@ -296,6 +300,8 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN3 interrupt Init */ HAL_NVIC_SetPriority(FDCAN3_IT0_IRQn, 5, 0); HAL_NVIC_EnableIRQ(FDCAN3_IT0_IRQn); + HAL_NVIC_SetPriority(FDCAN3_IT1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(FDCAN3_IT1_IRQn); /* USER CODE BEGIN FDCAN3_MspInit 1 */ /* USER CODE END FDCAN3_MspInit 1 */ @@ -324,6 +330,7 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN1 interrupt Deinit */ HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn); + HAL_NVIC_DisableIRQ(FDCAN1_IT1_IRQn); /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ /* USER CODE END FDCAN1_MspDeInit 1 */ @@ -347,6 +354,7 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN2 interrupt Deinit */ HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn); + HAL_NVIC_DisableIRQ(FDCAN2_IT1_IRQn); /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ /* USER CODE END FDCAN2_MspDeInit 1 */ @@ -370,6 +378,7 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) /* FDCAN3 interrupt Deinit */ HAL_NVIC_DisableIRQ(FDCAN3_IT0_IRQn); + HAL_NVIC_DisableIRQ(FDCAN3_IT1_IRQn); /* USER CODE BEGIN FDCAN3_MspDeInit 1 */ /* USER CODE END FDCAN3_MspDeInit 1 */ diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 947c14f..9539c9d 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -151,30 +151,20 @@ void StartDaemonTask(void *argument); // <--- 新的,带参数的标准 RTOS /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); - void ShootTask(void *argument); - void GimbalTask(void *argument); - void ChassisTask(void *argument); - void StartInitTask(void *argument); - void VisionTask(void *argument); - void CmdTask(void *argument); - void RefereeTask(void *argument); - extern void ws2812Task(void *argument); extern void MX_USB_DEVICE_Init(void); - void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* Hook prototypes */ void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName); - void vApplicationMallocFailedHook(void); /* USER CODE BEGIN 4 */ @@ -209,8 +199,7 @@ void vApplicationMallocFailedHook(void) * @param None * @retval None */ -void MX_FREERTOS_Init(void) -{ +void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ /* USER CODE END Init */ @@ -273,6 +262,7 @@ void MX_FREERTOS_Init(void) /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ /* USER CODE END RTOS_EVENTS */ + } /* USER CODE BEGIN Header_StartDefaultTask */ diff --git a/Core/Src/stm32h7xx_it.c b/Core/Src/stm32h7xx_it.c index b7fb098..f306e9e 100644 --- a/Core/Src/stm32h7xx_it.c +++ b/Core/Src/stm32h7xx_it.c @@ -327,6 +327,34 @@ void FDCAN2_IT0_IRQHandler(void) /* USER CODE END FDCAN2_IT0_IRQn 1 */ } +/** + * @brief This function handles FDCAN1 interrupt 1. + */ +void FDCAN1_IT1_IRQHandler(void) +{ + /* USER CODE BEGIN FDCAN1_IT1_IRQn 0 */ + + /* USER CODE END FDCAN1_IT1_IRQn 0 */ + HAL_FDCAN_IRQHandler(&hfdcan1); + /* USER CODE BEGIN FDCAN1_IT1_IRQn 1 */ + + /* USER CODE END FDCAN1_IT1_IRQn 1 */ +} + +/** + * @brief This function handles FDCAN2 interrupt 1. + */ +void FDCAN2_IT1_IRQHandler(void) +{ + /* USER CODE BEGIN FDCAN2_IT1_IRQn 0 */ + + /* USER CODE END FDCAN2_IT1_IRQn 0 */ + HAL_FDCAN_IRQHandler(&hfdcan2); + /* USER CODE BEGIN FDCAN2_IT1_IRQn 1 */ + + /* USER CODE END FDCAN2_IT1_IRQn 1 */ +} + /** * @brief This function handles SPI1 global interrupt. */ @@ -579,6 +607,20 @@ void FDCAN3_IT0_IRQHandler(void) /* USER CODE END FDCAN3_IT0_IRQn 1 */ } +/** + * @brief This function handles FDCAN3 interrupt 1. + */ +void FDCAN3_IT1_IRQHandler(void) +{ + /* USER CODE BEGIN FDCAN3_IT1_IRQn 0 */ + + /* USER CODE END FDCAN3_IT1_IRQn 0 */ + HAL_FDCAN_IRQHandler(&hfdcan3); + /* USER CODE BEGIN FDCAN3_IT1_IRQn 1 */ + + /* USER CODE END FDCAN3_IT1_IRQn 1 */ +} + /** * @brief This function handles TIM23 global interrupt. */ diff --git a/TronOneH7_Scaffold.ioc b/TronOneH7_Scaffold.ioc index 0906964..5e02379 100644 --- a/TronOneH7_Scaffold.ioc +++ b/TronOneH7_Scaffold.ioc @@ -570,8 +570,11 @@ NVIC.DMA2_Stream6_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true NVIC.DMA2_Stream7_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.FDCAN1_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.FDCAN1_IT1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true NVIC.FDCAN2_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.FDCAN2_IT1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true NVIC.FDCAN3_IT0_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true +NVIC.FDCAN3_IT1_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false diff --git a/User_Code/bsp/fdcan/bsp_fdcan.c b/User_Code/bsp/fdcan/bsp_fdcan.c index 5a42404..fb4850b 100644 --- a/User_Code/bsp/fdcan/bsp_fdcan.c +++ b/User_Code/bsp/fdcan/bsp_fdcan.c @@ -78,7 +78,7 @@ static void CANAddFilter(FDCANInstance *_instance) fdcan_filter_conf.IsCalibrationMsg = 0; //fdcan_filter_conf.RxBufferIndex=0; - // ================== 【核心修复区】 ================== + // ================== 【核心修复区】 ==================@todo:有问题 我要验牌 // 1. 强制让 FDCAN 进入 INIT 模式,否则无法写入 Message RAM HAL_FDCAN_Stop(_instance->can_handle); @@ -87,9 +87,14 @@ static void CANAddFilter(FDCANInstance *_instance) // 3. 重新启动 FDCAN HAL_FDCAN_Start(_instance->can_handle); - // ==================================================== - HAL_FDCAN_ConfigFilter(_instance->can_handle, &fdcan_filter_conf); + // 4. 【救命稻草】HAL_FDCAN_Stop 关闭了所有中断,必须在这里重新激活! + uint32_t FDCAN_RXActiveITs = FDCAN_IT_RX_FIFO0_NEW_MESSAGE | FDCAN_IT_RX_FIFO0_FULL | + FDCAN_IT_RX_FIFO0_WATERMARK | FDCAN_IT_RX_FIFO0_MESSAGE_LOST | + FDCAN_IT_RX_FIFO1_NEW_MESSAGE | FDCAN_IT_RX_FIFO1_FULL | + FDCAN_IT_RX_FIFO1_WATERMARK | FDCAN_IT_RX_FIFO1_MESSAGE_LOST; + HAL_FDCAN_ActivateNotification(_instance->can_handle, FDCAN_RXActiveITs, 0); + // ==================================================== #else CAN_FilterTypeDef can_filter_conf; diff --git a/User_Code/user_task/dev_tasks/dev_cmd.c b/User_Code/user_task/dev_tasks/dev_cmd.c index c97cd43..11684c0 100644 --- a/User_Code/user_task/dev_tasks/dev_cmd.c +++ b/User_Code/user_task/dev_tasks/dev_cmd.c @@ -21,7 +21,7 @@ static XidiPowerMeter_Init_Config_s xidi_pm_config = { .can_config = { .can_handle = &hfdcan1, // 原来直接传的句柄,现在放进结构体里 .rx_id = 0x213, // 接收 ID - .tx_id = 0x001, // 发送 ID (不发送填0) + .tx_id = 0x000, // 发送 ID (不发送填0) }, .daemon_config = { .reload_count = 5, // 守护进程超时周期 (例如:5次没收到算离线)