一.USB MSC
这一节介绍u***作为主机读取U盘设备,通过USB虚拟串口通信。程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备,PE2设置为GPIO输出模式,USB口输出电压给从设备。
2
|
|
|
|
USB HOST选择大容量存储主机类,选择USB Disk开启FATFS文件系统。
|
|
|
|
|
配置系统时钟频率为216MHZ,USB频率均为48MHz。
|
|
|
|
|
在FATFS配置中选择简体中文字GBK编码支持中文,使能长文件名,缓存存储在堆(STACK)中。
|
|
|
|
|
USB_OTG_FS为默认配置不作修改。
|
|
|
|
|
中间件USB_HOST配置中,USB主机调试等级(USBH_DEBUG_LEVEL)选择2,此时用户信息和错误信息会通过标准输出设备显示,此处使用屏幕作为输出设备,故printf函数打印的信息会显示在屏幕上。
|
|
|
|
|
最后设置堆栈大小。
|
|
|
|
|
生成报告以及初始化代码,编译程序。应用层多出下面三个文件。
|
|
|
|
|
其中fatfs.c为文件系统的应用层文件,包含文件系统的初始化函数MX_FATFS_Init()。
u***h_conf.c为USB配置文件,包含USB管脚的初始化,寄存器参数初始化,中断回调函数等。
u***_host.c为应用层文件,包含USB HOST的初始化函数MX_USB_HOST_Init(),以及HOST后台任务函数MX_USB_HOST_Process(),由于程序中没有使用操作系统,次函数必须添加到main函数的while循环中。用户处理函数USBH_UserProcess()。
02 | * user callbak definition |
04 | static void USBH_UserProcess (USBH_HandleTypeDef *phost, uint8_t id) |
07 | /* USER CODE BEGIN 2 */ |
10 | case HOST_USER_SELECT_CONFIGURATION: |
13 | case HOST_USER_DISCONNECTION: |
14 | Appli_state = APPLICATION_DISCONNECT; |
17 | case HOST_USER_CLASS_ACTIVE: |
18 | Appli_state = APPLICATION_READY; |
21 | case HOST_USER_CONNECTION: |
22 | Appli_state = APPLICATION_START; |
|
|
|
|
|
下载下面的应用程序添加到工程中
USB_HOST_MSC.zip
应用程序包含下面三个文件,这三个文件可以在固件库里面找到原型。
STM32Cube_FW_F7_V1.3.0ProjectsSTM32746G-DiscoveryApplicationsUSB_HostMSC_StandaloneSrc
|
|
|
|
|
其中explorer.c文件里面包含搜索文件系统里面所有文件的函数Explore_Disk()。
file_operations.c文件里面包含一个文件操作函数MSC_File_Operations(),主要是新建文件,然后写内容再读取出来比较等操作,测试是否可以操作文件系统。
menu.c为菜单处理函数,更加不同状态进行不同操作。
[color=rgb(160, 160, 160) !important]view source
[color=rgb(160, 160, 160) !important]print[color=rgb(160, 160, 160) !important]?
02 | * @brief Manages MSC Menu Process. |
06 | void MSC_MenuProcess(void) |
08 | switch(msc_demo.state) |
11 | if(Appli_state == APPLICATION_READY) |
13 | BSP_LCD_SetTextColor(LCD_COLOR_GREEN); |
14 | BSP_LCD_DisplayStringAtLine(35, (uint8_t *)"Press User button to start read and write operations"); |
16 | /* Wait for User Input */ |
17 | while((BSP_JOY_GetState() != JOY_CTR) && (Appli_state != APPLICATION_DISCONNECT)) |
20 | msc_demo.state = MSC_DEMO_FILE_OPERATIONS; |
22 | /* Prevent debounce effect for user key */ |
25 | BSP_LCD_ClearStringLine(19); |
29 | case MSC_DEMO_FILE_OPERATIONS: |
30 | /* Read and Write File Here */ |
31 | if(Appli_state == APPLICATION_READY) |
33 | MSC_File_Operations(); |
35 | BSP_LCD_SetTextColor(LCD_COLOR_GREEN); |
36 | BSP_LCD_DisplayStringAtLine(35, (uint8_t *)"Press User button to display disk content"); |
37 | /* Wait for User Input */ |
38 | while((BSP_JOY_GetState() != JOY_CTR) && (Appli_state != APPLICATION_DISCONNECT)) |
41 | msc_demo.state = MSC_DEMO_EXPLORER; |
43 | /* Prevent debounce effect for user key */ |
46 | BSP_LCD_ClearStringLine(19); |
50 | case MSC_DEMO_EXPLORER: |
51 | /* Display disk content */ |
52 | if(Appli_state == APPLICATION_READY) |
54 | Explore_Disk("0:/", 1); |
55 | msc_demo.state = MSC_DEMO_START; |
57 | /* Prevent debounce effect for user key */ |
66 | if(Appli_state == APPLICATION_DISCONNECT) |
68 | Appli_state = APPLICATION_IDLE; |
69 | LCD_LOG_ClearTextZone(); |
70 | LCD_ErrLog("MSC device disconnected!n"); |
71 | msc_demo.state = MSC_DEMO_START; |
|
|
|
|
|
[size=1em]当USB_HOST处于未连接状态(APPLICATION_DISCONNECT)时,会显示未连接错误。
[size=1em]当USB_HOST处于准备状态(APPLICATION_READY)时,根据MSC示例的状态进行不同操作。
[size=1em]第一阶段开始阶段(MSC_DEMO_START),等待按键第一次按下。
[size=1em]当按键按下时进入第二阶段(MSC_DEMO_FILE_OPERATIONS)进行文件读写操作测试。
[size=1em]再次按下按键时进入第三阶段(MSC_DEMO_EXPLORER),显示U盘目录下所有文件。程序再次回到第一阶段。
[size=1em]
[size=1em]在main()函数中添加初始化函数,初始化LCD,文件系统以及MSC菜单初始化。
[size=1em]01 | /* USER CODE BEGIN 2 */ |
02 | /* Initialize the SDRAM */ |
05 | /* Initialize the LCD */ |
08 | /* Clear the LCD Background layer */ |
09 | BSP_LCD_SetLayerVisible(1,DISABLE); |
10 | BSP_LCD_SelectLayer(0); |
11 | BSP_LCD_SetFont(&LCD_DEFAULT_FONT); |
13 | /* Initialize LCD Log module */ |
16 | /* Show Header and Footer texts */ |
17 | LCD_LOG_SetHeader((uint8_t *)" USB OTG FS MSC Host"); |
18 | LCD_LOG_SetFooter((uint8_t *)"WaveShare Open7XXI-C board"); |
19 | LCD_UsrLog("USB Host library started.n"); |
21 | /* Initialize menu and MSC process */ |
24 | /* Register the file system object to the FatFs module */ |
25 | if(f_mount(&USBH_fatfs, "", 0) != FR_OK) |
27 | LCD_ErrLog("Cannot Initialize FatFs! n"); |
|
|
|
|
|
在while循环中添加MSC的菜单处理函数MSC_MenuProcess()。
01 | /* USER CODE BEGIN WHILE */ |
04 | /* USER CODE END WHILE */ |
05 | MX_USB_HOST_Process(); |
07 | /* USER CODE BEGIN 3 */ |
08 | /* MSC Menu Process */ |
|
|
|
|
|
在mian文件前面导入外部函数以及变量。
01 | /* USER CODE BEGIN PV */ |
02 | /* Private variables ---------------------------------------------------------*/ |
03 | extern FATFS USBH_fatfs; |
07 | /* USER CODE BEGIN PFP */ |
08 | /* Private function prototypes -----------------------------------------------*/ |
09 | extern void Menu_Init(void); |
10 | extern void MSC_MenuProcess(void); |
11 | /* USER CODE END PFP */ |
|
|
|
|
|
[size=1em]最后编译程序,并下载到开发板,用OTG 一端接 U 盘,另外一端接到Open746I-C核心板的USB口,按下按键按键LCD上会显U盘里面的文件。
[size=1em]
[size=1em]鄙人在这里只是简单讲解一下USB的示例程序,关于USB的更多示例程序可以参考ST官方的固件库示例程序。
|
|
|
|
|