Explorar o código

针对FIFO0和FIFO1增加独立的接收中断回调函数。

Dail %!s(int64=2) %!d(string=hai) anos
pai
achega
ab7d336673

+ 12 - 136
Core/Src/can.c

@@ -180,17 +180,11 @@ void CAN_Rx_ISR(CAN_Buf_TypeDef*ptCANRx,uint8_t ucLength)
 
 void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 {
-	#if 1
 	if((CanHandle->pRxMsg->IDE != CAN_ID_STD)||(CanHandle->pRxMsg->DLC == 0))
 	{
 		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
 		return;
 	}
-	if((CanHandle->pRx1Msg->IDE != CAN_ID_STD)||(CanHandle->pRxMsg->DLC == 0))
-	{
-		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-		return;
-	}
 	switch(CanHandle->pRxMsg->StdId)
 	{
 		case ID_PBU_BC: case ID_PBU_TO_MC://接收PBU数据
@@ -219,6 +213,17 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 		}
 		default:break;
 	}
+	
+	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
+}
+
+void HAL_CAN_Rx1CpltCallback(CAN_HandleTypeDef *CanHandle)
+{
+	if((CanHandle->pRx1Msg->IDE != CAN_ID_STD)||(CanHandle->pRxMsg->DLC == 0))
+	{
+		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
+		return;
+	}
 	switch(CanHandle->pRx1Msg->StdId)
 	{
 		case ID_ENVIOLO_TO_MC_1: case ID_ENVIOLO_TO_MC_2:
@@ -233,137 +238,8 @@ void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef *CanHandle)
 		}
 		default:break;
 	}
