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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言. O, `' G# X  ?% A  P
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。( @% |6 L# z5 q) O8 }- w. w
/ `- f7 m/ N% D+ a
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。" Z$ B7 d: ~/ h1 x0 J

9 N( c' k% a$ a$ }

& W# @+ ^6 F5 X) v: L$ Z0 m02问题调研与验证
% ^/ f# l4 y/ I9 ?$ {4 U0 ^客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:# A' o$ o+ z. W- H0 M1 A$ z

9 o+ U" S# F/ e* n; A, M# |) ^3 T
微信图片_20240229161641.jpg
  ~6 r) b: ^5 n4 o0 X8 f

8 l! Z7 C/ N1 a! wUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
* q* }2 x. Q# D: T7 e
微信图片_20240229161637.jpg ; v, i5 X- V* l2 B

; H! n$ C+ f& R/ }4 x! g0 a03问题分析与解决办法
2 v# c. F  h, G) Y9 O. {
+ B; P9 W: e5 h- f  `3 DUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
0 S6 k) b! z& S2 j, ]& J4 ~8 K, W6 }8 \4 @: j8 ]8 q
微信图片_20240229161634.jpg - n  C% ]; F* n* s9 _, U3 ^
  T% x* ?; \( `& J& G: T
微信图片_20240229161631.jpg
2 c& n) I+ F4 i5 _; I

2 T* M8 q# h' G# n3 y5 }  S8 [根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
1 Y; _* W8 f3 n$ a  r! Z, C" x
% N( t1 D0 Y+ |7 P+ g( S在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:  a6 c* j: v+ H8 o1 j
' t2 m- G2 q9 T0 s) |8 b" J
微信图片_20240229161627.jpg
, i, j% A! H# J* x1 B4 Q# |& c( ~& J# ^) M
7 ]7 {- t, a6 K9 i

7 ?# W" B% Y7 h重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。, m% \, ~% n' p0 a4 ~
: b5 M9 |1 s2 b, P5 u2 _/ \, [8 ?
微信图片_20240229161624.jpg
; x, A# x! I- |9 W
+ Q% g) g2 w$ p( l9 N# A4 M7 e& X
微信图片_20240229161621.jpg
+ h6 e1 L8 e/ H8 Z% z: E) |% A- U4 B8 H( t( y  R# M# @; R
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
1 e) g. F9 l* L

  u6 m" D/ x, p其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。0 I* q4 Z4 [4 \; U9 b* k

$ F$ t  A1 @3 N9 A5 X但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。( _; K2 a) u7 ?4 W. v5 }5 N4 V
0 g: n: f3 `2 i/ M& H9 _) n! X
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。; t' D! _$ _+ L. |9 b

, r9 F% U& {% G) k- Z: `% V/ l
微信图片_20240229161538.jpg . i2 n; h3 N, b4 p( i
: U/ k  T: T" k* m
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
# @0 |8 [$ ?; t- v9 [+ s# {. k+ D- {+ O: z  W% f0 E* M
如下图所示。
  F" J8 C7 p5 K  ^. H
& |8 \( F0 J, r+ q. ]/ B8 x. ?
微信图片_20240229161532.jpg
2 v2 u% ~& T# q
! U) t8 L* p" m; B; v6 q: k5 w0 x
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
4 J$ P9 M; \& M4 }. M9 C4 B# p6 b8 l" X! D( L- i
微信图片_20240229161526.jpg
  m; p  y: V5 |) r- C
1 h% M  b& Q) ^3 S1 V
经测试,经修改后程序工作正常。' j/ D; S9 O1 Z

& D6 v3 J& p; S
& b  p; o+ e! ~9 Z/ @- C) @
04小结; I- g# A& f+ [; O
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
& H; b. J( ^# _& r: L5 d5 G0 h3 b
3 h0 V6 i' s6 x8 b, I1 \# n4 b# i
转载自: STM32单片机
  u2 t6 L0 H" x如有侵权请联系删除1 `( t( J& K. r1 E
! ?: B. {) @( M  F1 x
+ U( ]4 l& H2 }1 t, s( F
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版