想不到有啥好写法了,先全用BSP_FDCAN_MAX_DLC,BSP_FDCAN_MAX_DLC可以通过mr读ioc调整

This commit is contained in:
yxming66 2025-12-28 15:32:37 +08:00
parent 55153c98a0
commit 9f884a4f7e
2 changed files with 180 additions and 183 deletions

View File

@ -65,25 +65,21 @@ typedef struct BSP_FDCAN_QueueNode {
} BSP_FDCAN_QueueNode_t;
/* Private variables -------------------------------------------------------- */
//static BSP_FDCAN_QueueNode_t *queue_list = NULL;
//static osMutexId_t queue_mutex = NULL;
//static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
//static bool inited = false;
//static BSP_FDCAN_IdParser_t id_parser = NULL;
//static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
BSP_FDCAN_QueueNode_t *queue_list = NULL;
osMutexId_t queue_mutex = NULL;
void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
bool inited = false;
BSP_FDCAN_IdParser_t id_parser = NULL;
BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
static BSP_FDCAN_QueueNode_t *queue_list = NULL;
static osMutexId_t queue_mutex = NULL;
static void (*FDCAN_Callback[BSP_FDCAN_NUM][HAL_FDCAN_CB_NUM])(void);
static bool inited = false;
static BSP_FDCAN_IdParser_t id_parser = NULL;
static BSP_FDCAN_TxQueue_t tx_queues[BSP_FDCAN_NUM];
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
/* Private function prototypes ---------------------------------------------- */
static BSP_FDCAN_t FDCAN_Get(FDCAN_HandleTypeDef *hfdcan);
static osMessageQueueId_t BSP_FDCAN_FindQueue(BSP_FDCAN_t fdcan, uint32_t can_id);
static int8_t BSP_FDCAN_CreateIdQueue(BSP_FDCAN_t fdcan, uint32_t can_id, uint8_t queue_size);
static void BSP_FDCAN_RxFifo0Callback(void);
static void BSP_FDCAN_RxFifo1Callback(void);
// static void BSP_FDCAN_TxCompleteCallback(void);
static void BSP_FDCAN_TxCompleteCallback(void);
static BSP_FDCAN_FrameType_t BSP_FDCAN_GetFrameType(FDCAN_RxHeaderTypeDef *header);
static uint32_t BSP_FDCAN_DefaultIdParser(uint32_t original_id, BSP_FDCAN_FrameType_t frame_type);
static void BSP_FDCAN_TxQueueInit(BSP_FDCAN_t fdcan);
@ -210,7 +206,6 @@ static void BSP_FDCAN_TxCompleteCallback(void) {
}
}
}
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
static void BSP_FDCAN_RxFifo0Callback(void) {
FDCAN_RxHeaderTypeDef rx_header;
@ -246,7 +241,6 @@ static void BSP_FDCAN_RxFifo0Callback(void) {
static void BSP_FDCAN_RxFifo1Callback(void) {
FDCAN_RxHeaderTypeDef rx_header;
uint8_t rx_data[BSP_FDCAN_MAX_DLC];
static const uint8_t fdcan_dlc2len[16] = {0,1,2,3,4,5,6,7,8,12,16,20,24,32,48,64};
for (int fdcan_idx = 0; fdcan_idx < BSP_FDCAN_NUM; fdcan_idx++) {
FDCAN_HandleTypeDef *hfdcan = BSP_FDCAN_GetHandle((BSP_FDCAN_t)fdcan_idx);
if (hfdcan == NULL) continue;
@ -329,19 +323,16 @@ int8_t BSP_FDCAN_Init(void) {
if (inited) return BSP_ERR_INITED;
memset(FDCAN_Callback, 0, sizeof(FDCAN_Callback));
for (int i = 0; i < BSP_FDCAN_NUM; i++) BSP_FDCAN_TxQueueInit((BSP_FDCAN_t)i);
id_parser = BSP_FDCAN_DefaultIdParser;
queue_mutex = osMutexNew(NULL);
if (queue_mutex == NULL) return BSP_ERR;
inited = true;
/* 配置并启动 FDCAN 实例,绑定中断/回调 */
//========== 过滤器配置说明:==========================
// 过滤器编号相对于每个相当于经典can过滤器的bank
// sFilterConfig.FilterIndex = 0 to 127(标准ID) or 0 to 63(扩展ID);
// 关于过滤器索引的说明:
@ -379,7 +370,7 @@ int8_t BSP_FDCAN_Init(void) {
// 仅在FilterConfig 设为 FDCAN_FILTER_TO_RXBUFFER 时才有意义通常设置为0
// IsCalibrationMsg = 0 or 1;
// fdcan_filter_table.h
//=================================================================================
/* 依据上述说明配置过滤器并启动FDCAN */
FDCAN_FilterTypeDef sFilterConfig;
@ -452,7 +443,7 @@ int8_t BSP_FDCAN_RegisterCallback(BSP_FDCAN_t fdcan, BSP_FDCAN_Callback_t type,
FDCAN_Callback[fdcan][type] = callback;
return BSP_OK;
}
uint32_t fifolevel=0;
int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t id, uint8_t *data, uint8_t dlc) {
if (!inited) return BSP_ERR_INITED;
if (fdcan >= BSP_FDCAN_NUM) return BSP_ERR;
@ -507,10 +498,8 @@ int8_t BSP_FDCAN_Transmit(BSP_FDCAN_t fdcan, BSP_FDCAN_Format_t format, uint32_t
tx_msg.header.DataLength = BSP_FDCAN_EncodeDLC(dlc);
memset(tx_msg.data, 0, dlc);
if (data != NULL && dlc > 0) {
memcpy(tx_msg.data, data, dlc);}
if (data != NULL && dlc > 0) {memcpy(tx_msg.data, data, dlc);}
fifolevel=HAL_FDCAN_GetTxFifoFreeLevel(hfdcan);
if (HAL_FDCAN_GetTxFifoFreeLevel(hfdcan) > 0) {
if (HAL_FDCAN_AddMessageToTxFifoQ(hfdcan, &tx_msg.header, tx_msg.data) == HAL_OK) return BSP_OK;
}

View File

@ -20,9 +20,11 @@
/* USER STRUCT BEGIN */
BSP_FDCAN_Message_t msg1={0};
BSP_FDCAN_Message_t msg2={0};
BSP_FDCAN_Message_t msg3={0};
BSP_FDCAN_Message_t msg3A={0};
BSP_FDCAN_Message_t msg3B={0};
BSP_FDCAN_Message_t msg3C={0};
/* USER STRUCT END */
float rxlevel=0;
/* Private function --------------------------------------------------------- */
/* Exported functions ------------------------------------------------------- */
@ -51,7 +53,8 @@ void Task_blink(void *argument) {
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_FDCAN_RegisterId(BSP_FDCAN_3, 0x104, 8);
BSP_FDCAN_RegisterId(BSP_FDCAN_3, 0x105, 8);
/* USER CODE INIT END */
while (1) {
@ -78,15 +81,20 @@ void Task_blink(void *argument) {
// 使用 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);
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x103, data3, 30);
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x104, data2, 5);
BSP_FDCAN_Transmit(BSP_FDCAN_3, BSP_FDCAN_FORMAT_STD_DATA, 0x105, data1, 8);
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) {
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x103, &msg3A, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
}
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x104, &msg3B, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
}
if (BSP_FDCAN_GetMessage(BSP_FDCAN_3, 0x105, &msg3C, BSP_FDCAN_TIMEOUT_IMMEDIATE) == BSP_OK) {
}
rxlevel=HAL_FDCAN_GetRxFifoFillLevel(BSP_FDCAN_GetHandle(BSP_FDCAN_2), FDCAN_RX_FIFO1);
}
// osDelay(10);
/* USER CODE END */