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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言  }2 k) B2 [( z- @: V+ t
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
/ }% P* \5 }& H3 T2 Y9 V- x
( R# C# J" R& Y  T本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
: W/ O* q. i" x' c  v  J9 q/ k3 y

  y/ u5 M% L) T, F# G02问题调研与验证
) V% I8 u  ~* \5 O8 [% M客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:1 W" Q4 [7 H- F$ D( J2 O; B( S$ ]- y

: b( @2 F; i6 u9 `
微信图片_20240229161641.jpg
# U! |) t* T) X/ C$ H& k

1 u& q/ H: y4 D; b- i/ }+ u- u! bUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。- i; _& U8 n1 i9 l4 U" i! e
微信图片_20240229161637.jpg 2 {! ]  b: f0 o9 Y) {" C1 h: ~

' i; R( i5 q7 n4 `* Z& r* ^03问题分析与解决办法
) p2 Y( Q* i! t) a3 b7 g  g! B0 g5 }. V- N, j
USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
; ]% j8 l) `8 E* x5 m1 G8 A. J$ w4 g6 J$ v8 c. a
微信图片_20240229161634.jpg & l/ h6 |# w5 K9 i& |) @' Q3 _

! e1 w8 I& i  R! X* {5 c# w* M
微信图片_20240229161631.jpg
1 p) X" q5 z- M. K

) a$ D  U1 H# W6 v8 e/ i  ]根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
8 n2 j5 M9 G8 l0 \0 N3 I$ ?7 a* S/ ?+ y' q: c9 G6 X
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:8 S; [' z$ ?/ c" s
# N* H! q4 n) _! \4 \# w+ Z6 n1 S
微信图片_20240229161627.jpg $ e, S/ D- |: ^% d+ q

* e2 J- W6 Y4 W8 W
$ ]3 A; v- t% l5 c
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。* y  \- p# N" O
  a8 ~" ~$ Z3 J8 p' c1 Q# v6 l! O
微信图片_20240229161624.jpg 3 q$ h( P* K/ M+ I3 F+ Y' j" J+ z

4 ^+ t5 M% W. v, `8 k
微信图片_20240229161621.jpg ) }9 ]: u0 _* Z$ m0 [6 y6 W" r

  {% ?: O8 ~$ U' I0 H到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
9 T% u: C6 _) B$ i0 }% U! a" O
# z# M1 ^5 @1 m' E. S3 T7 s
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
) ?9 R' R8 G; M% k4 A% P' @7 a4 e& O+ O% p
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
3 K# d% \6 w& @$ R, b3 i# k
3 S$ h0 w8 k, c/ d. j
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。- u5 t6 L. O' l3 W' z- R

: l( n; O0 X4 J& [  Z1 `- G
微信图片_20240229161538.jpg
. _4 u: m# G* `0 p) [; X6 H' I) l( ~. E# u' a& n5 I
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
5 v. Q$ g; s' @) M
" a2 Y, E2 f1 J7 R2 |4 I如下图所示。
9 C* U# C* ?; T% ~$ \0 b5 S! @- X% O. c+ X7 E
微信图片_20240229161532.jpg $ }  a3 Z7 q+ J' H
6 a1 ?$ h; h7 m9 Z
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
7 ~5 @0 j' J9 X  Q& X2 T0 m) Z1 w- d0 ?# E, X* C% @% G
微信图片_20240229161526.jpg , G6 L  l7 s+ s5 E  E' |# d# I
9 J3 u. Z5 V% u+ ~5 n; q
经测试,经修改后程序工作正常。, F: ?; l$ L5 S! l

) h* j0 L* x7 K

$ M2 @7 p7 Z" j3 |+ Y2 y5 L1 r. k+ Y04小结/ f$ Y6 [: D$ Q* |" _
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。, Y4 T( K( }% i! @6 m; `6 O
4 U- \, E' @) @" Y9 N; N
) }% W+ r0 Q% ^# @4 l! Z
转载自: STM32单片机
9 n: f* C: P6 m4 r如有侵权请联系删除
# k4 e" {% u) A# R! x; j! f% [" g/ C8 O: n* p5 ?
+ C9 u6 x1 t% U# k
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 手机版