|

楼主 |
发表于 2018-6-20 09:14:17
|
显示全部楼层
static void MX_CAN_Init(void)
{
CAN_FilterConfTypeDef sFilterConfig;
static CanTxMsgTypeDef TxMessage;
static CanRxMsgTypeDef RxMessage;
/*##-1- Configure the CAN peripheral #######################################*/
hcan.pTxMsg = &TxMessage;
hcan.pRxMsg = &RxMessage;
hcan.Instance = CAN;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.Prescaler = 64;
hcan.Init.SJW = CAN_SJW_1TQ;
hcan.Init.BS1 = CAN_BS1_16TQ;
hcan.Init.BS2 = CAN_BS2_8TQ;//BaudRate = APB1 / ((BS1 + BS2 + 1) * Prescaler)=32000/((16+8+1)*64)=20k
hcan.Init.TTCM = DISABLE;
hcan.Init.ABOM = ENABLE;
hcan.Init.AWUM = DISABLE;
hcan.Init.NART = DISABLE;
hcan.Init.RFLM = DISABLE;
hcan.Init.TXFP = ENABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/*##-2- Configure the CAN Filter ###########################################*/
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = ((((addr+1)<<16)<<3)&0xFFFF0000)>>16;
sFilterConfig.FilterIdLow = (((addr+1)<<16)<<3)&0xFFFF;
sFilterConfig.FilterMaskIdHigh = ((((0xff<<16))<<3)&0x00FF0000)>>16;
sFilterConfig.FilterMaskIdLow = ((0xff<<16)<<3)&0x0000;
sFilterConfig.FilterFIFOAssignment =CAN_FILTER_FIFO0;//过滤器被关联到FIFO0;
sFilterConfig.FilterActivation = ENABLE;//使能过滤器
// sFilterConfig.BankNumber = 14;
if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
{
Error_Handler();
}
/*##-2- Start the Reception process and enable reception interrupt #########*/
if (HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
{
Error_Handler();
}
HAL_NVIC_SetPriority(CEC_CAN_IRQn, 0, 1);
}
void CEC_CAN_IRQHandler(void)
{
/* USER CODE BEGIN CEC_CAN_IRQn 0 */
/* USER CODE END CEC_CAN_IRQn 0 */
HAL_CAN_IRQHandler(&hcan);
}
void HAL_CAN_IRQHandler(CAN_HandleTypeDef* hcan)
{
uint32_t errorcode = HAL_CAN_ERROR_NONE;
/* Check Overrun flag for FIFO0 */
if((__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV0)) &&
(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV0)))
{
/* Set CAN error code to FOV0 error */
errorcode |= HAL_CAN_ERROR_FOV0;
/* Clear FIFO0 Overrun Flag */
__HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV0);
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV0);
}
/* Check Overrun flag for FIFO1 */
if((__HAL_CAN_GET_FLAG(hcan, CAN_FLAG_FOV1)) &&
(__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FOV1)))
{
/* Set CAN error code to FOV1 error */
errorcode |= HAL_CAN_ERROR_FOV1;
/* Clear FIFO1 Overrun Flag */
__HAL_CAN_CLEAR_FLAG(hcan, CAN_FLAG_FOV1);
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_FOV1);
}
/* Check End of reception flag for FIFO0 */
if((__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP0)) &&
(__HAL_CAN_MSG_PENDING(hcan, CAN_FIFO0) != 0U))
{
/* Call receive function */
CAN_Receive_IT(hcan, CAN_FIFO0);
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP0);
}
/* Check End of reception flag for FIFO1 */
if((__HAL_CAN_GET_IT_SOURCE(hcan, CAN_IT_FMP1)) &&
(__HAL_CAN_MSG_PENDING(hcan, CAN_FIFO1) != 0U))
{
/* Call receive function */
CAN_Receive_IT(hcan, CAN_FIFO1);
__HAL_CAN_ENABLE_IT(hcan, CAN_IT_FMP1);
}
} |
|