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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
7 X1 B8 r) ~$ N2 L某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。: e' T9 I" D" l. ~
& G$ [7 \: I& v6 X) z& N
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
) c( f. S7 E1 Z- Y
" j5 e) X: l/ S
* m2 [$ a* M' q' c  ?
02问题调研与验证
1 S3 K% G: s& Q- i客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:2 \6 m$ T. V" Q% ^2 ?6 I
7 O9 r3 H8 F, C7 m* B3 t/ T
微信图片_20240229161641.jpg
+ x% l; J% B! z

, e' ?& m. ^( u+ ]3 u; ]+ s& e4 WUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。; b/ e. T0 F6 W
微信图片_20240229161637.jpg 9 T( p' }$ T  Y; n

( i$ J; M5 a* P# I& o" D03问题分析与解决办法# r3 y) b1 A' v2 m6 N/ B

4 L7 T3 N% `9 nUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。" n* J0 q8 Y' @. _# A! I; m

* Z/ g- y2 z1 }; I' T  D* W
微信图片_20240229161634.jpg + B( d1 N# p  V2 L1 ]1 e* x$ M3 p

2 o1 \2 N& i' w; h
微信图片_20240229161631.jpg
5 K; i' r; r" h/ ]' y8 B7 K( B
" O+ a9 h6 E4 `: U$ g
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
1 N, @& x& @7 z. ^; l
' a. s# K  I( |6 I在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:0 B1 S" L1 Y8 ]' F  B" L

* b" G4 p, ~# P/ S' z5 y
微信图片_20240229161627.jpg ; k# c, |6 g5 x# Y) G2 X
- r! P6 ]' y, _( _2 o- B- L

9 J( C2 N2 f  s- U- m/ U5 I) R重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。
/ ^" Y. n: a# j( \& o# G* S1 K; z  q0 j; S" _; c* E8 R' {+ x
微信图片_20240229161624.jpg # b, s3 Z' y" a+ R

2 O6 p; N, U1 s. Q* U- j
微信图片_20240229161621.jpg / {0 ~* F. M4 i: j( K9 _
, I8 k0 L, t* h# W5 a( Y5 _
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
" K: N. A. v$ J! G- a

: p2 S- O" T* r) K, r* h6 V其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
* ?! o/ G+ ?7 C
2 [. w4 k7 ]7 B5 d) }; @但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。/ y: @6 ]$ g; v- V7 V* _
9 x* P& h! W! d. L& N2 E
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
9 x4 D+ }3 {. Z
5 b! {! A. Y, B6 _2 h( ?& B. p4 b
微信图片_20240229161538.jpg & O% E4 y7 x4 q( p- L
/ ]* C7 r9 f5 u2 n  ^/ B; y7 o
通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。, p/ [$ U( M+ }; @" r
) O& p" Q, ]7 p6 ]/ T0 _
如下图所示。, X; x- Z& w! t: {- z8 H% |4 r
$ o9 \; Z% |* |$ b
微信图片_20240229161532.jpg
' R3 @% H2 F$ O+ y. B: a
8 f9 g; N0 B! b6 A2 }
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
% s6 N. r' t. E$ D0 w# h7 U1 A6 V: w( W* F) k  |$ y. u
微信图片_20240229161526.jpg
3 Z$ ~# \1 \& G' L1 _; x
" I' [+ h7 }# O+ G/ p' }
经测试,经修改后程序工作正常。
3 o3 q; E1 _1 G# {; b* [2 x
4 ?9 p( y5 L% J+ t0 R- g) ~" S

+ p- \6 g. R. @' k4 q04小结6 {/ R0 E1 _. t3 N% D( \& F
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。' M8 M% ?# x  n1 d. G8 Y. R# D+ n

  c4 C+ G& p2 U# m4 e& {8 _: q$ s" l
转载自: STM32单片机
3 p9 e: z- I7 {7 b3 D0 a如有侵权请联系删除
# e8 t2 z" ?  D8 B9 ~7 J* [/ W# Q, P/ ]& U: [
$ T/ o# @; V9 k' h6 E8 [" B
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 手机版