最近想做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复合设备结果