关闭

STM32 USB无法连接电脑

标签: 函数stm32usb移植调试
81人阅读 评论(0) 收藏 举报
分类:

一、说明

在调试 STM32 USB device MSC 功能时,使用官方提供的库和示例项目,电脑可以正确识别设备,也可以正常操作。但是将 USB 部分的代码移植到自己的工程后,发现电脑无法正确识别设备,有时会在右下角显示无法识别设备。

二、解决方法

在main.c中添加 hal_delay() 函数的实现方式。

在默认的模板工程里,一般使用如下的方式实现延迟函数。


__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

__weak void HAL_Delay(__IO uint32_t Delay)
{
  uint32_t tickstart = 0U;
  tickstart = HAL_GetTick();
  while((HAL_GetTick() - tickstart) < Delay)
  {
  }
}

而在 USB 项目中,需要使用如下的方式实现延时函数。

void HAL_Delay(__IO uint32_t Delay)
{
  while(Delay) 
  {
    if (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) 
    {
      Delay--;
    }
  }
}

这两种方式都可以实现基本的延时功能,都是使用的 SysTick 定时器来实现,也都是使用 while() 来进行条件判断,条件不满足,即计时到了指定的延时后退出 while() 。区别在于,第一种方式,进行条件判断的变量 uwTick 在 SysTick 的中断函数中进行加一操作,即如下代码:

__weak void HAL_IncTick(void)
{
  uwTick++;
}

void SysTick_Handler(void)
{
  HAL_IncTick();
}

而第二种方式,进行 while() 条件判断的变量 Delay 是不依赖于 SysTick 中断函数进行改变的,而是直接在这个函数中进行判断,等待寄存器数值改变,延时 1ms 后,对 Delay 进行减一操作。

默认的实现方式依赖于 SysTick 中断函数void SysTick_Handler(void),而在使用 USB 功能时,USB的操作本身就是需要在中断函数 void OTG_FS_IRQHandler(void) 中进行的。可能由于对不同中断函数的处理,导致了时间上的错误,从而电脑无法正确进行枚举操作。

USB 部分是在 usbd_conf.c 文件中的 void USBD_LL_Delay(uint32_t Delay) 函数中进行延时函数的调用的,如下所示:

void USBD_LL_Delay(uint32_t Delay)
{
  HAL_Delay(Delay);
}

而且在底层的 USB 库中,也有直接调用到hal_delay的,如下:
这里写图片描述

2018.1.3修改

后来发现好像不是这个问题,不这样修改也可以连接。讲道理 SysTick 的中断优先等级比 USB 的高,因此应该是不会受影响的。可是当时对比了两个工程的代码,好像也就这点区别。不过在官方库中,都是使用第二种方式的。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

STM32 USB软件移植注意事项 及硬件接线注意

移植了个自定义HID USB程序到STM32开发板上,成功运行,但是最近自己做的板子上(用的是F103C8T6)就不行,死活没有反应。经过几番调试终于发现问题,以下做个小结: 1.一定要保证USB时...
  • agave7
  • agave7
  • 2015-02-05 11:30
  • 2784

【已解决】(魅族)手机usb调试模式连接不上电脑

最近在安卓的混合开发,突然发现我手上的魅族PRO5开启USB调试模式并且使用MTP连接电脑之后,Android device choose和adb都读不出
  • Dcatfly
  • Dcatfly
  • 2015-12-26 16:56
  • 8748

魅族手机打开usb调试后链接不上电脑,解决方法如下

魅族MX系列手机打开usb调试后链接不上电脑, 1.在拨号键盘输入*#*#6961#*#* 2.设置页面->辅助功能 可以看到开发者选项,打开USB调试 3.在电脑端操作如下: 魅族BBS: ...
  • caoguangguang
  • caoguangguang
  • 2015-05-21 17:10
  • 22826

STM32 USB NAND Flash模拟U盘无法格式化问题的解决

前几天,一直在寻找NAND Flash模拟U盘程序无法格式化的问题。在中秋月圆之夜,还苦逼地在实验室调代码,也许是杭州大圆月的原因,今晚感觉整人特别亢奋,效率也特别高,灵感也多。终于,在不懈的努力...
  • u011318735
  • u011318735
  • 2013-12-20 00:17
  • 3817

stm32USB设备的连接枚举过程

1) USB 的插入检测   当12脚短接,Q1截止,Q2导通,D+上拉,windows 就会认为 USB 接口有一个全速设备,马上复位总线,并开始枚举设备。   如果23脚短接,则 ...
  • yxfabcdefg
  • yxfabcdefg
  • 2017-02-10 17:19
  • 422

解决JLINK v8 连接到电脑后显示无法识别的USB设备

一般来说我们所用的JLINK都是山寨的,一个国外正品JLINK得好几百,所以我们买一个几十块钱的JLINK,要求就不要太高了,能用就行。因为是山寨的嘛,所以用着用着很有可能会给你一个惊喜,那就是显示无...
  • u010173859
  • u010173859
  • 2013-08-12 18:49
  • 10607

新手守则——Android手机通过USB连接电脑无法连接到Eclipse的情况

在日常的程序编码过程中,经常会出现手机连不上eclipse的情况 百度之,网上说来说去的方法无非是关掉豌豆荚、应用宝、360手机卫士等手机管理软件、重启Eclipse等,但有时候照着做仍然连不上,无...
  • Remember2
  • Remember2
  • 2015-01-20 09:35
  • 1639

STM32完成USB_Keyboard的实验总结

STM32,USB_Keyboard,实现简单按键功能.
  • u014980289
  • u014980289
  • 2017-03-16 10:11
  • 933

STM32 USB学习笔记1

主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library 之前在STM32...
  • key123zhangxing
  • key123zhangxing
  • 2016-02-04 17:59
  • 10685

STM32F10X的USB固件库说明

最底层 1)、usb_int.c,本文件包含两个中断服务函数CTR_LP()和CTR_HP(),在接收发送中断时使用这两个函数进行处理,这两个函数又调用各个USB端点处理函数,端点处理函数由用户自定...
  • yxfabcdefg
  • yxfabcdefg
  • 2017-02-10 16:54
  • 547
    个人资料
    • 访问:355404次
    • 积分:3707
    • 等级:
    • 排名:第10162名
    • 原创:96篇
    • 转载:3篇
    • 译文:2篇
    • 评论:84条
    文章分类
    最新评论