基于Azure USBx 开发USB_OTG_HS MSC 应用的几个问题
1. 前言
某客户在使用STM32U599 开发一款智能手表时,需要使用USB_OTG_HS 实现USBStorage 功能。建议客户参考“STM32U575I-EVApplicationsUSBXUx_Device_MSC”例程来实现。但是,客户抱怨参考U575 的例程也无法调试通过,程序在USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通Azure USBx 的MSC storage 程序。
本文主要介绍使用STM32U599 USB_HS 开发USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
2. 问题调研与验证
客户在使用STM32CubeMX 生成USBx MSC Device 工程时采用的默认RCC 时钟树配置如下:
USB_HS 外设初始化失败,笔者在STM32U599J_DK 板上也得到了同样的结果。
3. 问题分析与解决办法
USB初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看DS13633 和RM0456对于STM32U599的USB_OTG_HS外设有如下相关描述。
根据文档描述,也就是说USB_OTG_HS这个IP Core工作于60MHZ,它是由OTG_HS_PHY Clock提供的,为了保证其精度必须使用外部晶振HSE,且OTG_HS_PHY的时钟频率仅支持16/19.2/20/24/26/32这几个频率大小。
在STM32CubeMX里将USB_OTG_HS时钟重新配置如下:
重新生成代码,下载测试可以看到USB_OTG_HS已经能够成功初始化了。
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上USB后,Windows仍然没有出现任何提示。其实,STM32CubeMX生成Azure USBx MSC Device应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application层的部分接口还需要用户去完成的。
但是,在STM32Cube_FW_U5_V1.2.0及以上的版本中,ST提供了几乎覆盖了所有常见USBx各种USB类的例程,它们分布在不同型号的ST开发版上的,这些例程是可以相互交叉参考的。客户USB_OTG_HS MSC storage参考的例程是STM32U575I-EVApplicationsUSBXUx_Device_MSC。
查看STM32U599J_DK板原理图,使用STM32CubeMX配置后发现,ST所有开发板的USB_OTG_FS/HS接口都是使能了TypeC-PD功能的,而客户板子上是没有使能TypeC-PD,直接按照USB_OTG_HS Device Only模式接的。
通过单步调试和代码跟踪,最终发现USBx里面使用了TypeC CC引脚来检测Device是否插入,当检测到有Device插入或拔出时,发出设备状态信息USB_Device_State_Msg的消息队列,通知USBx Device线程入口函数app_ux_device_thread_entry(),并做相应的USB启动和停止。客户的板子和STM32CubeMx里面并没有使能USB Type C-PD自然无法成功启动USB服务。
如下图所示。
既然问题是由于USB TypeC-PD引起,找到原因就不能解决那么问题了。只需要在USB_OTG_HS外设初始化后,直接启动USB服务,代码修改如下。
经测试,经修改后程序工作正常。
4. 小结
笔者后期在STM32U599J_DK板上进行测试,发现STM32U599的USB_OTG_HS外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议OTG HS Clock Mux选择HSE(16MHZ)作为时钟。
参考文献
文档中所用到的工具及版本
STM32CubeMX 6.8.0/IAR 9.32
LAT中的附件
STM32U599_DK_Threadx_USBx_Demo.zip
版本历史
关键词: USBx Azure USB_HS MSC Device STM32U599
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码