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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言! y, Y9 e* S: V4 ~
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
3 `+ k+ S$ E7 P5 M
1 j4 V* `+ g$ F3 h本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
! T7 P) M4 B& R* n! i7 S: T8 o. K: M% c7 X* E! m
0 @( N* M7 a/ f
02问题调研与验证
4 z% p0 w+ ]' J) b, t8 t客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:  d* t  g+ c0 o( Z4 Y5 c

( D, Y0 ]: J( L$ e9 |  F
微信图片_20240229161641.jpg
1 e- x  m0 d. n8 O# y) d' x

3 c  U  _* j  e) }) uUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
1 s  w' K" w4 W2 {8 N! E
微信图片_20240229161637.jpg 6 P3 B6 \9 y  ?# Q5 t

: M( I5 N" M) U6 C: m( A+ X03问题分析与解决办法# K4 K/ \0 E9 s9 r2 |& s
0 l* M' |7 J; \
USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
' u* h: ^  T' U* T& K: `9 M" y& }+ J3 T# n
微信图片_20240229161634.jpg
! N( o9 h. }! v5 ~8 O$ Z5 }
2 P% i: P8 |4 e; ]# y  t+ h: v
微信图片_20240229161631.jpg # g5 o( P' `3 U3 m( L  o
9 q# _9 x6 q5 P# w7 F3 I9 ~9 m
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
) Y9 B$ w7 q4 L- H3 p3 \% b
. H6 g+ Y- `( l5 w; M在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:2 f8 n' f8 v) j+ M: h! V
/ b, I/ |9 [5 d2 q& p. }+ U
微信图片_20240229161627.jpg $ p1 j) |' b- H9 V2 u
$ \; h/ b) g4 b/ s7 ?% c* s+ q5 A

- A. ^: _+ W1 E$ o9 ^  v8 s( K重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。4 q* q) T2 R7 |$ }4 {

& L' Z( d( T, f, _* Z1 y
微信图片_20240229161624.jpg 7 u" ?7 x5 A. P% w

, t; x+ n7 y3 T* \
微信图片_20240229161621.jpg
) l- s* w0 Q8 L$ P5 k5 M
9 u! B( P" |% S) R$ b到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
0 ?' Z( J1 f$ K9 u

5 @; A# `) s( R- z  f其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
8 y5 @6 [3 I; a1 O
) f" K6 L3 ~: E  H. z' y+ v8 @但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
9 {; C+ N9 B+ v
9 R6 L6 Q* v( P0 E9 n2 x+ Y
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。. ]/ Z6 u. m, f6 r3 n1 m$ y' U7 H" p
; \% X* z; K, Q
微信图片_20240229161538.jpg $ z6 [1 T* D: W) y- ]9 _

' U5 R9 R% W( w& Q, s5 T通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。. x8 S5 B' W% \# |! Y

: O$ E# }3 }" Y如下图所示。& y1 D4 t; D7 y
$ k4 D2 G$ X, ]" g& M
微信图片_20240229161532.jpg
- i5 f  K6 S. X! k7 p3 U5 J

' U- s: l; ?& s% b2 @  Y既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。. E4 ^) ?' Q7 F2 j3 g
' y) g) P+ \4 ?4 S
微信图片_20240229161526.jpg " v7 g4 L! b( a. @  ?! @+ @- k

2 ], r0 g, g! U# W& r' f经测试,经修改后程序工作正常。
7 Q1 E0 }6 ~/ c0 s; P
. `7 @& O$ L2 g
$ Q: c. H/ V, i/ U9 N2 |3 Y1 O
04小结
1 T) Z( ?+ l* O/ l后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
1 }5 [, n! U% _. L
+ `; l' L* M" Q+ [6 ?' Z" o# W( o% _+ |7 `
转载自: STM32单片机' s8 Y2 }$ x0 {
如有侵权请联系删除
! C7 P8 g. h3 u/ N0 \( X" o! p+ n1 ]2 D& r  s

7 ~1 Y! A7 ^! S  M: S& }. F! U$ g
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 手机版