前些时间基于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 */
}

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

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

  1. 备份linux分区到usb,将Linux引导加载程序备份到USB的方法

    本文介绍如何将Linux引导加载程序备份到USB以应对紧急情况.大多数Linux操作系统使用的引导加载程序称为Grub,这是一个简单的工具,可以配置为在PC启动时从菜单启动Linux发行版以及其他操作 ...

  2. 连不上局域网计算机一连就闪退,手机usb连不上电脑  连上了就闪退??

    一.手机USB连不上电脑可能是因为手机没安装驱动,可以下载豌豆荚等软件进行驱动安装. 二.第二个手机USB连不上电脑的解决方法不用安装任何东西,你把手机连接电脑后,点击手机设置--应用程序--开发者选 ...

  3. STM32开发笔记33:解决USB CDC “该设备无法启动”问题

    单片机型号:STM32F401 调试STM32的USB CDC设备已经有好多次了,可以看一下前面写的日志,针对不同的STM32 MCU都进行了调试.原本以为STM32F4会很简单,可处处是坑,已经调到 ...

  4. 三星s4开机显示无服务器,三星S4无法连接电脑,USB连接后手机只出现充电提示,电脑无反应...

    三星S4无法连接电脑,USB连接后手机只出现充电提示,电脑无反应以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 三星S4 ...

  5. STM32 USB CDC 虚拟多串口

    转自: http://www.stmcu.org.cn/module/forum/thread-613510-1-1.html 楼主  发表于 2017-9-28 22:30:04 | 只看该作者 | ...

  6. [原创] STM32 USB CDC 虚拟多串口

        creep 该用户从未签到 61 主题 1995 帖子 26 蝴蝶豆 版主 最后登录 2018-10-19 发消息 电梯直达 楼主  发表于 2017-9-28 22:30:04 | 只看该作 ...

  7. hp台式计算机u盘启动设置,如何在HP计算机上设置USB引导? HP电脑BIOS设置程序U盘启动教程...

    如果要在HP计算机上重新安装系统,如果使用USB闪存驱动器进行安装,则必须将USB闪存驱动器设置为引导,然后将其安装在PE中,但是许多用户却没有这样做.不知道如何在HP计算机上设置USB启动.编辑器将 ...

  8. stm32 usb 虚拟串口 相同_为什么说你要学习USB?(一)

    来源:公众号[鱼鹰谈单片机]作者:鱼鹰OspreyID   :emOsprey本篇笔记为 USB 系列教程第一篇,一共有多少篇鱼鹰心里也没底,鱼鹰不会因为篇幅多而停止,会尽可能的将 USB 讲透,让你 ...

  9. 在进行USB CDC类开发时,无法发送64整数倍的数据(续)

    1 前言 此文延续之前相同文章的话题,是对上篇文章的补充,之所以会有此文,主要是之前发现问题是在STM32F4上,解决方案也是基于CubeF4,但是,当相同问题出现在STM32F0上时,使用之前的代码 ...

最新文章

  1. window resize和scroll事件的基本优化
  2. 案例:Oracle dul数据挖掘 磁盘损坏dul提取数据文件中表的数据及l
  3. 想要快速获客?送你 2 个小程序互推方法
  4. PAT甲级1131 Subway Map (30分):[C++题解]堆优化dijkstra、单源最短路、地铁地图、巧妙地建图套dijkstra模板!!
  5. 第七届蓝桥杯省赛JavaC组真题——详细答案对照(完整版)
  6. 【OS学习笔记】八 实模式:编写主引导扇区代码-另一种更高效的写法
  7. QBC检索和本地SQL检索
  8. C++ File:\dd\vctools\vc7libs\..\..\afxwin1.inl Line24
  9. u盘iso安装centos5 ,centos6
  10. android adb进入recovery模式,adb 进入 recovery adb 进入 bootloader
  11. TexturePacker破解版教程及下载
  12. python回车和换行的区别_换行\ n与回车\ r的区别
  13. 微博遭鹿晗恋情暴击瘫痪,如何把微博服务器搞炸的?
  14. Python对遥感影像重采样,以及重采样方法
  15. 龙架构(LoongArch)赋能众享链网,相关产品已完成适配
  16. 计算摄影:噪声模型与噪声估计
  17. SSM框架学习(一)————SSM框架简介
  18. 东师理想运维工具开发路线图(第一阶段)
  19. 人工智能意念控制打字_智能打字稿批量属性分配
  20. 数学建模 微分方程实战:利用SEIR模型对新冠病毒预测

热门文章

  1. android-数据库SQLite相关
  2. 电动力学每日一题 2021/10/23 载流板产生的电磁场
  3. Dirichlet分布与多项分布的共轭性
  4. 初等数学O 集合论基础 第一节 集合及其基本运算、de Moivre公式
  5. Directx 顶点和顶点缓存
  6. 进一步学习 Cesium 和 3D Tiles 数据相关
  7. C# main函数的返回值 - 译
  8. 图的邻接矩阵简单实现Win32版本
  9. 超图js版本在地图上使用图标标记地理点
  10. codeplex网站翻译