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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
5 [0 d! J, i8 a4 Z0 e某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。5 ~& Q/ O- M5 }3 |% q! P* r
0 |7 S8 g& y6 m' V# i
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
; o" _% ^) E8 T5 b) o) l8 {$ K& s# ?
& i/ F5 }! f- ?% h$ l: M% `
02问题调研与验证  A" W3 t2 V4 g5 k
客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:
- r) Z, ?: s9 U
+ g1 ]( U, I( Q6 U
微信图片_20240229161641.jpg 5 f3 @7 Q$ D" Z, ]
, j) q/ B8 W- ]
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。8 |* x) `- V8 V
微信图片_20240229161637.jpg
' ^- z5 b. ~# k) r; L/ i

6 I  u* v: g1 ?) y% s6 i- ?$ Y03问题分析与解决办法- C  J# a$ d" S8 P. H8 S
: U, q; r) C2 A' M6 r
USB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
0 _% l3 H7 T' x4 g1 @$ z9 N6 }
3 c8 u6 z  c9 ?* @. {6 z
微信图片_20240229161634.jpg
" t% p6 i4 ?7 c2 W& V9 r+ {% y
* s/ j/ }& |6 w
微信图片_20240229161631.jpg 8 E& z" p1 Y0 n9 `" }9 Q* q) b

- ]) _4 @8 c3 C根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。' G! U- |2 Q' U' b- g
5 p. B! Y& T1 J* ^
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
  l: p" i- @, R! s' B% `/ B
# y) D( B& p4 M! a6 V
微信图片_20240229161627.jpg 4 R, L% t; q( W+ J
5 [0 i- m; c0 P( H6 k# j5 h6 F
% e+ S. q: t7 Z' e  i. P/ F1 R* e
重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。7 E& `2 D' ^* _( p( Z
6 a" J* m! S+ J; E
微信图片_20240229161624.jpg
6 E( ?. _; a% k  {: j7 `' @+ O! Y& {) X
微信图片_20240229161621.jpg " G) Z8 Y7 Y0 g3 J- B( Q
: V& {( L$ M/ N+ C: y& w
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
% M- z, \  g9 B
  x& _# V) _" I. |9 Y# T
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
( j3 @9 `/ |) V; m2 F$ ]
( ]$ U0 c! `: v2 {6 b0 [9 o3 n但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。" g* {% f, R! B( B! d) o
) L) n( P" T+ ]3 c! c
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。" {9 U$ c7 b% }6 V* _* B% F. q0 n

( q' k3 \* N. V( L# w) c3 y
微信图片_20240229161538.jpg
$ K0 d% [' z4 U4 b
. [2 Q, g# V9 ~/ ~) Y' z通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。: t- {! d  S) J$ _5 J0 B

% Z9 x. D1 d" f8 a) h; @如下图所示。
' z# y, C% a. S' {7 ^" W6 `" ^. Y9 Q, M9 i  n! R: @. W9 i
微信图片_20240229161532.jpg , v! F# A9 v5 G% c: y3 O2 z

* g9 A& K% }- D7 a5 H1 w既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
8 p) @  F4 A  D* ~
% Z) s' O) |4 s/ Y! |
微信图片_20240229161526.jpg
' Y" ^' j# ~/ w; l+ W. R
+ {2 `2 n. J/ ], M7 l% i
经测试,经修改后程序工作正常。9 \: G6 Y: G! x4 U' J! m. T

2 a9 q+ L- [7 {/ C' Z
" x7 @' b6 a3 f3 m7 Y
04小结/ `9 P" |3 x5 [, P& [
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
: L7 [; C. K2 G9 W
$ z4 t* W  G+ b! s+ [+ |1 x
; k& q) W+ ?8 S转载自: STM32单片机
, C1 L9 ]( g0 \$ l8 \3 ?1 ^; n如有侵权请联系删除8 D6 [. @0 M- I* h  c

& X+ O( A: t( f: ~. C$ W& N2 @1 Y& ?1 U7 c$ ~4 w% h: \
1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版