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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
4 F+ Q2 _( p) _- D1 b; D( _' f$ R某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
( S8 e3 Y; p/ w4 p& G; C8 a8 I5 T, @% i7 r, F
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。- X; w" [: o+ S/ p

3 V/ a! o$ W7 f* @5 d7 _
$ G, D+ V6 T' F4 N( b
02问题调研与验证
: r. d4 }0 i4 S# U" o客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
+ g; v  c$ X! b0 B- [6 i. j! z) L5 h  N- C9 z# x
微信图片_20240229161641.jpg
1 w" \' Y* ~* T' o2 @$ P
& u& i4 B& O4 c! @) J7 c
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。- \6 L9 x1 G( \- G$ p, I5 o
微信图片_20240229161637.jpg 4 |) x0 s5 }( U( u6 G

, K8 l8 l& s3 {, x03问题分析与解决办法0 e5 K; K; `7 m

2 r% y  f5 Z  O3 C! IUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。$ D! P$ j; `' a6 G
5 |2 k& _3 q& V' u. A' `! Y& g
微信图片_20240229161634.jpg
( Z0 t5 a; W6 i) {1 P6 X! u* j
# R1 t+ ~+ D- @5 o
微信图片_20240229161631.jpg $ m$ d1 M0 d$ Y8 S+ B  Y: o7 [
9 c* b8 b1 O7 `+ T
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
* q2 T2 A/ p( b/ h- t, b4 X0 Z1 [7 ~, I; Y
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
# u$ U" f8 j. l" R# `( Y0 D# E9 ?0 j, @7 K
微信图片_20240229161627.jpg 1 v+ Q0 g, C4 L' k4 f2 A

* d( Q/ _. E% e5 W& _' U" e) K) R
  z/ o6 z, o! E' a% R
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。: R0 q1 }" i7 H4 S; Y1 {
7 O  L) Y& t& ^' X% M7 i- R6 K3 s
微信图片_20240229161624.jpg 0 j6 s" F3 k4 ]) }

9 g' m) H% C0 ^$ \2 x3 k( J0 j/ i0 j" m
微信图片_20240229161621.jpg
# I9 v$ w* x: z2 N2 W) ]! ?1 m& Z. H
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
8 X. a2 P, n5 U6 T0 x
/ l% j2 a2 Y9 `' |# b) D- P
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
9 ]5 C9 u" O7 P  c3 S8 w  K8 B, {+ {0 E% f- I! z( T' I
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。8 e0 R0 z3 c0 x# `3 j% {

( f" k, V& t4 s* W  p8 ^$ |9 x查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。0 u5 ?9 W' `8 P9 B  g+ a: L. b

5 w' [1 O9 [  R% k5 u6 [
微信图片_20240229161538.jpg & f2 V: r6 A5 x- f- f+ S5 S

& |) q& h+ k0 S通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
* ?! S% ?8 e( R  s; Y5 g* J
0 f& A7 _! @# J2 L/ g如下图所示。- g5 _7 r. ?5 C  d* T3 y/ D) V; w
! j; c: d6 w5 d1 J) X
微信图片_20240229161532.jpg ; }8 [  [4 h& \1 A8 W
7 M# n* [1 p; M; Y  P
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。* _0 ?: T& s) ^: @$ Z' q1 T3 U; v

. b4 h" G: F+ t$ u" B4 C/ d, [/ m
微信图片_20240229161526.jpg 2 K" r" D& x' L. K0 _

  X8 w7 w/ V/ Y; r7 K/ `经测试,经修改后程序工作正常。+ T, S0 ]/ Q" N" @  F

  ]  I0 k: I8 r, i2 D6 G
( ]3 {) M- H# ~6 o/ R2 p' l0 c
04小结
. o+ I' ]$ _' E( t后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
% g  i9 M6 G: R3 q$ \1 a# j5 p+ B
& ?- m  b, u2 ]5 s+ ^3 T; m5 d( E! g3 Y2 u% r" v- Y1 L
转载自: STM32单片机  ]& v# O. E/ Q2 {
如有侵权请联系删除0 z, w( B* ~' z: y( i0 Q1 Z

2 x, n7 A7 K3 L- ^- z
  j$ c) w+ H2 J
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 手机版