STM32(H7)学习记录-12 STM32H7S7 USB Composite Device MSC 与 CDC

最近想做USBD MSC 与 CDC复合。使用STM32 CubeMX(版本6.12.0)软件包( CubeH7RS 1.1.0) 生成 Threadx + USBX 。但是,生成代码后发现一个问题,MSC只要一加上就有问题,不加MSC,只有CDC_ACM就是正确的。
尝试改很多东西,不是SCSI CMD 不响应,就是 识别出了U盘盘符但是打不开。
 



最终发现需要注意几个地方(尤其是前两处!)。

一、在usb_otg.c文件中 对于hpcd_USB_OTG_HS(hpcd_USB_OTG_FS)变量需要定义在内部ram,最好是AXI ram!。

#include "usb_otg.h"
 
/* USER CODE BEGIN 0 */
#if defined ( __ICCARM__ ) /* IAR Compiler */
#pragma location = ".UsbHpcdSection"
#elif defined ( __CC_ARM ) || defined(__ARMCC_VERSION) /* ARM Compiler 5/6 */
__attribute__((section(".IN_RAM")))
#elif defined ( __GNUC__ ) /* GNU Compiler */
__attribute__((section(".UsbHpcdSection")))
#endif
/* USER CODE END 0 */
 
PCD_HandleTypeDef hpcd_USB_OTG_HS;

二、在stm32H7rsxx_it.c 文件中

#include "ux_device_msc.h"
这个文件中又
#include "main.h"
#include "sdmmc.h"
#include "app_usbx_device.h"

三、中断
记得开USB 、SDMMC中断(因为我使用了SD模拟U盘)
其中SDMMC需要优先级比USB高!
四、确认USBX的用户参数
比如最大class数目,不能超过这个 ,会导致初始化失败。
抑或是 USBX栈设置太小,会导致初始化失败。
相同类型(IN / OUT)端点不要重复!对于STM32来说 IN 和 OUT是可以重复的,比如端点1的 IN / OUT, IN为 0x81,OUT为0x01。

对于记得开FIFO

HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_HS, 0x400);
/* Set Tx FIFO 0 */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 0, 0x40);
/* Set Tx FIFO 1 */
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_HS, 1, 0x100);


记得查看 Fifo最大是多少,我看了 H743 H7S7的都是4K
对于设备来说 所有OUT端点的信息都由一个FIFO接收
IN端点,则是一对一,这个内容可以在芯片的参考手册中查看!


下面是成功识别的USB复合设备结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值