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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言) s/ l- ?" `* P% x. h' {* H
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
% N( H2 o5 z  C9 K- m. a
! N, Z3 b; j$ D8 y# F本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。8 W) H$ h& |- D

$ \2 o. N! n2 W( N7 `

0 }( F5 ~9 f, A( ], a02问题调研与验证
/ r- Y- K4 u# I' v. U7 a2 q: Z+ h客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:" G7 M% m; @. T' u6 D

( k5 H' @5 J  y1 P+ g) g+ i/ B2 @5 u7 q
微信图片_20240229161641.jpg
4 s* {/ o# \# k8 v3 }+ ]" f: v
1 _  a( l8 c, }( @, S, Z% w
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
" P, z% z$ G" l' D3 @
微信图片_20240229161637.jpg
: C6 I; X; m) ?  W2 v% m5 V# Q, A. o

/ c$ V$ X: j) N; o1 U9 W1 `# S03问题分析与解决办法  \" F" K! g2 @" ^- u6 [+ A3 g

+ ]7 |" f+ C7 {USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
' C# Y2 X( U5 u# N: h# G- w2 r4 y  c
微信图片_20240229161634.jpg
) B. L) Y2 O( m' @
9 K  b+ e( ^6 [- h& S* @
微信图片_20240229161631.jpg 1 a& ?% R( @/ F& N. @
6 @8 q: D8 P& P' C+ \9 C
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
: b4 ~7 O" m( z1 ~, Z0 j' x4 z; ?9 d% T1 W+ b
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:- }5 M8 M3 z# i) P* o+ p' i) p; B

' O; a+ `' y7 R/ i2 V, q* o
微信图片_20240229161627.jpg * ]9 \; R( O" e. E! V# L
4 ?  M% E% c- g, A& G( p. ^
0 t# D# t6 v0 `  @# z% o
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。' u& M8 k+ J0 F1 g. `" L& B4 T
  Q) u" F8 l/ k# m5 k* X" x
微信图片_20240229161624.jpg
1 b# x" E( O  Z: K* J" G: [. F
+ s4 D* _3 J, H& o
微信图片_20240229161621.jpg
" O' E$ _* j/ A8 Q1 }! q3 k" V! r& Z  k5 w. Y
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。. S7 t7 f3 Q/ V: g  r

( z  G) A6 u" N" O+ e1 f5 j4 m5 N其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。' m! i$ W+ h  \* D+ q+ n% o

- B3 o( d# ]: Z但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。+ y* H3 ^2 a4 W
8 F8 P" I3 q' J$ D9 f
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。& @( u" Q. L8 F) u: c6 p2 a
" i& ~$ |1 t- ^. z/ N$ N! S* O6 {8 U
微信图片_20240229161538.jpg
- ~4 e/ r8 \6 V) t+ Y0 ^% ]5 T& M
' k7 H2 T4 Z8 ~  L  T4 J. X% s  ]通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。0 p/ N# B/ B9 z, \+ L
. S! G# b% |& h: l
如下图所示。) o1 U# u! K9 ]8 p

/ f6 m: v: f( E, I
微信图片_20240229161532.jpg ' g; m/ K- h8 H: i, b$ _0 f
% \0 o0 u( w  Y& F. a' L# N) t/ R
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
  D: k4 p3 w) }. U/ F3 ]; ]$ ?* o. f" }5 m* U
微信图片_20240229161526.jpg
/ \' J+ j5 p8 {+ m/ `

& F% _4 o0 z; J9 g3 ?* x* j经测试,经修改后程序工作正常。
; j/ p& }6 C3 O0 u
$ G0 A# E( L; O! a

3 Q! D0 d6 q5 H( S+ j04小结
. E0 ~1 i, V1 m& V后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。8 n% i, s6 p5 e; Q' `% r

/ t1 n( c- y! D4 j5 D; H. r5 p. }  B% X2 w
转载自: STM32单片机
3 `! t& A+ V6 R/ O# h如有侵权请联系删除
8 T) E7 T/ @# m% @) k( ~& P3 V1 T$ F1 ]

5 U* {2 |! g( `1 l* n/ Y  j7 ~% S
赞 1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版