一.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;
}
}
|