stm32使用hal库调试can双机通讯读取结构体数据时卡死

2019-12-27 18:44发布

void USB_LP_CAN1_RX0_IRQHandler(void)
{
  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */
        int a,b;
        printf("%d",2);
        flag_can_rx=1;
        a = (uint8_t)0xFF & hcan.Instance->sFIFOMailBox[CAN_FIFO0].RDLR;
                 b = (uint8_t)0xFF & (hcan.Instance->sFIFOMailBox[CAN_FIFO0].RDLR >> 8);
        printf("RxMsg : %x %x ", a,b);
        printf("%d",3);
  /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */
  HAL_CAN_IRQHandler(&hcan);
  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */
                flag_can_rx=1;
printf("%d",4);
  /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */
}
中断函数中执行到HAL_CAN_IRQHandler(&hcan);就卡死了,因为其中函数CAN_Receive_IT(hcan, CAN_FIFO0);中读取数据的语句
static HAL_StatusTypeDef CAN_Receive_IT(CAN_HandleTypeDef* hcan, uint8_t FIFONumber)
{
  /* Get the Id */
        printf("%d",4);
                 hcan->pRxMsg->IDE = (uint8_t)0x04 & hcan->Instance->sFIFOMailBox[FIFONumber].RIR;
        // hcan->pRxMsg->IDE = (uint8_t)0x04;
        printf("%d",5);
在hcan->pRxMsg->IDE 这个地方卡死,只要给这个结构体的这个部分赋值就卡死,
直接读取hcan->Instance->sFIFOMailBox[FIFONumber].RIR;不会有问题,而且发现传输的数据还是正确的
我加这么多printf是为了找到问题在哪

另外我发现main中设置中断后还必须加上HAL_CAN_Receive_IT(&hcan, CAN_FIFO0); 才能在接收到数据后进入中断
哪位大侠知道这是为什么。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
bailangcn
1楼-- · 2019-12-28 00:20
HAL_CAN_Receive_IT因为这里面才设置中断啊  HAL库的机制你还没有弄懂  哈哈
siml142857
2楼-- · 2019-12-28 06:16
bailangcn 发表于 2017-7-4 13:56
HAL_CAN_Receive_IT因为这里面才设置中断啊  HAL库的机制你还没有弄懂  哈哈

初始化函数中会调用这个函数
HAL_StatusTypeDef HAL_CAN_Init(CAN_HandleTypeDef* hcan)
{
  uint32_t status = CAN_INITSTATUS_FAILED;  /* Default init status */
  uint32_t tickstart = 0;
  uint32_t tmp_mcr = 0;
  
  /* Check CAN handle */
  if(hcan == NULL)
  {
     return HAL_ERROR;
  }

  /* Check the parameters */
  assert_param(IS_CAN_ALL_INSTANCE(hcan->Instance));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TTCM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.ABOM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.AWUM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.NART));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.RFLM));
  assert_param(IS_FUNCTIONAL_STATE(hcan->Init.TXFP));
  assert_param(IS_CAN_MODE(hcan->Init.Mode));
  assert_param(IS_CAN_SJW(hcan->Init.SJW));
  assert_param(IS_CAN_BS1(hcan->Init.BS1));
  assert_param(IS_CAN_BS2(hcan->Init.BS2));
  assert_param(IS_CAN_PRESCALER(hcan->Init.Prescaler));
  
  if(hcan->State == HAL_CAN_STATE_RESET)
  {
    /* Allocate lock resource and initialize it */
    hcan->Lock = HAL_UNLOCKED;
    /* Init the low level hardware */
    HAL_CAN_MspInit(hcan);
  }
然后会执行这个函数不就设置了中断吗
void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(canHandle->Instance==CAN1)
  {
  /* USER CODE BEGIN CAN1_MspInit 0 */

  /* USER CODE END CAN1_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_CAN1_CLK_ENABLE();
  
    /**CAN GPIO Configuration   
    PB8     ------> CAN_RX
    PB9     ------> CAN_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    __HAL_AFIO_REMAP_CAN1_2();

    /* CAN1 interrupt Init */
    HAL_NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);
  /* USER CODE BEGIN CAN1_MspInit 1 */

  /* USER CODE END CAN1_MspInit 1 */
  }
}
这里面有什么我忽略了,我用的STM32CUBE 生成的代码

一周热门 更多>