/* ============================================================================= * can_task.c - CAN_Task 强定义:全部硬件层初始化 + 蓝灯自检 * 顺序: led_init(蓝灯常亮=调度器/任务栈正常的证据) -> buzzer_init -> * MX_USB_DEVICE_Init -> can_start -> 电机/发射/板间通讯初始化 -> * 串口初始化 -> app_ready=1(其余任务在此之前的 while 等待) * 注意: 本文件双板共用,板差异用 ROBOT_TYPE 宏条件编译 * ========================================================================== */ #include "app_tasks.h" #include "cmsis_os.h" #include "bsp_can.h" #include "bsp_usart.h" #include "usb_device.h" #include "c_comm.h" #include "led.h" #include "buzzer.h" #if defined(ROBOT_TYPE_GIMBAL) #include "gimbal.h" #include "shoot.h" #elif defined(ROBOT_TYPE_CHASSIS) #include "chassis.h" #endif volatile uint8_t app_ready = 0; volatile uint32_t dbg_can_loop = 0; // 诊断:CAN_Task 循环计数 static uint8_t dr16_rx_buf[36]; // DR16 单帧 18 字节,缓冲放大一倍防止帧粘连 static uint8_t referee_rx_buf[128]; // 裁判系统变长帧缓冲 /* CAN_Task:完成全部硬件层初始化后置 app_ready,其余任务等待该标志 * 蓝灯常亮 = 本任务正在初始化(调度器与任务栈正常的最直观证据) */ void CAN_Task(void const * argument) { led_init(); buzzer_init(); led_set_blue(1); MX_USB_DEVICE_Init(); can_start(); // CAN 过滤器/启动/中断 #if defined(ROBOT_TYPE_GIMBAL) gimbal_motor_init(); // 电机实例与 CAN 回调注册 shoot_init(); c_comm_init(); // 板间通讯回调注册 usart3_init(dr16_rx_buf, 36, dr16_frame_callback); // DR16 遥控器 usart6_init(referee_rx_buf, 128, referee_frame_callback); // 图传链路(0x0304) usart1_tx_dma_init(); // 视觉串口发送 DMA(TODO:视觉自瞄) #elif defined(ROBOT_TYPE_CHASSIS) chassis_motor_init(); // 电机实例与 CAN 回调注册 c_comm_init(); usart6_init(referee_rx_buf, 128, referee_frame_callback); // 裁判系统(0x0201/0x0202) #endif app_ready = 1; for (;;) { dbg_can_loop++; osDelay(1000); } }