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+运行时优化)
追加:
调试到程序结束时寄存器R1=0x803c3800
GINTMSK=0,是不是没有写回? 如果你GCC测试通过了,你可以考虑用MDK AC5试试,有可能是程序那里还有点小问题,导致MDK AC6优化出问题。 跟进去发现在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位设置不复位由什么条件导致?谢谢! 遇到同样的问题,不优化也是这样的情况。 感觉还是时钟质量的问题。HSE经过PLL后的PLLQ还没MSI做USB时钟源靠谱。 我也遇到了同样的问题,我使用的是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问题? 我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢! 我也遇到同样的问题,我使用的是stm32h743, PLL1, PLL3和RC时钟都试了,都是timeout。寄存器的reset位被置1后一直不能置为0,所以才有了timeout。不知道哪位高手能帮忙解答这个问题?谢谢! billa_a 发表于 2023-8-12 18:28
我也遇到了同样的问题,我使用的是stm32h743的high speed USB模式, PLL1, PLL3和RC时钟都试了,corereset都 ...
外接高速PHY芯片没,如果外接了,得查查硬件问题。 谢谢!我去查一下硬件
billa_a,你的问题解决没,我也遇到同样的问题,USB_CoreReset timeout.,我用的H750+USB3300 目前在STM32U5上也遇到USB不能复位的问题,时钟源也换了几个了,由于引脚不够,没用HSE。只有慢慢填坑。 我前几天写的还可以用,只是不能枚举出设备,但是后面改了代码后就一直Timeout了,新建工程也不行很奇怪 我那个找到问题了后面接错线硬件错了,一开始调整超时时间也不行,仔细看看发现硬件错了 STM32U5的USB不复位的问题,解决了,参考以下网址:
https://community.st.com/t5/stm32-mcus-products/stm32u5ax-usb-corereset-timeout/m-p/574611
以前也有生成定时器代码时,不使能定时器的现象。
页:
[1]