本次我们采用MM32L373 miniboard作为测试开发板。为了方便大家使用MM32 MCU的MSC功能,我们已经封装好全部代码,用户不需要自己配置以上的那些描述符等参数,只需要知道如何处理MSC的数据接收和发送即可。
软件资源如下:
对于MM32 MCU的MSC功能来说,在使用MSC功能之前先调用USB初始化函数来初始化USB协议栈。
int main(void){// USB Device Initialization and connectusbd_init();usbd_connect(__TRUE);while (!usbd_configured()) // Wait for USB Device to configure{}while (1){ ……if (flags & FLAGS_MAIN_90MS){vfs_mngr_periodic(90); // FLAGS_MAIN_90MS}……}}在MM32 MCU 的MSC功能里面,增加了一个虚拟FAT,用户不需要了解,只需要了解MSC数据收发处理函数,USB数据处理函数如下:
//MSC初始化函数 void usbd_msc_init(void){sync_init();build_filesystem();vfs_state = VFS_MNGR_STATE_DISCONNECTED;vfs_state_next = VFS_MNGR_STATE_DISCONNECTED;time_usb_idle = 0;USBD_MSC_MediaReady = 0;}//MSC读函数void usbd_msc_read_sect(uint32_t sector, uint8_t *buf, uint32_t num_of_sectors){sync_assert_usb_thread(); // dont proceed if we're not readyif (!USBD_MSC_MediaReady) {return;}vfs_read(sector, buf, num_of_sectors);}//虚拟文件读函数void vfs_read(uint32_t requested_sector, uint8_t *buf, uint32_t num_sectors){uint8_t i = 0;uint32_t current_sector;// Zero out the buffermemset(buf, 0, num_sectors * VFS_SECTOR_SIZE);current_sector = 0; for (i = 0; i = vm_start) && (requested_sector = vm_start) && (requested_sector 如上,我们就完成MM32 MCU的MSC功能,将程序下载到板子中,USB插上电脑,电脑上会枚举出U盘,如下显示:

图1 MM32 MCU模拟U盘属性U盘容量可以用户自定义,在本次程序中定义U盘64M,实际容量小于MCU flash容量,用户可以选择外扩SDRAM、MicroSD 卡或者SPI FLASH等其他存储单元,可以实现大容量数据存储功能,需要用户根据实际存储外设将USB通信和存储单元进行关联操作。

图2 电脑U盘盘符打开 U 盘,可以进行新建、复制、粘贴、格式化等操作。与操作我们的普通 U 盘没什么区别,以上就是MM32 MCU USB的MSC功能。
来源:灵动MM32MCU