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

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

[复制链接]
STMCU小助手 发布时间:2024-2-29 16:17
01前言
1 h9 ~: j. H, D% ?9 D  V% n6 ?某客户在使用 STM32U599 开发一款智能手表时,需要使用 USB_OTG_HS 实现 USB Storage 功能。建议客户参考“STM32U575I-EV\Applications\USBX\Ux_Device_MSC”例程来实现。但是,客户抱怨参考 U575 的例程也无法调试通过,程序在 USB_CoreInit()无法初始化成功。在支持解决了客户初始化失败的问题后,客户反馈仍然无法调通 Azure USBx 的MSC storage 程序。
0 C0 I( O* v: {8 V3 @, U7 `' T* r% f8 Y4 j. b9 }8 N
本文主要介绍使用 STM32U599 USB_HS 开发 USBx 应用时的几个问题点,详细配置和移植过程,读者可自行参考本文附件中的工程源码。
  `5 m& s6 X/ m; C8 A' G3 L
$ H1 y# q7 S* k8 h

  {7 C* B. I  d! I$ U3 k02问题调研与验证
4 _7 y- Q* o) D客户在使用 STM32CubeMX 生成 USBx MSC Device 工程时采用的默认 RCC 时钟树配置如下:# f" N3 K- G- `
8 p/ W) u* s  q  e# U& d
微信图片_20240229161641.jpg " D) r% v3 x: l. I

8 f6 p6 \1 _$ YUSB_HS 外设初始化失败,笔者在 STM32U599J_DK 板上也得到了同样的结果。
% T5 G9 H. [# X( @( Y7 g
微信图片_20240229161637.jpg 9 F" t4 L0 }7 V6 J; |: ]
1 @7 K+ s$ ?8 [( }5 }; \
03问题分析与解决办法
* K$ p4 M, S2 f) l4 C  q5 _
/ ^1 M8 m+ w7 d# F4 eUSB 初始化失败的问题既然能够稳定复现,那么问题应该比较好找,经过查看 DS13633 和RM0456 对于 STM32U599 的 USB_OTG_HS 外设有如下相关描述。9 D  I7 g, b/ o* J& L

7 L5 u' `9 `8 ~5 D" I- w/ P
微信图片_20240229161634.jpg
3 L( z3 Z1 X9 o, j$ R- Y0 ]( ]+ O
  X' u/ W. H( b
微信图片_20240229161631.jpg
% @) D) K3 _6 _5 g) [- K
$ z( p5 C, Z) X9 t  d
根据文档描述,也就是说 USB_OTG_HS 这个 IP Core 工作于 60MHZ,它是由OTG_HS_PHY Clock 提供的,为了保证其精度必须使用外部晶振 HSE,且 OTG_HS_PHY 的时钟频率仅支持 16/19.2/20/24/26/32 这几个频率大小。2 a" G: s3 p0 o3 W  |* ]
. E# a( W. f/ I
在 STM32CubeMX 里将 USB_OTG_HS 时钟重新配置如下:
: d+ U4 u% c6 ^5 f- O- K6 k1 c) E$ Y/ w. t
微信图片_20240229161627.jpg
- r+ _  L5 T) ^4 x4 ^/ K# i% F) O- n

" b2 l2 t8 P7 `4 Y. n7 h8 |# [7 u, _/ ?重新生成代码,下载测试可以看到 USB_OTG_HS 已经能够成功初始化了。$ o( ], C3 F/ F: V4 M
+ r# n+ j5 C: U
微信图片_20240229161624.jpg
7 D& j* F2 T3 l1 a, g* q, x2 Y$ Q) }2 m* L/ o
微信图片_20240229161621.jpg / \$ Q' }2 D) o' d3 Y0 n# u

3 i- |- {, J5 D" _: ?到这一步看起来似乎问题应该解决了。然后,事实并非如此,下载程序插上 USB 后,Windows 仍然没有出现任何提示。
8 [% ?& M% h$ x3 b; I$ O' `
2 d& h6 ~( B( p0 E6 h
其实,STM32CubeMX 生成 Azure USBx MSC Device 应用时,只生成了相应的用户层级框架,并不是直接就可以工作的,application 层的部分接口还需要用户去完成的。  e4 ~$ }: e! F! H; R. H

% x) o: Q- Q+ I+ Z但是,在 STM32Cube_FW_U5_V1.2.0 及以上的版本中,ST 提供了几乎覆盖了所有常见USBx 各种 USB 类的例程,它们分布在不同型号的 ST 开发版上的,这些例程是可以相互交叉参考的。客户 USB_OTG_HS MSC storage 参考的例程是 STM32U575IEV\Applications\USBX\Ux_Device_MSC。% P9 C. A* U' S

2 }# c: P' o! I% q查看 STM32U599J_DK 板原理图,使用 STM32CubeMX 配置后发现,ST 所有开发板的USB_OTG_FS/HS 接口都是使能了 TypeC-PD 功能的,而客户板子上是没有使能 TypeC-PD,直接按照 USB_OTG_HS Device Only 模式接的。9 q& h/ \- y3 J2 A

- S$ H; G$ n3 v% |1 H
微信图片_20240229161538.jpg
  B- R' a) M0 f6 @8 e/ u4 f( g0 K
2 {* C% k2 x2 b通过单步调试和代码跟踪,最终发现 USBx 里面使用了 TypeC CC 引脚来检测 Device 是否插入,当检测到有 Device 插入或拔出时,发出设备状态信息 USB_Device_State_Msg 的消息队列,通知 USBx Device 线程入口函数 app_ux_device_thread_entry(),并做相应的 USB 启动和停止。客户的板子和 STM32CubeMx 里面并没有使能 USB Type C-PD 自然无法成功启动 USB服务。
; n2 H# b+ V. H* r0 t5 X) S# E; S8 l* r8 s# j5 ^$ p# x! h
如下图所示。" [1 w0 z* U9 K: B& n
; p( k' ~2 A, @5 Q+ s5 D2 _+ d. J/ f
微信图片_20240229161532.jpg 0 l0 E* }: G; Q
# ^8 q" H: u, Z  I8 }3 t' J! w
既然问题是由于 USB TypeC-PD 引起,找到了原因就不难解决那个问题了。只需要在USB_OTG_HS 外设初始化后,直接启动 USB 服务,代码修改如下。" L1 W+ }# @; `- z( f% H. L$ ~0 Z

" S5 {) ?/ d3 d: x7 ^: n& O
微信图片_20240229161526.jpg 3 m( C" A+ M! ~  E) L0 B

$ Y5 n! ]/ X$ e3 d4 `2 `, ^+ H经测试,经修改后程序工作正常。
! f* o4 B9 J% [7 p, |
' [6 d8 X9 n. z; k

) V+ I+ h& B. j# o( V% x# I04小结/ n! q  `/ j) X% s' m, S
后期在 STM32U599J_DK 板上进行测试,发现 STM32U599 的 USB_OTG_HS 外设时钟(OTG HS Clock Mux),对于频率及时钟源具有较强的选择性,强烈建议 OTG HS Clock Mux 选择 HSE(16MHZ)作为时钟。
  i! {1 S) C6 l: n, J. t. y; J
  a( e3 ~; z0 f# R# `0 T+ f% g; s) ]
转载自: STM32单片机
7 W/ E; b; G7 J. P$ [% q如有侵权请联系删除: c% h- B# O# v" q$ r
- `: V0 V3 W2 y) i% b
4 o, A0 d; f% n. h( ~
赞 1 收藏 1 评论1 发布时间:2024-2-29 16:17

举报

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

一键三连,学习起来

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版