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

实战经验 | STM32H5 USBD Classic驱动 CDC移植

[复制链接]
STMCU小助手 发布时间:2024-11-13 11:29
1问题发生的背景
# f8 N8 h( R( R# a. g! z细心的用户可能会发现,使用到我们最新的STM32CubeMX 6.9.1对STM32H5的 USB外设进行配置的时候,只能用USBX,而以前的Classic USB库不能选择了。由于USBx 是基于Threadx OS的,客户更多的希望是裸机版本的,所以在这儿给大家提供一个移植的方法。7 E( J5 b% j2 r% x! p+ d
- t, R/ ]% ^0 ]! X
+ i: B( z) K/ x/ L* D
2问题的分析: @! a3 ?. @( L! Q
虽然在STM32CubeMX 6.9.1上不能使用经典的Classic USB驱动了,但是实际上在 github上,仍能发现一些可用的资源供参考:0 T: ]% Z5 I$ y3 g% Q$ O7 C- M2 c6 l
GitHub - STMicroelectronics/stm32h5-classic-coremw-apps: Provide a set of applications for STM32H5xx series based on the STM32 Classic Core Middleware libraries
5 E  X8 W4 ], s* C$ l# XGitHub - STMicroelectronics/stm32u5-classic-coremw-apps: Provide a set of applications for STM32U5xx series based on the STM32 Classic Core Middleware libraries, V7 Y& ^' g# x5 t
下载这两个链接,发现H5例程里面仅仅有Classic USB driver的HID例程,并没有 CDC的,但这对于我们想要移植来说,已经足够了。
3 y. X' T( ~$ [& }% Q; E! B
  P: P' [# ?- ~( v" Z/ V: e
! I/ c+ K* S" z( P4 E1 j- G7 G
3Classic USBD CDC驱动的移植, S1 n; P4 l/ }# T& }
3.1 解压缩编译验证原始工程
% w  Y9 ]; Q; a: ^# n对原始的H5例程进行编译,发现报如下错误:
7 C0 C7 [. J9 A( [) y8 {
12.png
根据错误的说明,查看会发现下载的示例工程里面 :0 ^" G- i- B) g- i2 b* @
驱动相关文件夹……\stm32h5-classic-coremw-apps-main\Drivers 里内容是空的;解决方法:建议将最新版本的STM32CubeH5 lib里面的Drivers全部拷贝即可(含有 BSP、CMSIS、STM3H5xx_HAL_Driver);* T* |3 T4 ]$ h9 T0 [
库文件STM32_USB_Device_Library 也为空,建议从github上下载:2 _- F; B) K/ I4 V) |! Q2 r
GitHub - STMicroelectronics/stm32_mw_usb_device: Provides the USB Device library part of the STM32Cube MCU Component "middleware" for all STM32xx series.
1 o9 D, }5 R. @  U. G1 t! z解压后,再复制stm32_mw_usb_device-master内的Core,Class的文件夹到 \stm32h5-classic-coremw-apps-main\Middlewares\ST\STM32_USB_Device_Library,编译通过,无错误。
/ w+ W7 Q! N+ B# F" a9 Z' ~2 W# x下载工程到NUCLEO H563运行,通过设备管理器能找到相应的HID设备,测试按一 下USER BUTTON按键,则鼠标也会跟着横向移动一步。" Z( K( w5 l/ G( ]
13.png
3.2 屏蔽掉USB PD相关的操作
0 J& J" t( }, n+ T" `8 Q& L0 G, a基于此,我们准备开始新建CDC的例程。) z8 H; s' L! t# T! s$ b0 N% g
14.png
细心的朋友,通过上述的列表结构,我们可以比较清楚的看到需要调整的文件:usb_device.c、usbd_desc.c、usbd_conf.c, usbd_hid.c 及其相应的头文件,另外比较显眼的是使用到的USB PD的库;这个库与USB库没有耦合关系,主要是因为我们相关开发板上USB接口使用的Type C,为了符合目前USB标准的相关协议规定,需要添加PD功能,如果客户不打算通过相关USB 标准,则这个PD功能可以移除。0 s5 x" f" a  u) [6 r& N
为了更简便的在H5上移植USB Device外设,我们将PD功能相关的库去除(如上图红色框),并屏蔽User Code部分关于USBPD的处理并解决编译错误. Main 函数可以简化为如下:: q8 T" }( d3 B) i0 d7 h' K7 H. C
15.png
在USBPD的相关初始化操作里,和USB相关的就是其调用USBD_Start函数,由于移除了 USB PD,所以我们需要添加USBD_Start函数,如下图:& H& U* E0 j3 N2 T1 I& l; c* T$ |
16.png
这时候,编译下载程序,仍然能正确的操作HID类及演示User Button功能。+ `6 x- t3 c; Y% V8 w

