你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32 Azure USBx 开发的经验分享

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言5 y  B3 ~- k5 i0 {0 L
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
' K9 q+ q5 F6 M( d
* S, C$ s9 k1 J, E3 w本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。" h  A# J5 x: \# ]$ v/ z

/ N! U& P$ n' B, `
, t+ k0 \8 s+ v# A
02问题调研与验证$ a! R" I. G. h- n
客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
8 }8 z  m6 o: g" P8 B" z3 T3 _8 N8 u/ f/ j
微信图片_20240229161641.jpg 9 g4 X4 p1 {9 Y- y2 n
# N, E& P; X- j' b6 N
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
4 r: D6 x  D$ L8 s) J4 e; n
微信图片_20240229161637.jpg 1 h8 \' L: O' r4 `3 x* K+ S- S9 n
" m9 D- w  m6 O" H4 ^
03问题分析与解决办法. l. `5 O5 v5 ~/ Q# c' g" J

; ^4 k( x- B4 d( N4 K- X& R' u, uUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
; w' N( g$ s& z- b7 [$ h$ B& u; ]! F- I; H7 O9 |
微信图片_20240229161634.jpg
0 F" E! h% L) g$ R6 V: Q: B, @" d; u; Q7 Q
微信图片_20240229161631.jpg
0 r( z0 ?' M; M  S; u

) L" F) F* c, C% N根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。7 H6 x- q; Q3 R# H* j1 W8 C0 k

. W5 ?/ Y4 a8 v6 n0 _在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:) J5 h" e9 ^& @/ n& _
( Z7 u" ^; p8 O, D
微信图片_20240229161627.jpg 9 Q& A/ _7 K) B7 b, ^# e% t

) Q' d2 }& M7 S( J
' f/ `+ E# A8 k3 g, X
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
) i6 [4 a0 q# r" r# y+ ?% V  c" m
8 s) h7 e5 J% h* v9 G
微信图片_20240229161624.jpg
$ c$ z4 z$ {' n( \
, e) R  }0 ]: x. ^; Y# j7 R: M
微信图片_20240229161621.jpg 3 ~3 g6 ^  I4 j4 e! D9 I  o* a1 ?

; m' z( m, R8 @: P- i5 o到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
# M4 e  o" U: f- n
3 v$ }. Z7 b* n* a# C" i/ {
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
7 o- w+ J4 d  f) L
5 \& F1 @8 e2 }但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
4 ]* k6 s3 f7 C4 _
! ]: c8 M# V# T( Y
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。- G& F3 w- r2 [# o# L

; r1 i7 a1 W1 L7 W3 Q
微信图片_20240229161538.jpg 6 @$ Y0 w) M& ?, Z
. K# g: N) G: t( I
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
0 b: q1 H- }! T4 m) W' p, ~
1 w( P8 J; z0 `8 `如下图所示。+ }1 g) \6 H5 b! y" x- r
4 L3 g0 G2 Z: B+ D) V0 J
微信图片_20240229161532.jpg
1 Z1 Y8 x2 j, J# i% L; P, C# k9 W

, C! U: e' j5 J既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。8 s# E9 f1 I2 d) `" C$ t
$ E9 {6 N. }9 I( t6 `, w
微信图片_20240229161526.jpg 3 v0 ~! ?4 }: t" E/ H0 Q4 o5 v
( u# T$ ~2 L, t( I* h
经测试,经修改后程序工作正常。
5 B. \& N  X; F* N) }
! A/ ?: Q, P2 n8 R, D# g: w' Q3 ?

9 ?# _( f' R9 O1 B04小结
+ m" z; E6 V6 h+ f后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
  d' `! n/ ?$ ^! {+ N' k8 i5 X$ V& x7 g$ H4 _: \

7 j, w7 M' {) P  Z. G转载自: STM32单片机% n- o: O5 M1 E5 V1 a
如有侵权请联系删除
' e' F2 @/ `0 d& L$ x/ u4 s3 E8 @/ n# o8 |! V  F9 @
3 o. E: T2 R1 n  d! E9 U+ Q. a- L) z3 A
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

1个回答
xu@xupt 回答时间:2024-3-1 16:59:21

一键三连,学习起来

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版