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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
! z1 R! w* g0 p某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
4 q3 \3 e( S2 c. w" z- W. N) e, r$ q5 |: R; s
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
( `4 f1 W3 Z" u. u* l5 w' X+ m' t2 m
% N0 h* T! ~: A. }6 A  \: ~  Y# b
  J9 O- [! {6 T0 z: ?! D
02问题调研与验证0 r8 B9 ?6 p1 e6 M, u
客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:4 D4 i5 ]. ]* {& e5 E! k8 S( H0 c

9 ~. }: v2 C$ l( ?; p& J) b
微信图片_20240229161641.jpg 7 k  V6 w0 K; S! j
  I1 T  v, W0 N- `2 f0 T
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
1 t" Y1 G. P; R# ]
微信图片_20240229161637.jpg
0 X5 m; Y/ u7 V/ t

. |1 v, w: v% j  S5 _5 |; ^03问题分析与解决办法( @$ d: V1 l( B

1 f* `( \" A6 F0 a5 m$ }  B$ ^) ~USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。' g3 L+ [  L# c3 }

  w$ i6 t0 Y2 L, |! v
微信图片_20240229161634.jpg - m* Y% d7 i: U  f1 D

2 K; C/ ^7 }6 u- V
微信图片_20240229161631.jpg + E4 f8 Q% s" u, e9 a# e) l9 j

  ?3 F9 M- D/ [" f: @* A根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。8 `% Z5 ?' R  T  p

9 |& u$ R6 S. u9 {5 r& J) V/ _9 F在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
0 x% L' R( D9 E6 P  l5 K
- X( I! C; L4 N. p
微信图片_20240229161627.jpg 1 W2 E* y3 r" w8 j' p9 O
( c8 G% [- d; B6 o+ K
% t7 E3 E# D: c% u
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
6 ~' w% Q- ^( D/ Z# Y/ l0 e4 r8 |" X  z' `, ?/ C# d, a
微信图片_20240229161624.jpg 7 {/ J. }0 h7 [
  j) h8 M5 @: I+ t" u& L
微信图片_20240229161621.jpg
+ k9 k  ?8 c/ a( L
: D; y4 j+ ]% J到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。* J3 U7 |7 d' E! k
3 r  N- l& b1 F* m9 Y
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。3 A; E6 ]5 C6 y- w

5 b2 u. j  Z  {) x3 F但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
. {. ~3 l" J9 F1 w8 g

) j+ U2 f2 \* `) R. D( q. i9 K查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。. F) x. u6 H/ \) N

- G: d3 V8 m0 f6 Q
微信图片_20240229161538.jpg ) L7 b6 o( f8 n# U' j5 G' H1 a7 V2 f
. Z: C- o3 k9 {8 R; C# J9 \$ N
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
& P  G1 S: F0 T/ B" f2 A/ |
% r1 M* h" A8 z" w: I7 H/ s如下图所示。& b: W5 N" x1 s6 T, A: ?

8 t& A& O* f" f3 k7 I
微信图片_20240229161532.jpg
: W+ s1 }2 ?2 a2 g; e- y

& T7 K3 ]- g. O$ H( p- F- W既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。3 s" k, b0 \4 n; |' V4 E1 g

2 Q% x- d  W$ Y% a$ n
微信图片_20240229161526.jpg 3 n/ H% n; L! t: U1 Y7 H4 k
. R3 S$ z4 c$ a, |: I; F" y4 q. ]
经测试,经修改后程序工作正常。/ a: a8 T4 n9 t, }+ i$ v' g

! K/ g0 S3 w& f$ `1 D% }  Y

9 ?, `# N9 {# g9 N* P+ g04小结9 G& J! ^) N1 Q; a; |* j4 L
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
* X4 u8 O" ?6 x
" t6 T4 D1 w7 A" @& T# C; [  @% @) R1 H' {2 y
转载自: STM32单片机8 S2 h. y* p9 T: t
如有侵权请联系删除* \( A, [+ L' N  C7 I4 T
9 b8 ^5 Y( T/ T9 f
% ^$ E  K1 }+ w: Q; t
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 手机版