-	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
-	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-	
-	#elif 0
-	//FIFO0中断
-	if(__HAL_CAN_GET_IT_SOURCE(CanHandle, CAN_IT_FMP0))
-	{
-		if((CanHandle->pRxMsg->IDE != CAN_ID_STD)||(CanHandle->pRxMsg->DLC == 0))
-		{
-			__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
-			return;
-		}
-		switch(CanHandle->pRxMsg->StdId)
-	  {
-			case ID_PBU_BC: case ID_PBU_TO_MC://接收PBU数据
-			{
-				CAN_RxBuf_Struct_PBU.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_PBU,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_BMS_BC: case ID_BMS_TO_MC://接收BMS数据
-			{
-				CAN_RxBuf_Struct_BMS.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_BMS,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_HMI_BC: case ID_HMI_TO_MC://接收HMI数据
-			{
-				CAN_RxBuf_Struct_HMI.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_HMI,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_CDL_BC: case ID_CDL_TO_MC:case ID_CDL_TO_MC_TE://接收CDL数据
-			{
-				CAN_RxBuf_Struct_CDL.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_CDL,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			default:break;
-		}
-		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
-	}
-	//FOFO1中断
-	else if(__HAL_CAN_GET_IT_SOURCE(CanHandle, CAN_IT_FMP1))
-	{
-	  if((CanHandle->pRx1Msg->IDE != CAN_ID_STD)||(CanHandle->pRx1Msg->DLC == 0))
-		{
-			__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-			return;
-		}
-		switch(CanHandle->pRx1Msg->StdId)
-	  {
-			case ID_ENVIOLO_TO_MC_1: case ID_ENVIOLO_TO_MC_2:
-			{
-				if(CanHandle->pRx1Msg->DLC == 8)//由于没有帧头帧尾和CRC,故保证数据的准确性必须为8字节才解析
-				{
-					GearBox_CanData.RefreshFlag = TRUE;
-					GearBox_CanData.ID = CanHandle->pRx1Msg->StdId;
-					memcpy((uint8_t*)GearBox_CanData.Data, (uint8_t*)CanHandle->pRx1Msg->Data, 8);
-				}
-				break;
-			}
-			default:break;
-		}
-		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-	}
 
-	#elif 1
-  //FIFO0中断
-	if(__HAL_CAN_MSG_PENDING(CanHandle, CAN_FIFO0))
-	{
-		if((CanHandle->pRxMsg->IDE != CAN_ID_STD)||(CanHandle->pRxMsg->DLC == 0))
-		{
-			__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
-			return;
-		}
-		switch(CanHandle->pRxMsg->StdId)
-	  {
-			case ID_PBU_BC: case ID_PBU_TO_MC://接收PBU数据
-			{
-				CAN_RxBuf_Struct_PBU.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_PBU,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_BMS_BC: case ID_BMS_TO_MC://接收BMS数据
-			{
-				CAN_RxBuf_Struct_BMS.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_BMS,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_HMI_BC: case ID_HMI_TO_MC://接收HMI数据
-			{
-				CAN_RxBuf_Struct_HMI.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_HMI,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			case ID_CDL_BC: case ID_CDL_TO_MC:case ID_CDL_TO_MC_TE://接收CDL数据
-			{
-				CAN_RxBuf_Struct_CDL.ucBufID = CanHandle->pRxMsg->StdId;
-				CAN_Rx_ISR(&CAN_RxBuf_Struct_CDL,CanHandle->pRxMsg->DLC);
-				break;
-			}
-			default:break;
-		}
-		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP0);//开接收中断
-	}
-	//FOFO1中断
-	else if(__HAL_CAN_MSG_PENDING(CanHandle, CAN_FIFO1))
-	{
-	  if((CanHandle->pRx1Msg->IDE != CAN_ID_STD)||(CanHandle->pRx1Msg->DLC == 0))
-		{
-			__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-			return;
-		}
-		switch(CanHandle->pRx1Msg->StdId)
-	  {
-			case ID_ENVIOLO_TO_MC_1: case ID_ENVIOLO_TO_MC_2:
-			{
-				if(CanHandle->pRx1Msg->DLC == 8)//由于没有帧头帧尾和CRC,故保证数据的准确性必须为8字节才解析
-				{
-					GearBox_CanData.RefreshFlag = TRUE;
-					GearBox_CanData.ID = CanHandle->pRx1Msg->StdId;
-					memcpy((uint8_t*)GearBox_CanData.Data, (uint8_t*)CanHandle->pRx1Msg->Data, 8);
-				}
-				break;
-			}
-			default:break;
-		}
-		__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
-	}	
-	#endif
+	__HAL_CAN_ENABLE_IT(&hcan, CAN_IT_FMP1);//开接收中断
 }
 
 //CAN发送数据

+ 1 - 0
Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_can.h

@@ -719,6 +719,7 @@ HAL_StatusTypeDef HAL_CAN_WakeUp(CAN_HandleTypeDef *hcan);
 void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan);
 void HAL_CAN_TxCpltCallback(CAN_HandleTypeDef* hcan);
 void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan);
+void HAL_CAN_Rx1CpltCallback(CAN_HandleTypeDef* hcan);
 void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);
 /**
   * @}

+ 19 - 3
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c

@@ -1436,6 +1436,21 @@ __weak void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* hcan)
    */
 }
 
+/**
+  * @brief  Transmission  complete callback in non blocking mode 
+  * @param  hcan: pointer to a CAN_HandleTypeDef structure that contains
+  *         the configuration information for the specified CAN.
+  * @retval None
+  */
+__weak void HAL_CAN_Rx1CpltCallback(CAN_HandleTypeDef* hcan)
+{
+  /* Prevent unused argument(s) compilation warning */
+  UNUSED(hcan);
+  /* NOTE : This function Should not be modified, when the callback is needed,
+            the HAL_CAN_Rx1CpltCallback can be implemented in the user file
+   */
+}
+
 /**
   * @brief  Error CAN callback.
   * @param  hcan: pointer to a CAN_HandleTypeDef structure that contains
@@ -1656,6 +1671,8 @@ static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONum
         hcan->State = HAL_CAN_STATE_READY;
         break;
     }
+		/* Receive complete callback */ 
+    HAL_CAN_RxCpltCallback(hcan);
   }
   else /* FIFONumber == CAN_FIFO1 */
   {
@@ -1674,11 +1691,10 @@ static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONum
         hcan->State = HAL_CAN_STATE_READY;
         break;
     }
+		/* Receive complete callback */ 
+    HAL_CAN_Rx1CpltCallback(hcan);
   }
 
-  /* Receive complete callback */ 
-  HAL_CAN_RxCpltCallback(hcan);
-
   /* Return function status */
   return HAL_OK;
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2462 - 2462
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN=BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio