caxfan 发表于 2021-4-26 18:55:04

USB设备问题

本帖最后由 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+运行时优化)

caxfan 发表于 2021-4-26 21:58:13

追加:
调试到程序结束时寄存器R1=0x803c3800
GINTMSK=0,是不是没有写回?

eric2013 发表于 2021-4-27 08:44:19

如果你GCC测试通过了,你可以考虑用MDK AC5试试,有可能是程序那里还有点小问题,导致MDK AC6优化出问题。

caxfan 发表于 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位设置不复位由什么条件导致?谢谢!

ccschen 发表于 2023-7-24 12:59:03

遇到同样的问题,不优化也是这样的情况。

ccschen 发表于 2023-7-24 18:03:06

感觉还是时钟质量的问题。HSE经过PLL后的PLLQ还没MSI做USB时钟源靠谱。

billa_a 发表于 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问题?

billa_a 发表于 2023-8-12 18:36:51

我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢!

billa_a 发表于 2023-8-12 18:37:05

我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢!

eric2013 发表于 2023-8-13 08:51:15

billa_a 发表于 2023-8-12 18:28
我也遇到了同样的问题,我使用的是stm32h743的high speed USB模式, PLL1, PLL3和RC时钟都试了,corereset都 ...

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

billa_a 发表于 2023-8-13 19:08:14

谢谢!我去查一下硬件

sunboom 发表于 2023-12-21 14:37:17


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

ccschen 发表于 2024-1-25 13:05:33

目前在STM32U5上也遇到USB不能复位的问题,时钟源也换了几个了,由于引脚不够,没用HSE。只有慢慢填坑。

是舒克呀 发表于 2024-1-29 09:54:56

我前几天写的还可以用,只是不能枚举出设备,但是后面改了代码后就一直Timeout了,新建工程也不行很奇怪

是舒克呀 发表于 2024-1-29 17:21:23

我那个找到问题了后面接错线硬件错了,一开始调整超时时间也不行,仔细看看发现硬件错了

ccschen 发表于 2024-1-29 23:57:02

STM32U5的USB不复位的问题,解决了,参考以下网址:
https://community.st.com/t5/stm32-mcus-products/stm32u5ax-usb-corereset-timeout/m-p/574611

以前也有生成定时器代码时,不使能定时器的现象。
页: [1]
查看完整版本: USB设备问题