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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言' u  }8 \. }, i, B9 }( b
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。# h- J( `! m4 ?/ }2 Y' e2 X. g
1 @/ g2 X# n+ ]& X
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。9 C! d' v" o4 A% j, b1 f& D( D% T6 q, g
) W; s0 ^0 z+ q0 U
( ]- v$ y  z' B0 |; l
02问题调研与验证
5 [4 o. F; r9 s客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
6 o0 f" j  }" j, z0 B0 N" z" D
4 m, R# o  b" \5 _  J2 ?0 o, p
微信图片_20240229161641.jpg
7 o0 f' ~0 d3 _& \- u2 l' [

7 ^1 _1 c% i2 O/ H6 T3 Z1 c5 `0 IUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
/ M" n- h6 m/ C7 M4 L$ X
微信图片_20240229161637.jpg , `" K  }/ `. g& E
: M) m9 S! Z& R0 j% W7 T' {7 W
03问题分析与解决办法
0 }9 X; l* Q& i
$ N# D# b: {( [" YUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。4 T! |$ r5 t% ?& n! G" }0 ^* U" M! n- g) ^
1 c9 T8 {& a7 W) v
微信图片_20240229161634.jpg
7 J, z% Q& r& Y3 o! r
, V: ~# k6 c# u: y8 t
微信图片_20240229161631.jpg 6 y# V. M% `- `2 N+ r/ k) U# ?

. [1 C' [% W3 @0 V根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
8 H5 x2 d5 ^' A9 ]2 C' Q* g3 U2 E9 M3 F% q* Y
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
) y9 m/ x. V8 H8 Y
' e6 ]1 Q: I( v" L% X' r
微信图片_20240229161627.jpg 7 L' O1 P8 S# E" B
8 I1 o* T' R7 j, T" L

* E+ x+ Q" V7 ]; R3 j重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
# o  m+ e/ M# Y. ]. R. a9 A0 e3 B1 j% A, t! e' H4 T: ^
微信图片_20240229161624.jpg # y, \  H: \- b

6 H. l$ ^- z! w
微信图片_20240229161621.jpg
" ^% K; T0 @& z9 ^: `( `: t  X
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
4 L; w% ^( X, w- n7 N0 V; x
; K" o: K9 Z; e" X1 ~4 w* O( J( y6 ^
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
6 w8 }# P1 r* c* ~0 r+ z+ M, L: R8 _* Y, J0 {
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
4 b: g9 n8 D; I7 g
7 x- d. e6 ^0 P" C
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
3 n' y6 u5 G; b5 ^
. s& V1 L7 H( T1 j& K- t
微信图片_20240229161538.jpg * H. {& w8 G: o3 C: S/ [
3 h- I6 F$ s+ t+ U3 N/ G. i
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
" q7 v: L* G! `* I1 ?( T1 Q( h# s1 u: \9 o
如下图所示。
4 g# f7 k) |# r3 z; q9 q
# y. v9 h* E( V- R
微信图片_20240229161532.jpg 5 Q1 l% H, C9 [. b

% g7 `3 A; v9 B) G  F& I既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
0 n: q0 W- n/ s; z( H% m# Y& n5 [8 a& t3 f4 G. [
微信图片_20240229161526.jpg
1 y3 G1 s  M' X) F4 M) y0 L
- m1 e) g% B! y# I9 v8 a
经测试,经修改后程序工作正常。  M" ]1 }" G% P

1 \, L) V* d* I$ a$ p/ b
+ @, T' d+ W& o# \: J" J
04小结2 e& j; a  i4 x! n% V
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。$ |. c7 i# D7 t9 v

2 _  y! l8 H, l5 R. d) Z1 w2 R( V3 d/ R+ U; X( e: G
转载自: STM32单片机
& i  O, W* \2 e7 {3 p, F) N8 g/ H; q如有侵权请联系删除
' k5 ?- I' e. B8 ]3 K5 [
5 Q: @" i: O* x+ R0 M( e! Y& ^$ a' f" i5 T) Q
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版