STM32-L432KC CAN邮箱未清空触发HAL_CAN_ERROR_PARAM故障
STM32-L432KC CAN发送触发HAL_CAN_ERROR_PARAM错误排查
在STM32-L432KC平台上,尝试每秒发送一次CAN报文,数次发送后触发HAL_CAN_ERROR_PARAM错误。已在发送前检查空闲CAN邮箱,但邮箱始终无法被清空。以下为相关代码及错误信息:
主循环代码
while (1) { //if the flag is high, one sample moment will occur if(sampleFlag == 1) { readWIT(WITsensor); //delay to allow the bus to clear HAL_Delay(3); readSenixSensors(&Senix1, &Senix2); if (HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) != 0) { sendMessage(); } sampleFlag = 0; } }
CAN相关函数代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ //check if the interrupt is triggered by the correct timer if (htim == &htim16){ //create a variable delay if(currentDelay >= timeBetweenSamples) { sampleFlag = 1; currentDelay = 0; } else { currentDelay++; } } } void convertFloatArrayToInt(float floatArray[], uint8_t intArray[], uint8_t size, uint16_t scale){ uint8_t j = 0; for (uint8_t i = 0; i < size; i++) { uint16_t scaledValue = floatArray[i] * scale; intArray[j] = (scaledValue & 0xFF00) >> 8; intArray[j+1] = scaledValue & 0x00FF; j += 2; } } void sendPartionalMessage(uint8_t TxData[], uint8_t TxDataArray[], uint8_t id, uint8_t begin) { TxData[0] = id; uint8_t j = begin; for(uint8_t i = 0; i < 7; i++) { TxData[i] = TxDataArray[j]; j += 1; } /* send TxData*/ if (HAL_CAN_AddTxMessage(&hcan1, &TxHeader, (uint8_t*)TxData, &TxMailbox) != HAL_OK) { uint32_t error = HAL_CAN_GetError(&hcan1); Error_Handler (); //!Error triggered here! } } void sendMessage(){ /* convert the values to a type we can send*/ //convertFloatArrayToInt(WITsensor, WITvalues, WITarraySize, 1000); /* make a array size so it is devidable by 7 and can accomadate all the vales * WITarraySize * 2 accommodates for all the WIT values * + 2 accommodates for the Senix sensors * + 6 makes it devidable by 7*/ uint8_t TxDataArray[WITarraySize * 2 + 2 + 6]; TxDataArray[0] = Senix1; TxDataArray[1] = Senix2; for(uint8_t i = 2; i < WITarraySize * 2 + 2; i++) { TxDataArray[i] = WITvalues[i - 2]; } /*send all the data in different messages*/ sendPartionalMessage(TxData, TxDataArray, 'A', 0); sendPartionalMessage(TxData, TxDataArray, 'B', 7); // sendPartionalMessage(TxData, TxDataArray, 'C', 14); // sendPartionalMessage(TxData, TxDataArray, 'D', 21); } void CAN_TX_filter_init(void) { TxHeader.StdId = 0x222; TxHeader.ExtId = 0; TxHeader.IDE = CAN_ID_STD; TxHeader.RTR = CAN_RTR_DATA; TxHeader.DLC = 8; TxHeader.TransmitGlobalTime = DISABLE; }
CAN初始化代码
void MX_CAN1_Init(void) { /* USER CODE BEGIN CAN1_Init 0 */ /* USER CODE END CAN1_Init 0 */ /* USER CODE BEGIN CAN1_Init 1 */ /* USER CODE END CAN1_Init 1 */ hcan1.Instance = CAN1; hcan1.Init.Prescaler = 8; hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; hcan1.Init.TimeSeg1 = CAN_BS1_7TQ; hcan1.Init.TimeSeg2 = CAN_BS2_8TQ; hcan1.Init.TimeTriggeredMode = DISABLE; hcan1.Init.AutoBusOff = DISABLE; hcan1.Init.AutoWakeUp = DISABLE; hcan1.Init.AutoRetransmission = DISABLE; hcan1.Init.ReceiveFifoLocked = DISABLE; hcan1.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN CAN1_Init 2 */ if (HAL_CAN_Start(&hcan1) != HAL_OK) { Error_Handler(); } /* USER CODE END CAN1_Init 2 */ }
错误相关信息
- 错误触发位置:
sendPartionalMessage函数中调用HAL_CAN_AddTxMessage失败后进入Error_Handler - 错误码:对应
HAL_CAN_ERROR_PARAM参数错误 - 错误定义:
HAL_CAN_ERROR_PARAM表示CAN外设或HAL库函数接收到无效参数
内容的提问来源于stack exchange,提问作者HugoDiePugo
相关产品推荐
相关产品推荐

