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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言3 i7 e" ]; }4 e
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。1 H, P  ]; r- P7 t

# H9 G& i, f. X5 e4 _本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。5 I+ a) n  v. j$ }6 c1 M
1 Y0 s1 @. }! P6 }& G: Z2 f
9 y1 D6 @" x! d. }' Z' l
02问题调研与验证* c6 }! }! B0 Q. u) k5 y
客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
- B0 C8 G) j2 Q* c! x6 {1 q$ E* a3 R# t# E7 d- p; s! Y# p) c
微信图片_20240229161641.jpg
' v9 X. E, r; D- \
9 I4 K; @- W& `0 w" G
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。; L0 S. T# ?& U1 n
微信图片_20240229161637.jpg
* q' F6 ^3 @; C% U- H# E3 d1 S
; r$ x" j; L) R* O+ T" h
03问题分析与解决办法
+ L) f0 R1 W" }5 i  I  O  i
" ^  g  ~) g! _4 tUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。2 G: j1 S. }+ Q/ T- G+ h

: t( F3 m' R3 w
微信图片_20240229161634.jpg 5 f) H; k" d3 Q  q& w! A/ M' i

  x1 q0 Y, w0 E, _# @' S+ f
微信图片_20240229161631.jpg
8 \. L" I! I% S
# V* F8 n: u4 S2 s) h; c: D4 }
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
4 l: N4 o3 a; z! W6 Z/ a; U$ b5 s
# R) ~- u4 Q4 f* H( ?. f9 W  w- P在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
  u+ y6 A/ E  R9 d5 x1 }0 V; y! w
, l5 \% P; R4 j' M* u1 S
微信图片_20240229161627.jpg
6 Z1 j8 g! _9 P. f' {, t9 I4 l( s( R# q) F
' z: a5 S9 c; t! h9 W7 W! J5 [
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
" S$ i, f7 {! s
, b  Y4 a: q& e) V& z2 k+ r6 d) |
微信图片_20240229161624.jpg $ j( r1 l9 ^) e- e; H7 o% Q9 R
5 W$ w+ ~) L6 H* T
微信图片_20240229161621.jpg , I8 s0 L8 U' X# W. M, `% J

/ a: N4 P1 j( X+ w, L$ U到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
. R$ K7 b6 f- t7 q' `/ M  l! E
/ l9 C1 }/ ]2 c: f9 }
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。, `+ F( v: o# y

, _7 Y5 m0 s% N& p( `+ _6 R5 s但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
  ]$ s- {% k  c

" M  j: V4 ]1 r3 z5 J3 W3 U查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
' R4 A5 o2 ]8 ^* P+ Y
1 E3 [. Q6 P- r* A
微信图片_20240229161538.jpg
5 S) i0 T0 M3 j$ h% H4 H2 ]& G, I3 G6 R$ b# Q2 O: ?
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。, i7 w7 C3 F. `9 ^+ w
# ]6 q; N' s3 ]" [$ j# |1 ?4 D4 B
如下图所示。* b. P" _, k$ n/ x

% ?2 d" N+ [2 K% K; C
微信图片_20240229161532.jpg 1 \- c  c. b/ H+ `2 _" a2 }: v. o
) C! Q0 x  z: f
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。$ z# W7 L2 g+ S: s3 ~: k" K3 z
8 h  C$ |% {! j1 x8 s
微信图片_20240229161526.jpg
# g, r; s, `7 f. |: W- W' p1 E3 R
' ?7 x2 }5 t9 I' Q! s
经测试,经修改后程序工作正常。$ k0 h1 X* M6 C6 {/ f; ?& K5 Q7 K

; B( \$ n2 V) c( a6 y7 m& {+ r

; y( E% `7 h7 Y04小结- p; j3 H* |+ V( D) E0 i; N
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。4 O$ m0 Z6 O: L2 \+ C& q) l& E
  G4 j3 [3 }" V% `7 l9 s

; Q: C0 s9 ~5 `/ j4 y. G3 H转载自: STM32单片机
6 s6 \$ ]# y- z; a如有侵权请联系删除+ S- S4 H+ i$ H4 q

8 T# c$ X4 \) f/ I) H! ?# B- Q% y- i6 s8 t8 U1 y) S) H
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 手机版