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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
  O- ^# K) s# w! l某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。7 k( H6 o) x% D6 n

+ L( d% I/ z, U! A1 D3 ^本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
. Q, E& O- N- a# h! |
: D: b1 j+ M& T7 ~+ o; ^; {
2 Q. @9 a6 J9 n- W5 h! |6 X
02问题调研与验证
$ c4 n5 b8 e  E+ B  D客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
6 V' W9 \8 d& w  {* R6 Z1 `, S3 y  S* H( R, U
微信图片_20240229161641.jpg ! ]% R: w/ T  V. Z- V2 Z

" {8 \/ p: C; @2 }; Z8 BUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
' T* `  }/ Z* Q8 g: ]0 Z1 `
微信图片_20240229161637.jpg
( F7 q: U. a% @5 ?$ q8 \
8 i/ h0 }$ Q, h: T+ ^1 G! b) `
03问题分析与解决办法
% z- {4 A0 @) O# a9 t9 [, O
/ @2 b5 f# z" a% P8 z+ UUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。  g& K# ^: J# ~' `- _" {  b  i0 T
" n; W3 x$ g* x9 w
微信图片_20240229161634.jpg   {* r! F4 ~: A- Y) b" I) W

9 p+ Y. o4 A# X+ P* R
微信图片_20240229161631.jpg
+ J0 p" u  w& i5 l& G+ W
2 ~; l3 b$ C: H+ z: v6 O
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。" U/ a5 M! c6 m* t: o' }. u
! E# @: x+ [8 `( O( \6 U1 `; S
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:+ D/ ]$ {* e6 y9 i( A

8 P) y) I. j, V  ~3 N
微信图片_20240229161627.jpg # D' z6 C; `5 M' V. p
) v% O6 t5 e) d% ?
9 V8 R" ]: r: c* W5 L& i& W" G& k
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。) s5 ^( o. R) n% ^
, w  K% l1 t  D% _2 o1 _) q" i
微信图片_20240229161624.jpg 2 A' V. w7 @6 j$ V( _6 W. u1 Y

4 _: s' U6 A8 h; L
微信图片_20240229161621.jpg
: t; }2 Z2 t; e$ M' x
1 |4 E! t; W% i到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。4 u! |7 V& [4 A* }! G3 |
- C6 M/ B" J: Z
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。( Z- O" B! E7 }: \" R
* x8 R! t* S9 c. _5 ~
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。: Y. }9 F' ^% Q! Z5 E5 b
+ o' I+ [. K3 }9 Y/ i
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
3 U7 i+ J3 \6 n7 P% ?) n! v2 D7 L" q9 s9 l9 i8 b2 T% |1 v
微信图片_20240229161538.jpg
7 t3 d) p9 r7 s4 E& K7 L  D, G$ P0 S+ @  @+ `0 \3 z
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
7 {- N' W; s3 z9 u2 S  U( f4 o* A0 [9 ^' ]
如下图所示。/ X9 }9 L* e% {' Y$ ~( a- X
; {/ ]2 b/ v  T8 s* k- G$ r; e; d* g2 l5 S
微信图片_20240229161532.jpg
$ Q9 r7 K8 y9 s: Z+ I7 s

- S0 V+ |7 O7 s) q既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。0 e% {, W. _3 K$ G- V0 C

( `2 J" S$ f2 \% K. }; V$ T5 e
微信图片_20240229161526.jpg
% }" v. o3 d+ [
# N7 C2 o/ p% r! o( w- Q9 u
经测试,经修改后程序工作正常。
  g+ ~# G6 R1 [) p  `* Q+ }; s& |6 V( [1 {$ j& i7 y6 y

  _7 y4 k/ w7 O& R; B04小结# ~( \3 z# E) P+ A, o$ R  z
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
" z" h5 s& L& v8 i0 S/ Q3 O% b4 B6 H. `6 k5 e1 x% z1 |
9 p+ M# M( ~0 @
转载自: STM32单片机
% \! a, h% `7 K* \. b8 E7 l如有侵权请联系删除+ d6 o1 T! S+ ?" c) d+ @
4 A- h$ x9 P' C, N

) x/ f5 _* z; T5 `" g# p. P5 `; X+ E
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

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