stm32 USB CDC 不接电脑无程序一直在USB中断问题

前些时间基于STM32CUBE 工具做了个用STM32F103的USB 接口 枚举成CDC的项目,接上电脑程序功能正常,但是在不接电脑时,程序一直在USB中断中,下在给大家分享一下我的解决方法:

首先是在 stm32f1xx_hal_pcd.c文件中的 HAL_PCD_IRQHandler函数屏蔽USB_ISTR_ESOF中断响应操作,如下面方红色代码所示:

void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_CTR))
  {
    /* servicing of the endpoint correct transfer interrupt */
    /* clear of the CTR flag into the sub */
    PCD_EP_ISR_Handler(hpcd);
  }

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_RESET))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET);
    HAL_PCD_ResetCallback(hpcd);
    HAL_PCD_SetAddress(hpcd, 0U);
  }

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_PMAOVR))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR);    
  }
  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ERR))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR); 
  }

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP))
  {
    hpcd->Instance->CNTR &= ~(USB_CNTR_LP_MODE);
    hpcd->Instance->CNTR &= ~(USB_CNTR_FSUSP);
    
    HAL_PCD_ResumeCallback(hpcd);

    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);     
  }

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SUSP))
  { 
    /* Force low-power mode in the macrocell */
    hpcd->Instance->CNTR |= USB_CNTR_FSUSP;
    
    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SUSP);  

    hpcd->Instance->CNTR |= USB_CNTR_LP_MODE;
    if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_WKUP) == 0U)
    {
      HAL_PCD_SuspendCallback(hpcd);
    }
  }

  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_SOF))
  {
    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF); 
    HAL_PCD_SOFCallback(hpcd);
  }

//  if (__HAL_PCD_GET_FLAG (hpcd, USB_ISTR_ESOF))
//  {
//    /* clear ESOF flag in ISTR */
//    __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF); 
//  }

   
}

然后在USB中断中函数,笔都的是USB_LP_CAN1_RX0_IRQHandler 中的 USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1区域加入如下红色代码:

/**
  * @brief This function handles USB low priority or CAN RX0 interrupts.
  */
void USB_LP_CAN1_RX0_IRQHandler(void)
{
  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 0 */
    
  /* USER CODE END USB_LP_CAN1_RX0_IRQn 0 */
  HAL_PCD_IRQHandler(&hpcd_USB_FS);
  /* USER CODE BEGIN USB_LP_CAN1_RX0_IRQn 1 */

  //  如果没有数据收到ESOF中断,则关闭如下中断 
  if (__HAL_PCD_GET_FLAG (&hpcd_USB_FS, USB_ISTR_ESOF))
  {
    /* clear ESOF flag in ISTR */
        USB->CNTR &= 0xe2ff;

        /* Force low-power mode in the macrocell */
        USB->CNTR |= USB_CNTR_FSUSP;
        USB->CNTR |= USB_CNTR_LP_MODE;
        
        USB->ISTR &= ~USB_ISTR_RESET;
        USB->ISTR &= ~USB_ISTR_SUSP;
        USB->ISTR &= ~USB_ISTR_WKUP;
        USB->ISTR &= ~USB_ISTR_ESOF;
        
  }

    
  /* USER CODE END USB_LP_CAN1_RX0_IRQn 1 */
}

通过以上两步,操作,使用程序在不接电脑时也能正常运行,其它功能也能正常使用。

 

你可能感兴趣的:(CDC,USB,STM32CUBE)