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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
/ K( {8 t. f* N8 `  H7 e  o# M+ d: B" [某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。: o# {* ?  T7 x1 p
4 g/ \/ k7 }& G
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
" A' R1 t3 ?2 }  A4 [/ I
% P$ b" t. j) G2 q- \
7 g* {' }' C- ^* l% e
02问题调研与验证
' A) z) Z' r- r; x客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:8 L5 h$ p# s' P+ p
( _" M. [* u# f/ m" E
微信图片_20240229161641.jpg   f$ Q' |" g9 x( m! P2 q
% e) ]" {' g( h4 |9 O! p0 U: B' _3 B
USB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
5 r: s+ Z0 e) Q7 V
微信图片_20240229161637.jpg ) n/ C/ r3 n  Q' p& Z& j+ ~$ Y
* r" Y/ ?# g) k! s( E' ?
03问题分析与解决办法
, ]* S4 y$ v, N- W) \7 y: r6 p* N3 g9 l
4 q$ v& P# O1 I9 M9 g- rUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
7 l' G. `& M/ y' F! ?2 R: s& M
$ w/ A' k5 b" ^0 g3 ~4 X6 j5 V
微信图片_20240229161634.jpg
9 X- D) A, a2 _0 [* Z: H4 w: D5 F7 }3 x1 L/ y* {3 B; W
微信图片_20240229161631.jpg
! F5 A4 S+ z% `$ C# l! C3 F% t/ o
. @( M; l: h, Y, m
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
( Y$ p! n& U' T
; L7 r+ P" l% f* L5 _在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:$ [! w- C2 |7 \1 E1 j: w# l5 k
" \% W$ Y$ p- a. f# J; T
微信图片_20240229161627.jpg : r  B- |& i0 m3 E* x7 j; d

; g( X; V/ K. u: i' C6 y5 p3 ~

) C, Z; @' p0 S  B- X& W重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。/ f7 ?9 ?. j  D$ F

# J0 z  ~  l! x6 m" F. g
微信图片_20240229161624.jpg 2 K6 A. E: \3 ]/ g9 R$ ?3 {

  f4 k* r0 y5 Z9 F* ~# }
微信图片_20240229161621.jpg
7 P; @6 Y+ T8 D+ I$ V7 b! m4 Y
  I, V4 J: q6 c6 ]到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。% @' O" v$ _2 r  j8 t

, e! r# ]$ u! h# b其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。7 V( s) I! H3 {! e
& q% _; G: d2 n4 F5 k
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
$ W  U7 `& h* N! T/ g! P( W

) t- {: ~. @6 U4 T; d查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。
/ F) q) y$ ]: r% K& k; k
) G( H. \; f7 u! e0 s/ \" z& M) M
微信图片_20240229161538.jpg ) D( X4 b, P+ l3 g* M

' Y' F1 e, t' j" ~* ^/ c6 x; F0 m通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
. G: O& ]* V* D6 s* f: m  r, c0 n
如下图所示。; F: h! l# C% Y7 |! U) s
) k! S. c$ {3 b+ C; ^8 O- b7 q
微信图片_20240229161532.jpg 1 i: ^3 k. p1 u9 `
* T9 R2 P6 ~) G3 A/ Z4 _
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。; d8 C( h0 N. v: K" T0 D7 ?) C" Y1 `: F

8 |; H/ C1 _6 q
微信图片_20240229161526.jpg 8 J9 Y" k: K0 s7 e
' ]# a, L" A# X( n
经测试,经修改后程序工作正常。
) V2 P% j" I" e3 D5 E6 l/ o" G+ ~  \# p8 o( L& @1 L: b
; K* L: V; H" E# {# k
04小结
. f. k- F9 {% \  B: k2 I! o后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。, ~! e' M! I9 A% m% _) ^
4 D( h" O: J5 d9 ~2 G
: u' ~" U5 @+ U. m
转载自: STM32单片机; Q1 t/ g' t& z5 E* {* p) y
如有侵权请联系删除, r& h2 y& ^. W8 @' `2 T3 C! v. e' a: G
% A0 h9 Q, I( v  ?  _

7 k/ R9 T' G7 N; n  t% f: p8 h6 c
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 手机版