用户名 立即注册 找回密码

微雪课堂

搜索
微雪课堂 STM32 STM32CubeMX系列教程 查看内容

STM32CubeMX系列教程26:USB HOST

2016-5-23 17:44| 发布者: waveshare-admin| 查看: 53323| 评论: 2

摘要: 本章讲解USB作为主机使用的例程。
一.USB MSC 
     这一节介绍usb作为主机读取U盘设备,通过USB虚拟串口通信。程序在LCD滚动显示字符工程的基础上修改,复制工程修改文件夹名。打开STM32cubeMX的工程文件重新配置,USB_OTG_FS选择设备,PE2设置为GPIO输出模式,USB口输出电压给从设备。


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()。
usbh_conf.c为USB配置文件,包含USB管脚的初始化,寄存器参数初始化,中断回调函数等。
usb_host.c为应用层文件,包含USB HOST的初始化函数MX_USB_HOST_Init(),以及HOST后台任务函数MX_USB_HOST_Process(),由于程序中没有使用操作系统,次函数必须添加到main函数的while循环中。用户处理函数USBH_UserProcess()。

01/*
02 * user callbak definition
03*/
04static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)
05{
06  
07  /* USER CODE BEGIN 2 */
08  switch(id)
09  {
10  case HOST_USER_SELECT_CONFIGURATION:
11  break;
12      
13  case HOST_USER_DISCONNECTION:
14  Appli_state = APPLICATION_DISCONNECT;
15  break;
16      
17  case HOST_USER_CLASS_ACTIVE:
18  Appli_state = APPLICATION_READY;
19  break;
20  
21  case HOST_USER_CONNECTION:
22  Appli_state = APPLICATION_START;
23  break;
24  
25  default:
26  break;
27  }
28  /* USER CODE END 2 */
29}


下载下面的应用程序添加到工程中


应用程序包含下面三个文件,这三个文件可以在固件库里面找到原型。
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为菜单处理函数,更加不同状态进行不同操作。

01/**
02  * @brief  Manages MSC Menu Process.
03  * @param  None
04  * @retval None
05  */
06void MSC_MenuProcess(void)
07{
08  switch(msc_demo.state)
09  {
10  case MSC_DEMO_START:
11    if(Appli_state == APPLICATION_READY)
12    {
13      BSP_LCD_SetTextColor(LCD_COLOR_GREEN);
14      BSP_LCD_DisplayStringAtLine(35, (uint8_t *)"Press User button to start read and write operations");
15        
16      /* Wait for User Input */
17      while((BSP_JOY_GetState() != JOY_CTR) && (Appli_state != APPLICATION_DISCONNECT))
18      {
19      }
20      msc_demo.state = MSC_DEMO_FILE_OPERATIONS;
21        
22      /* Prevent debounce effect for user key */
23      HAL_Delay(400);
24        
25      BSP_LCD_ClearStringLine(19);
26    }
27    break;
28      
29  case MSC_DEMO_FILE_OPERATIONS:
30    /* Read and Write File Here */
31    if(Appli_state == APPLICATION_READY)
32    {
33      MSC_File_Operations();
34        
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))
39      {
40      }
41      msc_demo.state = MSC_DEMO_EXPLORER;
42        
43      /* Prevent debounce effect for user key */
44      HAL_Delay(400);
45        
46      BSP_LCD_ClearStringLine(19);
47    }
48    break;
49      
50  case MSC_DEMO_EXPLORER:
51    /* Display disk content */
52    if(Appli_state == APPLICATION_READY)
53    {
54      Explore_Disk("0:/", 1);
55      msc_demo.state = MSC_DEMO_START;
56        
57      /* Prevent debounce effect for user key */
58      HAL_Delay(400);
59    }
60    break;
61      
62  default:
63    break;
64  }
65    
66  if(Appli_state == APPLICATION_DISCONNECT)
67  {
68    Appli_state = APPLICATION_IDLE;
69    LCD_LOG_ClearTextZone();
70    LCD_ErrLog("MSC device disconnected!\n");
71    msc_demo.state = MSC_DEMO_START;
72    msc_demo.select = 0;
73  }
74}

当USB_HOST处于未连接状态(APPLICATION_DISCONNECT)时,会显示未连接错误。
USB_HOST处于准备状态(APPLICATION_READY)时,根据MSC示例的状态进行不同操作。
第一阶段开始阶段(MSC_DEMO_START),等待按键第一次按下。
当按键按下时进入第二阶段(MSC_DEMO_FILE_OPERATIONS)进行文件读写操作测试。
再次按下按键时进入第三阶段(MSC_DEMO_EXPLORER),显示U盘目录下所有文件。程序再次回到第一阶段。

在main()函数中添加初始化函数,初始化LCD,文件系统以及MSC菜单初始化。
01/* USER CODE BEGIN 2 */
02  /* Initialize the SDRAM */
03  BSP_SDRAM_Init();
04 
05  /* Initialize the LCD */
06  BSP_LCD_Init();
07 
08  /* Clear the LCD Background layer */
09  BSP_LCD_SetLayerVisible(1,DISABLE);
10  BSP_LCD_SelectLayer(0);
11  BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
12 
13  /* Initialize LCD Log module */
14  LCD_LOG_Init();
15 
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");
20 
21  /* Initialize menu and MSC process */
22  Menu_Init();
23 
24  /* Register the file system object to the FatFs module */
25  if(f_mount(&USBH_fatfs, "", 0) != FR_OK)
26  
27      LCD_ErrLog("Cannot Initialize FatFs! \n");
28  }
29  /* USER CODE END 2 */


在while循环中添加MSC的菜单处理函数MSC_MenuProcess()

01/* USER CODE BEGIN WHILE */
02   while (1)
03   {
04       /* USER CODE END WHILE */
05       MX_USB_HOST_Process();
06 
07       /* USER CODE BEGIN 3 */
08       /* MSC Menu Process */
09       MSC_MenuProcess();
10   }
11 /* USER CODE END 3 */


在mian文件前面导入外部函数以及变量。

01/* USER CODE BEGIN PV */
02/* Private variables ---------------------------------------------------------*/
03extern FATFS USBH_fatfs;
04/* USER CODE END PV */
05 
06 
07/* USER CODE BEGIN PFP */
08/* Private function prototypes -----------------------------------------------*/
09extern void Menu_Init(void);
10extern void MSC_MenuProcess(void);
11/* USER CODE END PFP */


最后编译程序,并下载到开发板,用OTG 一端接 U 盘,另外一端接到Open746I-C核心板的USB口,按下按键按键LCD上会显U盘里面的文件。


鄙人在这里只是简单讲解一下USB的示例程序,关于USB的更多示例程序可以参考ST官方的固件库示例程序。


565

顶一下

刚表态过的朋友 (565 人)

发表评论

最新评论

引用 waveshare-admin 2016-9-18 09:34
: 这些库,ST有官方文档说明吗
下载完官方的对应的Cube库,解压里面就有说明文档。
引用 游客 2016-9-14 19:06
这些库,ST有官方文档说明吗

查看全部评论(2)

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2025-4-2 15:19 , Processed in 0.030913 second(s), 20 queries .

返回顶部