STM32F407 + USB3300 实现大容量 U 盘读写

STM32F407 + USB3300 实现大容量 U 盘读写

一、硬件接线(2025-05-28 实测)

STM32F407 USB3300 说明
OTG_HS_ULPI_CK CK 60 MHz 时钟
OTG_HS_ULPI_D0…D7 D0…D7 8 位数据
OTG_HS_ULPI_DIR DIR 方向信号
OTG_HS_ULPI_NXT NXT 下一字节
OTG_HS_ULPI_STP STP 停止信号
VBUS 5 V 主机供电(P-MOS 开关)
GND GND 共地

注意USB3300 必须 3.3 V 供电60 MHz 晶振 + 18 pF 起振电容


二、CubeMX 配置

  1. RCC:HSE = 25 MHz,PLL = 168 MHzUSB OTG HS = 48 MHz
  2. USB_OTG_HS:Mode = Host_OnlyExternal PHY = ULPI
  3. USB_HOST:Class = MSCDMA = EnableFIFO = 1.25 KB
  4. FatFS:Interface = USB DiskCODE_PAGE = 936 (GBK)
  5. DMAUSB_OTG_HS_RX/TX FIFO DMA突发长度 = 4

三、Keil 工程

1. 磁盘 I/O 移植

/* usbd_diskio.c 已由 CubeMX 生成,直接调用 USBH_MSC_Read/Write */
#include "usbh_msc.h"
extern USBH_HandleTypeDef hUsbHostFS;

DSTATUS USBH_disk_initialize(BYTE pdrv)
{
    return (USBH_MSC_UnitIsReady(&hUsbHostFS, pdrv)) ? RES_OK : RES_NOTRDY;
}

DRESULT USBH_disk_read(BYTE pdrv, BYTE* buff, DWORD sector, UINT count)
{
    return (USBH_MSC_Read(&hUsbHostFS, pdrv, sector, buff, count) == USBH_OK) ? RES_OK : RES_ERROR;
}

DRESULT USBH_disk_write(BYTE pdrv, const BYTE* buff, DWORD sector, UINT count)
{
    return (USBH_MSC_Write(&hUsbHostFS, pdrv, sector, (BYTE*)buff, count) == USBH_OK) ? RES_OK : RES_ERROR;
}

2. 主函数(大容量读写测试

#include "fatfs.h"
#include "usbh_msc.h"

#define BLOCK_SIZE    512
#define BLOCK_COUNT   2000      // 1 MB 测试

uint8_t buf_tx[BLOCK_SIZE];
uint8_t buf_rx[BLOCK_SIZE];

void USB_Test_MultiBlock(void)
{
    FRESULT res;
    UINT bw, br;
    DWORD block_addr = 1000;     // 避开前 1 MB

    // 填充测试数据
    for (uint16_t i = 0; i < BLOCK_SIZE; i++) buf_tx[i] = i & 0xFF;

    // 多扇区写
    res = f_write(&file, buf_tx, BLOCK_SIZE * BLOCK_COUNT, &bw);
    if (res != FR_OK) printf("Write ERR %d\n", res);

    // 多扇区读
    res = f_read(&file, buf_rx, BLOCK_SIZE * BLOCK_COUNT, &br);
    if (res != FR_OK) printf("Read ERR %d\n", res);

    // 校验
    if (memcmp(buf_tx, buf_rx, BLOCK_SIZE * BLOCK_COUNT) == 0)
        printf("Multi-block OK, %u KB\\n", BLOCK_COUNT / 2);
    else
        printf("Data mismatch\\n");
}

参考代码 stm32f407+usb3300-实现大容量u盘读写 www.youwenfan.com/contentcsp/51706.html

四、运行结果

U 盘容量:32 GB
读速度:14.4 MB/s(Class-10)
写速度:10.6 MB/s(Class-10)
多扇区 2000×512 B:0.8 s(1 MB)

 

专注于matlab/simulink,电子电路,编程