/* blink Task */ /* Includes ----------------------------------------------------------------- */ #include "task/user_task.h" /* USER INCLUDE BEGIN */ #include "bsp/bsp.h" #include "bsp/fdcan.h" // #include "bsp/pwm.h" #include /* USER INCLUDE END */ /* Private typedef ---------------------------------------------------------- */ /* Private define ----------------------------------------------------------- */ /* Private macro ------------------------------------------------------------ */ /* Private variables -------------------------------------------------------- */ /* USER STRUCT BEGIN */ BSP_FDCAN_Message_t msg1={0}; BSP_FDCAN_Message_t msg2={0}; BSP_FDCAN_Message_t msg3={0}; /* USER STRUCT END */ float rxlevel=0; /* Private function --------------------------------------------------------- */ /* Exported functions ------------------------------------------------------- */ void Task_blink(void *argument) { (void)argument; /* 未使用argument,消除警告 */ /* 计算任务运行到指定频率需要等待的tick数 */ const uint32_t delay_tick = osKernelGetTickFreq() / BLINK_FREQ; osDelay(BLINK_INIT_DELAY); /* 延时一段时间再开启任务 */ uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ /* USER CODE INIT BEGIN */ // BSP_PWM_Stop(BSP_PWM_LED_R); // BSP_PWM_Stop(BSP_PWM_LED_B); // BSP_PWM_SetComp(BSP_PWM_LED_G, 0.0f); // BSP_PWM_Start(BSP_PWM_LED_G); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_15, GPIO_PIN_SET); BSP_FDCAN_Init(); // 注册要接收的 CAN ID(示例) BSP_FDCAN_RegisterId(BSP_FDCAN_1, 0x101, 8); BSP_FDCAN_RegisterId(BSP_FDCAN_2, 0x102, 8); BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x103, 8); /* USER CODE INIT END */ while (1) { tick += delay_tick; /* 计算下一个唤醒时刻 */ /* USER CODE BEGIN */ // 呼吸灯 - 基于tick的正弦波 // float duty = (sinf(tick * 0.003f) + 1.0f) * 0.5f; // 0到1之间的正弦波,加快频率 // BSP_PWM_SetComp(BSP_PWM_LED_G, duty); // 测试:向三路 CAN 周期性发送电机控制帧(示例数据),并轮询接收 { uint8_t data1[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint8_t data2[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; uint8_t data3[32] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20}; // 简单 CRC/校验(可选) data1[7] = data1[0] ^ data1[1] ^ data1[2]; data2[7] = data2[0] ^ data2[1] ^ data2[2]; // data3[7] = data3[0] ^ data3[1] ^ data3[2]; // 使用 BSP 封装的发送接口(非阻塞,若硬件 FIFO 满则内部入队) // BSP_FDCAN_Transmit(BSP_FDCAN_1, BSP_FDCAN_FORMAT_STD_DATA, 0x101, data1, 8); // BSP_FDCAN_Transmit(BSP_FDCAN_2, BSP_FDCAN_FORMAT_STD_DATA, 0x102, data2, 8); BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 13); if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg1, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } if (BSP_FDCAN_GetMessage(BSP_FDCAN_2, 0x102, &msg2, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) { } rxlevel=HAL_FDCAN_GetRxFifoFillLevel(BSP_FDCAN_GetHandle(BSP_FDCAN_2), FDCAN_RX_FIFO1); } // osDelay(10); /* USER CODE END */ osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ } }