硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8761|回复: 15
收起左侧

[有问必答] USB设备问题

[复制链接]

0

主题

7

回帖

7

积分

新手上路

积分
7
发表于 2021-4-26 18:55:04 | 显示全部楼层 |阅读模式
本帖最后由 caxfan 于 2021-4-26 22:03 编辑

最近有个项目采用mbedOS开发stm32F407 USB设备程序
采用visualGDB方式(gcc arm-none-eabi 9.3.1)成功实现USB功能,由于其它附加功能较大超过Flash容量又不想更改MPU
所以更改为keil MDK5.34编译,程序容量问题得到解决,但是USB却不识别.
具体原因是主机端发送查询命令,设备没有应答即没有进入HAL_PCD_IRQHandler(&instance->hpcd);

经过多天的排查对比两种情况的寄存器值发现keil下的GINTMSK=0而visualGDB下GINTMSK=0x803c3818.
进入程序调试发现USB初始化时运行到函数
HAL_StatusTypeDef USB_DevInit (USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cfg)
...
    /* 禁用所有中断。 */
    USBx->GINTMSK = 0U;

    /* 清除所有挂起的中断 */
    USBx->GINTSTS = 0xBFFFFFFFU;

    /* 启用常见中断 */
    if (cfg.dma_enable == DISABLE)
    {
        USBx->GINTMSK |= USB_OTG_GINTMSK_RXFLVLM;
    }

    /* 仅启用与设备模式匹配的中断 */
-->   USBx->GINTMSK |= (USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_USBRST | \
                      USB_OTG_GINTMSK_ENUMDNEM | USB_OTG_GINTMSK_IEPINT | \
                      USB_OTG_GINTMSK_OEPINT   | USB_OTG_GINTMSK_IISOIXFRM | \
                      USB_OTG_GINTMSK_PXFRM_IISOOXFRM | USB_OTG_GINTMSK_WUIM);

    if(cfg.Sof_enable)
    {
        USBx->GINTMSK |= USB_OTG_GINTMSK_SOFM;
    }

    if (cfg.vbus_sensing_enable == ENABLE)
    {
        USBx->GINTMSK |= (USB_OTG_GINTMSK_SRQIM | USB_OTG_GINTMSK_OTGINT);
    }

...
运行到-->处没有正确赋值!?
不知何故?
手动修改GINTMSK=0x803c3818则程序设备识别USB
请问是什么原因,怎么修改?谢谢!
(编译方式是armclang6.16 Oz+运行时优化)
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-4-26 21:58:13 | 显示全部楼层
追加:
调试到程序结束时寄存器R1=0x803c3800
GINTMSK=0,是不是没有写回?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2021-4-27 08:44:19 | 显示全部楼层
如果你GCC测试通过了,你可以考虑用MDK AC5试试,有可能是程序那里还有点小问题,导致MDK AC6优化出问题。
回复

使用道具 举报

0

主题

7

回帖

7

积分

新手上路

积分
7
 楼主| 发表于 2021-4-30 12:57:01 | 显示全部楼层
跟进去发现在USB_CoreReset(USB_OTG_GlobalTypeDef *USBx)超时
/* Core Soft Reset */
  count = 0U;
  USBx->GRSTCTL |= USB_OTG_GRSTCTL_CSRST;

  do
  {
    if (++count > 200000U)
    {
      return HAL_TIMEOUT;
    }
  }
  while ((USBx->GRSTCTL & USB_OTG_GRSTCTL_CSRST) == USB_OTG_GRSTCTL_CSRST);

GRSTCTL CRRST位设置后所有USB全局寄存器只读了,所以后面GINTMSK不能写回正确值.
请问CRRST位设置不复位由什么条件导致?谢谢!
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2023-7-24 12:59:03 | 显示全部楼层
遇到同样的问题,不优化也是这样的情况。
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2023-7-24 18:03:06 | 显示全部楼层
感觉还是时钟质量的问题。HSE经过PLL后的PLLQ还没MSI做USB时钟源靠谱。
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2023-8-12 18:28:29 | 显示全部楼层
我也遇到了同样的问题,我使用的是stm32h743的high speed USB模式, PLL1, PLL3和RC时钟都试了,corereset都是timeout。GRSTCTL寄存器reset前的值是2147483648,reset后是2147483649,bit1一直没有复位,反而GINTSTS寄存器由335544352变为67108897。我重新用cubemx建了一个full speed的文件,GRSTCTL寄存器reset前的值是2147483648,reset后还是2147483648,但没有timeout问题,我觉得很奇怪,不知道哪位高手能够解答一下如何解决这个timeout问题?
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2023-8-12 18:36:51 | 显示全部楼层
我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢!
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2023-8-12 18:37:05 | 显示全部楼层
我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106855
QQ
发表于 2023-8-13 08:51:15 | 显示全部楼层
billa_a 发表于 2023-8-12 18:28
我也遇到了同样的问题,我使用的是stm32h743的high speed USB模式, PLL1, PLL3和RC时钟都试了,corereset都 ...

外接高速PHY芯片没,如果外接了,得查查硬件问题。
回复

使用道具 举报

5

主题

40

回帖

55

积分

初级会员

积分
55
发表于 2023-8-13 19:08:14 | 显示全部楼层
谢谢!我去查一下硬件
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-12-21 14:37:17 | 显示全部楼层

billa_a,你的问题解决没,我也遇到同样的问题,USB_CoreReset timeout.,我用的H750+USB3300
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-1-25 13:05:33 | 显示全部楼层
目前在STM32U5上也遇到USB不能复位的问题,时钟源也换了几个了,由于引脚不够,没用HSE。只有慢慢填坑。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-1-29 09:54:56 | 显示全部楼层
我前几天写的还可以用,只是不能枚举出设备,但是后面改了代码后就一直Timeout了,新建工程也不行很奇怪
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-1-29 17:21:23 | 显示全部楼层
我那个找到问题了后面接错线硬件错了,一开始调整超时时间也不行,仔细看看发现硬件错了
回复

使用道具 举报

19

主题

125

回帖

182

积分

初级会员

积分
182
发表于 2024-1-29 23:57:02 | 显示全部楼层
STM32U5的USB不复位的问题,解决了,参考以下网址:
https://community.st.com/t5/stm3 ... -timeout/m-p/574611

以前也有生成定时器代码时,不使能定时器的现象。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-7 15:02 , Processed in 0.231478 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表