前些时间基于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 */
}
通过以上两步,操作,使用程序在不接电脑时也能正常运行,其它功能也能正常使用。