打印

STM32在USB应用中的IWDG复位处理问题

[复制链接]
4497|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xing6507|  楼主 | 2009-3-25 11:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32在USB应用中,发生IWDG复位,如何保证USB设备继续工作,而不
发生USB的复位?可否将相关的寄存器保存在电池后备SRAM中?在初始化过程中
恢复。
沙发
香水城| | 2009-3-25 12:00 | 只看该作者

基本不可能恢复,因为你不知道发生看门狗复位时USB处于什

发生看门狗复位时USB可能处于任何状态,你不可能恢复到那一点上,回复到USB初始化后的状态没有意义。

使用特权

评论回复
板凳
xing6507|  楼主 | 2009-3-25 12:49 | 只看该作者

那么USB应用应当如何处理IWDG复位

进行USB的复位吗?

使用特权

评论回复
地板
香水城| | 2009-3-25 13:26 | 只看该作者

复位并重新枚举

使用特权

评论回复
5
xing6507|  楼主 | 2009-3-25 14:33 | 只看该作者

谢谢香版主

谢谢!这样必须可控制上拉D+,即除D+,D-外还需要一个IO口,
对吗?
可否只用D+,D-来完成USB复位工作?

使用特权

评论回复
6
香水城| | 2009-3-25 14:50 | 只看该作者

看门狗复位包括USB复位,程序中不需要特别做什么事情

ST提供的USB库处理了复位。

USB模块复位后,它不再响应PC来的属于旧连接的请求,PC收不到设备的响应就会自动地从新复位枚举,你不需要做特别的操作。

使用特权

评论回复
7
xing6507|  楼主 | 2009-3-25 15:49 | 只看该作者

好像不是这样的

当D+一直维持上拉到3。3V时,PC并不会再次枚举。
我用BUSHOUND观察不到再次枚举的情况,当人为进入死循环产生IWDG复位后,
USB完成复位后,PC没有再枚举,使用BUSHOUND向设备发送请求也得不到回应,
当HotPlug后,才能正常通信。

使用特权

评论回复
8
香水城| | 2009-3-25 16:01 | 只看该作者

PC不进入再次枚举是因为没有任何通讯

此时PC不知道设备是否能够响应请求。

请看我在6楼的说明:“USB模块复位后,它不再响应PC来的属于旧连接的请求,PC收不到设备的响应就会自动地从新复位枚举”,如果PC不试图与设备通信,它当然不会知道设备是否能够响应请求。


这种情况下,需要强制地插拔设备,强迫PC做出反应。实现这个强制插拔,需要把D+的1.5K上拉电阻的另一端接到某个GPIO口,这个GPIO配置为推挽输出;输出高时表示插入USB设备,输出低时表示拔出USB设备。

使用特权

评论回复
9
xing6507|  楼主 | 2009-3-25 17:37 | 只看该作者

情况是这样的

当初设计时为了少用一个IO口,直接D+上拉1.5K到3.3V的,现在
麻烦了,不用IWDG又担心干扰问题。
不过复位后,端口1的HID的输出好像没问题,但端口0的请求不能响应。
可不可以在IWDG复位时将D+配置成普通IO,强制输出0,延时
一段时间,再重新配置为USB D+功能,以模拟D+的上拉为低电平?

使用特权

评论回复
10
xing6507|  楼主 | 2009-3-26 11:12 | 只看该作者

用的是BUSHOUND

用BUSHOUND来调试的,程序改自JOYSTICK,香版主在10楼说
的办法似乎没有影响
  u16 usb_cntr;
  if (RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET) {
    usb_cntr = GetCNTR();
    SetCNTR((usb_cntr | 0x0001);
    Delay_1ms();
    SetCNTR((usb_cntr & 0xFFFE));
  }
有没有以上语句ENDP1的输出在BUSHOUND上是有的,鼠标也随动,但
BUSHOUND上的GetDescriptor等请求则invalid command,也许这是
BUSHOUND的问题。

理论上,在没有配置USB的情况下,让D+拉低对STM32应当不会有影响,对PC端也
不会有太大影响,只是不知道哟有没有时序问题。

使用特权

评论回复
11
平常人| | 2009-3-26 13:44 | 只看该作者

理论上,拉低D+不会影响PC,这是什么理论

USB协议里哪里允许这样?你的理论基础是什么?

使用特权

评论回复
12
computer00| | 2009-3-26 15:44 | 只看该作者

发一个远程唤醒信号试试。

使用特权

评论回复
13
香水城| | 2009-3-26 22:06 | 只看该作者

请在操作完FRES位后,调用Joystick_Reset()

这样保证所有寄存器初始化为原始状态。

Joystick_Reset()应该会被复位中断调用,但看门狗复位后,是否你的中断还没有开启?

使用特权

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

本版积分规则

11

主题

43

帖子

0

粉丝