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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
0 I$ ]- `' w, ?0 E8 Z某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。' b3 U4 p1 x) n* T; g

9 K$ D# |% g' Q本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
/ s  f' Q/ \* L* l- C% ^. U
7 i! K3 W. W8 V* E2 ?6 i
3 B, `) E  m# }. t* c9 h  v
02问题调研与验证
" I7 B' H8 Z5 v; A. t( g8 A客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:5 i4 P. C3 }1 M

1 z6 a1 C/ \6 [8 o$ j
微信图片_20240229161641.jpg ; O3 Q. B4 `# r; d
; r7 d) \6 v$ e" s4 ?+ U' P
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。- ]0 y! N# B+ a" F3 P8 O, c* }
微信图片_20240229161637.jpg # k* Q! n1 l: w! m3 g
5 d7 [6 W. I) G% ]
03问题分析与解决办法
: G9 P6 J) I$ J7 |  N" _9 f8 }+ Z) _, p  m+ \  Y1 s
USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
) ~, s2 h! u7 e2 }% L7 z
4 y7 G2 I9 p' O! i2 \3 L" Z0 X
微信图片_20240229161634.jpg 8 G3 i7 V) n+ `: i

7 g; o$ _( i6 [- s# f
微信图片_20240229161631.jpg 0 C2 p2 N3 S" t5 W/ T
" K0 k9 g( d5 e  s
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。! H: i" T: p# n9 t4 s; \
- N% G; `" f9 \3 [4 Z7 W
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:: T, ?% }* a6 D5 k1 Z9 g7 I
& n! J( M. v  w4 \: m
微信图片_20240229161627.jpg
# {- f6 t; ~+ J7 R; H
) X, j. T( D5 i  n5 D9 B2 g
7 p$ z+ B$ g8 X+ H
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
. z, S6 \3 r" |3 }0 k1 F' w8 a0 V# e! o! }
微信图片_20240229161624.jpg
7 y* `- Q$ v8 L. W% a, M; K6 c! H2 r
微信图片_20240229161621.jpg . K- p7 x+ E3 }: |0 v, F% t

- {  b/ I4 O6 U! l& `8 }到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
, o' J8 g, F3 `# L3 t( E
# V, O2 J" n0 v8 w. K
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。, e) q3 t; C& m' n0 R

5 l7 P( j, w  b* P" B- b但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
/ ?; U5 I7 l' C
$ f) f% E; `  F0 P1 }: Y
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
1 e; I) B* M/ _3 i1 u9 q" w, V+ p& w
1 E( I3 }8 d) A5 E' ^( x
微信图片_20240229161538.jpg
- R+ J: e4 u2 ~  \- ^
) O; E* ?) h( N  {5 O通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。5 o! m& Z8 r# A0 T& q4 b
' y- y8 _3 F! A
如下图所示。
# z! [% v8 U8 r( U6 p! J% {9 O5 h4 v$ }
微信图片_20240229161532.jpg
% F  j: l/ j: L2 w) x! H3 k# m. T0 ^
$ g6 E" g1 t2 j( |7 a& H
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。/ H2 f( O8 L' i! u4 D( U
, S0 b& G5 f5 x, \5 V, x
微信图片_20240229161526.jpg . D% Q' B2 V$ N
3 L8 \2 C5 `/ A. Z+ a9 @
经测试,经修改后程序工作正常。
  i: g: G: f+ {, F. K1 T' D8 b0 I( f0 p- Y0 y6 b
3 [5 c% N. C3 _* F7 Y9 h2 m2 H
04小结  y9 [( I2 v9 z$ m2 [3 X$ S& c
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
& n9 Y$ z" T3 u( t0 V0 h0 L' }& W9 l1 t& N6 ], y/ C/ o. }

  ]+ Z+ I' @6 l9 Q4 \转载自: STM32单片机, V7 {0 p# T4 s3 U
如有侵权请联系删除: i3 j$ t0 g2 Y" F9 x& I, R$ `$ k
" E! i1 ]! A/ W# d, `( m
3 k0 _; H0 b7 J* D8 [& W3 a; f" ~
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

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