STM32 软件断开连接 USB 设备问题(在线等!比较急!)

[复制链接]
7466|16
 楼主| LOVE_ELEC 发表于 2013-1-16 13:45 | 显示全部楼层 |阅读模式
现在利用软件断开可以实现但是有如下问题:
1>断开需要等待10秒钟左右是否正常?
2>采用此方法断开后如何重新连接?
我要实现的是在切换到 DFU 模式时主机能够进行对设备进行枚举,从而为 DFU模式加载驱动!
 楼主| LOVE_ELEC 发表于 2013-1-16 13:48 | 显示全部楼层
现在只要加上软件断开程序段就会造成下面的代码无法执行?
huangxz 发表于 2013-1-16 13:52 | 显示全部楼层
  1. void USB_OTG_BSP_DeInit(void)
  2. {
  3. #ifdef USE_USB_OTG_FS
  4.   GPIOA->MODER &= ~(0x0ful << 11*2);
  5.   RCC->AHB2RSTR |= RCC_AHB2Periph_OTG_FS;
  6.   RCC->AHB2RSTR &= ~(RCC_AHB2Periph_OTG_FS);
  7. #endif
  8. }
这样子做可以断开,我试过了:lol
 楼主| LOVE_ELEC 发表于 2013-1-16 14:15 | 显示全部楼层
那要想重新连接呢?
 楼主| LOVE_ELEC 发表于 2013-1-16 14:17 | 显示全部楼层
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?
huangxz 发表于 2013-1-16 14:22 | 显示全部楼层
LOVE_ELEC 发表于 2013-1-16 14:17
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?

我是在断开usb连接以后,使用wdt延时200ms以后复位重启,就可以重新枚举。
huangxz 发表于 2013-1-16 14:24 | 显示全部楼层
LOVE_ELEC 发表于 2013-1-16 14:17
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?

我的做法是断开USB以后,使用wdt延时500ms让设备复位重启,就可以重新枚举
 楼主| LOVE_ELEC 发表于 2013-1-16 14:27 | 显示全部楼层
可是我的代码已经指引到另一段程序中去了!复位重启的话就不能在那段程序中执行了!还有你使用的是固件库吗?哪一版本的?在我使用的固件库中找不到你上面使用的名称啊?
huangxz 发表于 2013-1-16 14:44 | 显示全部楼层
自己修改的啊,其实很简单啊,不管你如何启动,复位总是没有问题的啊,除非你的固件是动态下载的。
代码是在
  1. /**
  2.   ******************************************************************************
  3.   * @file    usb_bsp.c
  4.   * @author  MCD Application Team
  5.   * @version V1.1.0
  6.   * @date    19-March-2012
  7.   * @brief   This file is responsible to offer board support package and is
  8.   *          configurable by user.
  9.   ******************************************************************************
  10.   * @attention
  11.   *
  12.   * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
  13.   *
  14.   * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  15.   * You may not use this file except in compliance with the License.
  16.   * You may obtain a copy of the License at:
  17.   *
  18.   *        http://www.st.com/software_license_agreement_liberty_v2
  19.   *
  20.   * Unless required by applicable law or agreed to in writing, software
  21.   * distributed under the License is distributed on an "AS IS" BASIS,
  22.   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23.   * See the License for the specific language governing permissions and
  24.   * limitations under the License.
  25.   *
  26.   ******************************************************************************
  27.   */
 楼主| LOVE_ELEC 发表于 2013-1-16 14:57 | 显示全部楼层
我用的STM32F107VCT6芯片,该模块说明设备能够支持软件断开和连接!找到有一个寄存器中有此操作!但是操作之后就会不能执行接下来的代码?
 楼主| LOVE_ELEC 发表于 2013-1-16 15:02 | 显示全部楼层
huangxz 发表于 2013-1-16 14:44
自己修改的啊,其实很简单啊,不管你如何启动,复位总是没有问题的啊,除非你的固件是动态下载的。
代码是在 ...

现在断开和连接问题已解决,刚才是延时不对!但是还是不能识别设备!主机找不到相应的驱动!我是想实现对固件的更新!当检测到更新版本的固件时就会将程序引导到固化到 Falsh 的 DFU 程序!现在是能够引导,但是主机不能正常的为其加载驱动?
huangxz 发表于 2013-1-16 15:14 | 显示全部楼层
LOVE_ELEC 发表于 2013-1-16 15:02
现在断开和连接问题已解决,刚才是延时不对!但是还是不能识别设备!主机找不到相应的驱动!我是想实现对 ...

这个也很好办,stm32有备份寄存器,你在需要更新的时候设置一下备份寄存器,然后重启以后根据你的设置值判断是直接运行原有固件还是进入dfu就可以拉。
 楼主| LOVE_ELEC 发表于 2013-1-16 15:28 | 显示全部楼层
嗯!这个以前没用过!我去试下!
 楼主| LOVE_ELEC 发表于 2013-1-16 17:48 | 显示全部楼层
huangxz 发表于 2013-1-16 15:14
这个也很好办,stm32有备份寄存器,你在需要更新的时候设置一下备份寄存器,然后重启以后根据你的设置值判 ...

已实现!我想再问下可不可以直接用变量去实现,就是有没有什么方式可以保证一个变量不会因为复位而改变他的值!
huangxz 发表于 2013-1-16 17:57 | 显示全部楼层
LOVE_ELEC 发表于 2013-1-16 17:48
已实现!我想再问下可不可以直接用变量去实现,就是有没有什么方式可以保证一个变量不会因为复位而改变他 ...

除了备份寄存器外,有些mcu还有备份ram,通用的ram都不能保证,不过楼主也可以使用eeprom,flash等非易失存储器,他们掉电都不会丢失数据,就是操作比较麻烦而已:lol
 楼主| LOVE_ELEC 发表于 2013-1-16 18:02 | 显示全部楼层
huangxz 发表于 2013-1-16 17:57
除了备份寄存器外,有些mcu还有备份ram,通用的ram都不能保证,不过楼主也可以使用eeprom,flash等非易失存储 ...

谢谢!问题已经解决!以后还请您多指教!
huangxz 发表于 2013-1-16 18:10 | 显示全部楼层
:lol不敢当,二姨上高手如云,俺也是一菜鸟而已,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:生命不息,奋斗不止!

21

主题

205

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部