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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言: K- R, S1 ~. v! }. [3 j" n6 @( @
某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。3 F3 M6 o" E, y6 ?! f! A' T  l

% x! t2 C  q8 z' {+ r本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。1 \2 v- \' H9 j) q% L# G
) E! ]% o5 Z* K  e1 V

0 P4 Q' F- ~* H5 b2 U02问题调研与验证/ E3 y) ^+ M# a, x7 I6 h3 ^
客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:/ G) D: J0 y$ W
  f" H7 y  K2 }4 V4 b
微信图片_20240229161641.jpg
6 ?% V! a5 ]% ~" F( y6 x

* X" k9 ?! d, |$ lUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
8 @' w% U% e7 z7 q8 M+ y
微信图片_20240229161637.jpg 9 T0 |* t2 a% k6 D/ B
( J+ S( R) k" r$ F5 L
03问题分析与解决办法5 q: Y& D; e% U; f" R

0 c! i* |, u  u# y( I$ r, Z- {& Q  TUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。
1 ~4 C5 d1 Z: w3 P6 Y! G# s# D  \! f5 m4 A$ {9 V
微信图片_20240229161634.jpg
2 _0 E& F' n; c0 ]' {1 q% p  I$ A
微信图片_20240229161631.jpg " |, w* A1 a/ e* i. k, x, W5 B4 U+ x
+ D) V) b! y9 |8 p
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。
: R" h6 I3 z; T
& [: t% ^4 g7 c在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:1 [6 O" Z% D* o* C" D+ I6 w

' B4 t6 v8 U! L0 k9 z/ ~
微信图片_20240229161627.jpg 0 O/ d( B. I' P3 J

( m6 z  \; z( o/ g: h# O7 J

' t1 i5 u/ N1 i重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。& n2 @. r! C( S2 ?

( ^, \- O0 i! F: C
微信图片_20240229161624.jpg ' J, c! `1 G' }# t- c$ E
1 D1 v- [- C, Y4 T) E/ T
微信图片_20240229161621.jpg , S* {  w  k3 F+ x) R# Q
" b7 ]. m. N+ m" \* j& t
到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。% }2 z8 [$ R3 X+ k% D
4 O& l1 h. g8 ^0 i+ U, \2 r
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。
( w/ k5 P0 I( z5 C% Z- D, }& [5 ]* Z
但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。
0 h5 J- `4 N0 Z7 a! S% _
# G# h/ M9 t- c: W
查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。3 l4 s8 h# C/ W' y$ V" k1 N( H
- K3 n8 _+ \+ n! \+ F
微信图片_20240229161538.jpg ( I6 z: i! d% n# F

' @5 {' `  T: Q0 d4 c! f+ `& w通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
1 d+ O' D3 k) h/ ]
! W& C! _3 ?6 N0 j如下图所示。
; N4 g% D( o; @
$ U6 `2 ?) E% D. f% u
微信图片_20240229161532.jpg
+ @$ }8 F' }3 a9 {4 l
/ W# E6 x. s) L2 X; S0 Q/ m
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。
3 W  a& I9 T8 T/ Q! O3 A- S. {/ {
  d( I2 f# r5 X2 q9 H( {
微信图片_20240229161526.jpg
9 D, z. V1 r+ B1 W3 s9 u7 S  ?

2 T# g3 m  ^% M+ {: ]. \1 n* v经测试,经修改后程序工作正常。/ P! c* e0 z; t9 ]8 s( y

5 x: n+ z) |: V
' x/ p/ b& N- F% ~! g
04小结
" m% g; n, a- E7 C5 C* A2 K& p! ^后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
) d  S+ h# L6 p$ l0 {! V& B* G; w5 U2 H" Q- J' F5 @1 z+ x: [

' J" _" Z7 }8 S) b8 X+ g% L9 [0 j转载自: STM32单片机
: s( l8 [" @7 F3 f如有侵权请联系删除& h8 ^( }3 R  ~4 q& u1 ?3 F

7 i& Z( B$ ]1 B! R. d0 Q7 n! f  E% r: q) f! l$ C/ E' |
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 手机版