1 v% X, k- x" E, c8 [' d4 {. t

9 \& R) [% M# j, g3.3.实现USB CDC的枚举
* ^+ D6 x" l! U即使目前使用的是HID类,但是不同USB类,对应枚举的实现其实是一样的,所以,第一步:将usbd_hid.c 移除,项目工程中加入\stm32_mw_usb_device master\Class\CDC\Src 中的 usbd_cdc.c,并修改相应头文件名称和路径,解决编译问题;另外,由于移除了usbd_hid.c文件,所以在应用层也需要并屏蔽掉HID相关的应用层操作;主要比如HAL_GPIO_EXTI_Rising_Callback(),然后编译,会遇到下面3个错误:
7 E1 Z/ u3 Y  s7 g- S( A7 }
17.png
对于第一个错误,USBD_ClassTypeDef USBD_HID 修改为USBD_ClassTypeDef USBD_CDC,用USBD_CDC替换对应的USBD_HID解决USBD_HID的未定义的问题;对于第二个错误,修改PMA,因为CDC 类和HID使用到USB端点资源的不同,所以修改如下:
* |( D4 x* l) J, q0 a
18.png
对于第三个错误,将下面代码
; F* o( z) c6 T1 `5 }1 r0 ]" P# u! K- u
19.png
替换如下即可:
1 u- X, H' ~* X! b- k
20.png
解决好这些错误,我们再运行,会发现:0 m# ~9 Q; o' H+ ^5 Y
21.png
右击显示错误是:, S8 H8 C/ Z& w+ q# Q+ C- [1 X  w+ S
22.png
其实我们清楚,移植到这一步,肯定还是有问题的,至少我们CDC类的描述符还没有修改过来。第二步:修改usbd_desc.c文件,对于这些标准的USBD Class,可以在我们之前Classic USB 例程中寻找一个,在这里用上面提到的U5的示例;……\stm32u5-classic-coremw-apps-main\Projects\NUCLEO-U575ZI Q\Applications\USB_Device\CDC_Standalone\USB_Device\App 直接替换掉之前 HID 的 usbd_desc.c 和对应头文件,编译并出现:& z3 l2 f. z4 _+ A+ _
23.png
解决方法就是将下图中的HID_Desc修改为对应的名称,这儿用到的是CDC_Desc;
0 }9 s* i8 v! F1 |( i; i
24.png
此时再编译,发现设备管理器已经能够识别出端口了,
; _& }& I6 y8 z; @2 e
25.png
但是停下程序,发现程序进入了hardfault;" ?& G  h8 M- [) O  t
26.png
程序显示在init physical interface 时出现问题,此时我们回过头,会发现我们并没有注册USB 接口:解决方法,将:C:\TEMP\stm32h5-classic-coremw-apps main\Middlewares\ST\STM32_USB_Device_Library\Class\CDC usbd_cdc_if_template.c 和对应头文件添加入项目工程,并添加注册接口interface的函数。
4 X. A, H! e3 K7 x2 h2 ?) U$ p* {
27.png
解决编译错误,然后运行,就会发现hardfault问题解决了;但是好事多磨,运行后,会发现能枚举成功,但是USB CDC的驱动安装不成功,会出现黄色小感叹号。
! I; B0 |5 a1 Y
28.png
常规的,我们解决这个感叹号的问题:首先IAR编译其对应的MCU的脚本文件icf文件中的 heap 改大些,保险一点0x1000(有些USB 类如Audio可能需要更大),发现没有起作用。经调试对比,在如下函数内添加如下代码,并解决编译问题后,即可正确安装驱动。! V/ R5 V$ b8 w5 V. Q; y" V4 v9 F
29.png
4验证USBD CDC通信6 f8 J$ |6 k/ a1 w8 L4 u
简单的验证64个字节之内的发送与接收,修改函数如下:
4 E' H# m$ H) R$ {& q+ q. T
30.png
% ~1 B' F1 H9 j) \( v4 A! _
0 P2 O5 e  Z* E! T5 v! B* G, n/ R8 E
测试如下:2 G/ x6 A; i' y4 d. g
31.png
当然,这儿仅仅是一个简单的移植,验证CDC通信,对于实际的项目中的通信逻辑,发送包长,可以对照之前的Classic USBD CDC例程自行根据需要添加修改即可!) p  {" t- m6 s& V

1 a( c8 V- F8 f! ~' o  i1 B" W. h, W
赞 收藏 评论1 发布时间:2024-11-13 11:29

举报

1个回答
jundao721 回答时间:2024-11-13 14:54:48

还没碰到,先学习。

所属标签

相似技术帖

官网相关资源

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