一.USB MSC 这一节介绍usb作为主机读取U盘设备,通过USB虚拟串口通信。程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备,PE2设置为GPIO输出模式,USB口输出电压给从设备。 USB HOST选择大容量存储主机类,选择USB Disk开启FATFS文件系统。 在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。 USB_OTG_FS为默认配置不作修改。 中间件USB_HOST配置中,USB主机调试等级(USBH_DEBUG_LEVEL)选择2,此时用户信息和错误信息会通过标准输出设备显示,此处使用屏幕作为输出设备,故printf函数打印的信息会显示在屏幕上。 最后设置堆栈大小。 生成报告以及初始化代码,编译程序。应用层多出下面三个文件。 其中fatfs.c为文件系统的应用层文件,包含文件系统的初始化函数MX_FATFS_Init()。 usbh_conf.c为USB配置文件,包含USB管脚的初始化,寄存器参数初始化,中断回调函数等。 usb_host.c为应用层文件,包含USB HOST的初始化函数MX_USB_HOST_Init(),以及HOST后台任务函数MX_USB_HOST_Process(),由于程序中没有使用操作系统,次函数必须添加到main函数的while循环中。用户处理函数USBH_UserProcess()。 /* * user callbak definition */ static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) { /* USER CODE BEGIN 2 */ switch(id) { case HOST_USER_SELECT_CONFIGURATION: break; case HOST_USER_DISCONNECTION: Appli_state = APPLICATION_DISCONNECT; break; case HOST_USER_CLASS_ACTIVE: Appli_state = APPLICATION_READY; break; case HOST_USER_CONNECTION: Appli_state = APPLICATION_START; break; default: break; } /* USER CODE END 2 */ }
下载下面的应用程序添加到工程中 应用程序包含下面三个文件,这三个文件可以在固件库里面找到原型。 STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\USB_Host\MSC_Standalone\Src 其中explorer.c文件里面包含搜索文件系统里面所有文件的函数Explore_Disk()。 file_operations.c文件里面包含一个文件操作函数MSC_File_Operations(),主要是新建文件,然后写内容再读取出来比较等操作,测试是否可以操作文件系统。 menu.c为菜单处理函数,更加不同状态进行不同操作。 /** * @brief Manages MSC Menu Process. * @param None * @retval None */ void MSC_MenuProcess(void) { switch(msc_demo.state) { case MSC_DEMO_START: if(Appli_state == APPLICATION_READY) { BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAtLine(35, (uint8_t *)"Press User button to start read and write operations"); /* Wait for User Input */ while((BSP_JOY_GetState() != JOY_CTR) && (Appli_state != APPLICATION_DISCONNECT)) { } msc_demo.state = MSC_DEMO_FILE_OPERATIONS; /* Prevent debounce effect for user key */ HAL_Delay(400); BSP_LCD_ClearStringLine(19); } break; case MSC_DEMO_FILE_OPERATIONS: /* Read and Write File Here */ if(Appli_state == APPLICATION_READY) { MSC_File_Operations(); BSP_LCD_SetTextColor(LCD_COLOR_GREEN); BSP_LCD_DisplayStringAtLine(35, (uint8_t *)"Press User button to display disk content"); /* Wait for User Input */ while((BSP_JOY_GetState() != JOY_CTR) && (Appli_state != APPLICATION_DISCONNECT)) { } msc_demo.state = MSC_DEMO_EXPLORER; /* Prevent debounce effect for user key */ HAL_Delay(400); BSP_LCD_ClearStringLine(19); } break; case MSC_DEMO_EXPLORER: /* Display disk content */ if(Appli_state == APPLICATION_READY) { Explore_Disk("0:/", 1); msc_demo.state = MSC_DEMO_START; /* Prevent debounce effect for user key */ HAL_Delay(400); } break; default: break; } if(Appli_state == APPLICATION_DISCONNECT) { Appli_state = APPLICATION_IDLE; LCD_LOG_ClearTextZone(); LCD_ErrLog("MSC device disconnected!\n"); msc_demo.state = MSC_DEMO_START; msc_demo.select = 0; } }
|