打印

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

[复制链接]
6986|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 | 只看该作者
void USB_OTG_BSP_DeInit(void)
{
#ifdef USE_USB_OTG_FS
  GPIOA->MODER &= ~(0x0ful << 11*2);
  RCC->AHB2RSTR |= RCC_AHB2Periph_OTG_FS;
  RCC->AHB2RSTR &= ~(RCC_AHB2Periph_OTG_FS);
#endif
}
这样子做可以断开,我试过了:lol

使用特权

评论回复
地板
LOVE_ELEC|  楼主 | 2013-1-16 14:15 | 只看该作者
那要想重新连接呢?

使用特权

评论回复
5
LOVE_ELEC|  楼主 | 2013-1-16 14:17 | 只看该作者
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?

使用特权

评论回复
6
huangxz| | 2013-1-16 14:22 | 只看该作者
LOVE_ELEC 发表于 2013-1-16 14:17
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?

我是在断开usb连接以后,使用wdt延时200ms以后复位重启,就可以重新枚举。

使用特权

评论回复
7
huangxz| | 2013-1-16 14:24 | 只看该作者
LOVE_ELEC 发表于 2013-1-16 14:17
这样可以实现主机对设备重新枚举吗?或者实现两个设备之间的切换啊?

我的做法是断开USB以后,使用wdt延时500ms让设备复位重启,就可以重新枚举

使用特权

评论回复
8
LOVE_ELEC|  楼主 | 2013-1-16 14:27 | 只看该作者
可是我的代码已经指引到另一段程序中去了!复位重启的话就不能在那段程序中执行了!还有你使用的是固件库吗?哪一版本的?在我使用的固件库中找不到你上面使用的名称啊?

使用特权

评论回复
9
huangxz| | 2013-1-16 14:44 | 只看该作者
自己修改的啊,其实很简单啊,不管你如何启动,复位总是没有问题的啊,除非你的固件是动态下载的。
代码是在
/**
  ******************************************************************************
  * @file    usb_bsp.c
  * @author  MCD Application Team
  * @version V1.1.0
  * @date    19-March-2012
  * @brief   This file is responsible to offer board support package and is
  *          configurable by user.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>
  *
  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
  * You may not use this file except in compliance with the License.
  * You may obtain a copy of the License at:
  *
  *        http://www.st.com/software_license_agreement_liberty_v2
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
  ******************************************************************************
  */

使用特权

评论回复
10
LOVE_ELEC|  楼主 | 2013-1-16 14:57 | 只看该作者
我用的STM32F107VCT6芯片,该模块说明设备能够支持软件断开和连接!找到有一个寄存器中有此操作!但是操作之后就会不能执行接下来的代码?

使用特权

评论回复
11
LOVE_ELEC|  楼主 | 2013-1-16 15:02 | 只看该作者
huangxz 发表于 2013-1-16 14:44
自己修改的啊,其实很简单啊,不管你如何启动,复位总是没有问题的啊,除非你的固件是动态下载的。
代码是在 ...

现在断开和连接问题已解决,刚才是延时不对!但是还是不能识别设备!主机找不到相应的驱动!我是想实现对固件的更新!当检测到更新版本的固件时就会将程序引导到固化到 Falsh 的 DFU 程序!现在是能够引导,但是主机不能正常的为其加载驱动?

使用特权

评论回复
12
huangxz| | 2013-1-16 15:14 | 只看该作者
LOVE_ELEC 发表于 2013-1-16 15:02
现在断开和连接问题已解决,刚才是延时不对!但是还是不能识别设备!主机找不到相应的驱动!我是想实现对 ...

这个也很好办,stm32有备份寄存器,你在需要更新的时候设置一下备份寄存器,然后重启以后根据你的设置值判断是直接运行原有固件还是进入dfu就可以拉。

使用特权

评论回复
13
LOVE_ELEC|  楼主 | 2013-1-16 15:28 | 只看该作者
嗯!这个以前没用过!我去试下!

使用特权

评论回复
14
LOVE_ELEC|  楼主 | 2013-1-16 17:48 | 只看该作者
huangxz 发表于 2013-1-16 15:14
这个也很好办,stm32有备份寄存器,你在需要更新的时候设置一下备份寄存器,然后重启以后根据你的设置值判 ...

已实现!我想再问下可不可以直接用变量去实现,就是有没有什么方式可以保证一个变量不会因为复位而改变他的值!

使用特权

评论回复
15
huangxz| | 2013-1-16 17:57 | 只看该作者
LOVE_ELEC 发表于 2013-1-16 17:48
已实现!我想再问下可不可以直接用变量去实现,就是有没有什么方式可以保证一个变量不会因为复位而改变他 ...

除了备份寄存器外,有些mcu还有备份ram,通用的ram都不能保证,不过楼主也可以使用eeprom,flash等非易失存储器,他们掉电都不会丢失数据,就是操作比较麻烦而已:lol

使用特权

评论回复
16
LOVE_ELEC|  楼主 | 2013-1-16 18:02 | 只看该作者
huangxz 发表于 2013-1-16 17:57
除了备份寄存器外,有些mcu还有备份ram,通用的ram都不能保证,不过楼主也可以使用eeprom,flash等非易失存储 ...

谢谢!问题已经解决!以后还请您多指教!

使用特权

评论回复
17
huangxz| | 2013-1-16 18:10 | 只看该作者
:lol不敢当,二姨上高手如云,俺也是一菜鸟而已,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

21

主题

205

帖子

5

粉丝