硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2790|回复: 3
收起左侧

[有问必答] can接收,不使用中断,直接读

[复制链接]

38

主题

91

回帖

205

积分

高级会员

积分
205
发表于 2018-6-19 19:29:17 | 显示全部楼层 |阅读模式
STM32F0,can接收不使用中断,使用过滤功能,收不到信息
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106959
QQ
发表于 2018-6-20 00:44:23 | 显示全部楼层
估计你的CAN配置有问题,详细检查引脚,CAN中断和NVIC使能了没。
回复

使用道具 举报

38

主题

91

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 2018-6-20 09:05:59 | 显示全部楼层
使用中断函数,是没有问题的,但去掉中断函数,任务查询中断接收标志,查询不到
回复

使用道具 举报

38

主题

91

回帖

205

积分

高级会员

积分
205
 楼主| 发表于 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);
  }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-11 19:30 , Processed in 0.154003 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表