99 lines
3.7 KiB
C
99 lines
3.7 KiB
C
/*
|
||
blink Task
|
||
|
||
*/
|
||
|
||
/* Includes ----------------------------------------------------------------- */
|
||
#include "task/user_task.h"
|
||
/* USER INCLUDE BEGIN */
|
||
|
||
#include "bsp/bsp.h"
|
||
#include "bsp/fdcan.h"
|
||
// #include "bsp/pwm.h"
|
||
#include "bsp/bsp_can.h"
|
||
#include <math.h>
|
||
/* USER INCLUDE END */
|
||
|
||
/* Private typedef ---------------------------------------------------------- */
|
||
/* Private define ----------------------------------------------------------- */
|
||
/* Private macro ------------------------------------------------------------ */
|
||
/* Private variables -------------------------------------------------------- */
|
||
/* USER STRUCT BEGIN */
|
||
BSP_FDCAN_Message_t msg;
|
||
/* USER STRUCT END */
|
||
|
||
/* Private function --------------------------------------------------------- */
|
||
void can_rx_callback(bsp_can_t can, uint32_t id, uint8_t *data, void *arg) {
|
||
// 这里可以打印、断点或设置标志位
|
||
}
|
||
/* 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);
|
||
|
||
// bsp_can_init();
|
||
|
||
// bsp_can_register_callback(BSP_CAN_1, CAN_RX_MSG_CALLBACK, can_rx_callback, NULL);
|
||
|
||
/* 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);
|
||
// uint8_t tx_data[8] = {1,2,3,4,5,6,7,8};
|
||
// bsp_can_trans_packet(BSP_CAN_1, CAN_FORMAT_STD, 0x123, tx_data);
|
||
// 测试:向三路 CAN 周期性发送电机控制帧(示例数据),并轮询接收
|
||
{
|
||
uint8_t data1[8] = {0xA1, 0x01, 0x34, 0x12, 0x10, 0x00, 0x00, 0x00};
|
||
uint8_t data2[8] = {0xA1, 0x02, 0x78, 0x56, 0x20, 0x00, 0x00, 0x00};
|
||
uint8_t data3[8] = {0xA1, 0x03, 0x00, 0x01, 0x30, 0x00, 0x00, 0x00};
|
||
|
||
// 简单 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, 8);
|
||
|
||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_1, 0x101, &msg, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||
}
|
||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_2, 0x102, &msg, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||
}
|
||
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
|
||
}
|
||
}
|
||
// osDelay(10);
|
||
/* USER CODE END */
|
||
osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */
|
||
}
|
||
|
||
}
|