增加can发送失败处理,增加debug命令和设置方向命令

This commit is contained in:
shen 2026-03-30 17:22:32 +08:00
parent 8c98fbc0d2
commit fda58988ed
8 changed files with 138 additions and 72 deletions

View File

@ -44,9 +44,9 @@ void MX_CAN1_Init(void)
hcan1.Init.TimeSeg1 = CAN_BS1_2TQ;
hcan1.Init.TimeSeg2 = CAN_BS2_1TQ;
hcan1.Init.TimeTriggeredMode = DISABLE;
hcan1.Init.AutoBusOff = DISABLE;
hcan1.Init.AutoBusOff = ENABLE;
hcan1.Init.AutoWakeUp = DISABLE;
hcan1.Init.AutoRetransmission = DISABLE;
hcan1.Init.AutoRetransmission = ENABLE;
hcan1.Init.ReceiveFifoLocked = DISABLE;
hcan1.Init.TransmitFifoPriority = DISABLE;
if (HAL_CAN_Init(&hcan1) != HAL_OK)

View File

@ -52,7 +52,8 @@
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern uint8_t g_debugLevel;
extern uint8_t g_direction;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
@ -170,8 +171,16 @@ int main(void)
prev_angle = angle;
prev_tick_ms = now_ms;
_dbg_printf("Angle: %u, Vel: %.2f dt: %u ms\r\n", angle, velocity_deg_s, dt_ms);
if(g_direction > 0)
{
// 反转方向
velocity_deg_s = -velocity_deg_s;
angle = -angle;
}
if(g_debugLevel > 0)
{
_dbg_printf("Angle: %u, Vel: %.2f dt: %u ms\r\n", angle, velocity_deg_s, dt_ms);
}
HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);
status = 1;
}
@ -180,6 +189,7 @@ int main(void)
{
uint8_t canData[8] = {0};
int16_t vel_cdeg_s = (int16_t)(velocity_deg_s * 100.0f); // 0.01 deg/s
int transmitResult = 0;
canData[0] = 0xAA; // 头
canData[1] = (angle >> 8) & 0xFF;
@ -190,11 +200,23 @@ int main(void)
canData[6] = 0x00; // 保留
canData[7] = can_checksum_calculate(canData, 7);
can_node_transmit(flashConfig->can_id, canData);
status = 0;
transmitResult = can_node_transmit(flashConfig->can_id, canData);
if (transmitResult != 0)
{
status = -1; // 发送失败,回到初始化状态
status = 2; // 直接进入错误状态,持续闪烁蓝灯
}
else
{
status = 0;
HAL_GPIO_WritePin(LED_B_GPIO_Port, LED_B_Pin, GPIO_PIN_SET); //关闭蓝灯
}
}
break;
case 2:
HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin);
// HAL_Delay(100);
break;
default:
break;
}

File diff suppressed because one or more lines are too long

View File

@ -135,7 +135,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name></Name>
<Name>(105=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@ -150,7 +150,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>ST-LINKIII-KEIL_SWO</Key>
<Name>-U-O142 -O2254 -S0 -C0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431CCUx$CMSIS\Flash\STM32L4xx_256.FLM)</Name>
<Name>-U16004A002933353739303541 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431CCUx$CMSIS\Flash\STM32L4xx_256.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 -WK0-R0</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>

View File

@ -2,11 +2,13 @@
CAD.formats=
CAD.pinconfig=
CAD.provider=
CAN1.ABOM=ENABLE
CAN1.BS1=CAN_BS1_2TQ
CAN1.CalculateBaudRate=1000000
CAN1.CalculateTimeBit=1000
CAN1.CalculateTimeQuantum=250.0
CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Prescaler,BS1
CAN1.IPParameters=CalculateTimeQuantum,CalculateTimeBit,CalculateBaudRate,Prescaler,BS1,ABOM,NART
CAN1.NART=ENABLE
CAN1.Prescaler=20
Dma.Request0=USART1_RX
Dma.RequestsNb=1

View File

@ -8,6 +8,7 @@
CAN_RxHeaderTypeDef can1RxHeader; // FDCAN1 接收头
uint8_t can1RxData[8]; // FDCAN1 接收数据
int canTransmitErrorCount = 0;
void can_node_init(void)
{
@ -45,7 +46,7 @@ void can_node_init(void)
_dbg_printf("CAN1 initialized successfully\r\n");
}
void can_node_transmit(uint32_t canID, uint8_t *TxData)
int can_node_transmit(uint32_t canID, uint8_t *TxData)
{
CAN_TxHeaderTypeDef txHeader;
uint32_t txMailbox;
@ -60,8 +61,16 @@ void can_node_transmit(uint32_t canID, uint8_t *TxData)
// 等待邮箱空闲
while (HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) == 0)
{
canTransmitErrorCount ++;
if(canTransmitErrorCount > 1000)
{
_dbg_printf("CAN transmit timeout\r\n");
canTransmitErrorCount = 0;
return -1;
}
};
HAL_CAN_AddTxMessage(&hcan1, &txHeader, TxData, &txMailbox);
return 0;
}
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)

View File

@ -5,6 +5,6 @@
void can_node_init(void);
void can_node_transmit(uint32_t canID, uint8_t *TxData);
int can_node_transmit(uint32_t canID, uint8_t *TxData);
#endif /* _CAN_NODE_H_ */

View File

@ -11,6 +11,8 @@
uint8_t cmdData[32];
uint8_t uart1len = 0;
uint8_t g_debugLevel = 0;
uint8_t g_direction = 0;
extern DMA_HandleTypeDef hdma_usart1_rx;
FlashConfig_t *currentConfig;
@ -41,6 +43,28 @@ void UART_CommandHandler(char *data, uint16_t len)
}
}
else if(strncmp(data, "SETDEBUG", 8) == 0)
{
uint8_t debug;
if (sscanf(data + 8, "%x", &debug) == 1)
{
g_debugLevel = debug;
_dbg_printf("Set debug level: 0x%02X\n", g_debugLevel);
}
}
else if(strncmp(data, "SETDIR", 6) == 0)
{
uint8_t dir;
if (sscanf(data + 6, "%x", &dir) == 1)
{
g_direction = dir;
_dbg_printf("Set direction: 0x%02X\n", g_direction);
}
}
else
{
_dbg_printf("Unknown command: %s\n", data);
}
}