2025-08-19 7:57 PM
Hello @D.Botelho @mƎALLEm
I had an issue of ThreadX and FDCAN transmit as below.
I use the stm32g474 and config a threadx and fdcan with stm32cubemx, so far it works well.
but when i add some fdcan transmit code, it comes strangely.
the code as below
void appThread2(ULONG thread_input)
{
while(1)
{
if(fdcan1_RXFlag == 1)
{
fdcan1_RXFlag = 0; // Clear the receive flag
for(int i = 0; i < 8; i++)
{
fdcan1TxData[i] = fdcan1RxData[i]+1; // Copy received data to transmit buffer
}
my_FDCAN1_Transmit(fdcan1TxData); // Echo back the received data
printf("FDCAN1 Received data: ");
for (int i = 0; i < 8; i++)
{
printf("%02X ", fdcan1RxData[i]);
}
printf("\r\n");
}
// // 发送 0x12
fdcan1TxHeader.Identifier=0x012;
fdcan1TxData[0] = (dis_sensor_data1.dis1 >> 0) & 0xff;
fdcan1TxData[1] = (dis_sensor_data1.dis1 >> 8) & 0xff;
fdcan1TxData[2] = (dis_sensor_data1.dis2 >> 0) & 0xff;
fdcan1TxData[3] = (dis_sensor_data1.dis2 >> 8) & 0xff;
fdcan1TxData[4] = (dis_sensor_data1.dis3 >> 0) & 0xff;
fdcan1TxData[5] = (dis_sensor_data1.dis3 >> 8) & 0xff;
fdcan1TxData[6] = (dis_sensor_data1.dis4 >> 0) & 0xff;
fdcan1TxData[7] = (dis_sensor_data1.dis4 >> 8) & 0xff;
my_FDCAN1_Transmit(fdcan1TxData);
// // 发送 0x13
fdcan1TxHeader.Identifier=0x013;
fdcan1TxData[0] = (dis_sensor_data2.dis1 >> 0) & 0xff;
fdcan1TxData[1] = (dis_sensor_data2.dis1 >> 8) & 0xff;
fdcan1TxData[2] = (dis_sensor_data2.dis2 >> 0) & 0xff;
fdcan1TxData[3] = (dis_sensor_data2.dis2 >> 8) & 0xff;
fdcan1TxData[4] = (dis_sensor_data2.dis3 >> 0) & 0xff;
fdcan1TxData[5] = (dis_sensor_data2.dis3 >> 8) & 0xff;
fdcan1TxData[6] = (dis_sensor_data2.dis4 >> 0) & 0xff;
fdcan1TxData[7] = (dis_sensor_data2.dis4 >> 8) & 0xff;
my_FDCAN1_Transmit(fdcan1TxData);
// // 发送 0x14
fdcan1TxHeader.Identifier=0x014;
fdcan1TxData[0] = sbusHandle.isExist; // 遥控器工作状态
fdcan1TxData[1] = sys_status; // 系统状态
fdcan1TxData[2] = (encoder_data1.counter >> 0) & 0xff;
fdcan1TxData[3] = (encoder_data1.counter >> 8) & 0xff;
fdcan1TxData[4] = (encoder_data2.counter >> 0) & 0xff;
fdcan1TxData[5] = (encoder_data2.counter >> 8) & 0xff;
fdcan1TxData[6] = encoder_data1.direction;
fdcan1TxData[7] = encoder_data1.direction;
my_FDCAN1_Transmit(fdcan1TxData);
// 发送 0x15
fdcan1TxHeader.Identifier=0x015;
fdcan1TxData[0] = RS485_RXData[0]+0x0A;
fdcan1TxData[1] = RS485_RXData[1];
fdcan1TxData[2] = RS485_RXData[2];
fdcan1TxData[3] = RS485_RXData[3];
fdcan1TxData[4] = RS485_RXData[4];
fdcan1TxData[5] = RS485_RXData[5];
fdcan1TxData[6] = RS485_RXData[6];
fdcan1TxData[7] = RS485_RXData[7];
my_FDCAN1_Transmit(fdcan1TxData);
tx_thread_sleep(20); // Sleep for 20 ticks
}
}
I use a thread to send can message with a peroid of 20ms.
the CAN message ID is 0x12, 0x13, 0x14, 0x15.
as the code above, when i compiled the code and programming to mcu, just after 1s, the system stack and Error_Handler() called. when I comment out 0x15 CAN transimt, only transmit 0x12, 0x13, 0x14, it works well.
why?
I have increased the thread_stack of appThread2, but it seems the issue still exists.
how should i do to fix this issue?
Thanks,
dqsh06