[原创] 【 ST NUCLEO-H743ZI测评】+ USB OTG+FATFS

sylar^z   2020-5-19 00:21 楼主

    NUCLEO-H743ZI板子自带USB接口,既可以作为设备USB口,也可以作为主USB口来外接U盘、HID设备等。

 

一、硬件原理图

    NUCLEO-H743ZI板子USB接口的硬件电路。USB_VBUS、USB_DM、USB_DP、USB_ID、GND为USB5个引脚。USB_PowerSwitchOn为电源输出控制引脚。USB_OverCurrent为电源型号检测引脚。

SCH-1.png

 

二、STM32CubeMX创建工程

     首先通过STM32CubeMX来创建工程,不熟悉STM32CubeMX的朋友可以参看我上一篇帖子(https://bbs.eeworld.com.cn/thread-1122042-1-1.html)有关于STM32CubeMX创建NUCLEO-H743ZI工程的说明。

    进入NUCLEO-H743ZI的配置界面,主要配置如下几个功能项:

    1. USB_OTG_FS配置

CubeMX-1.png

    左边列表选择USB_OTG_FS,配置模式为Host_Only,并启用VBUS_sensing检测。开启global中断。其他默认即可。

 

    2. USB中间层功能配置

CubeMX-2.png     

    左边列表选择USB_HOST,配置模式为MSC,大容量存储器模式。电源驱动选择IO输出,引脚为PG6。其他默认即可。

 

    3. FATFS功能配置

CubeMX-3.png

    左边列表选择FATFS,配置模式为USB Disk。配置中CODE_PAGE选择支持简体中文。其他默认即可。

 

    4.添加按键中断

CubeMX-5.png

    板子上的用户按键为PC13,默认配置为上升沿触发中断,即按键按下时触发。

 

    5. 保存工程后,点击右上角的GENERATE CODE自动生成工程代码

 

三、编程

    1. STM32CubeMX生成的源码文件已对USB OTG功能做了基本配置。在配置之后需要开启USB供电输出使能,代码中红色部分。

/**

  * Init USB host library, add supported class and start the library

  * @retval None

  */

void MX_USB_HOST_Init(void)

{

  /* USER CODE BEGIN USB_HOST_Init_PreTreatment */

  /* USER CODE END USB_HOST_Init_PreTreatment */

  /* Init host Library, add supported class and start the library. */

  if (USBH_Init(&hUsbHostFS, USBH_UserProcess, HOST_FS) != USBH_OK)

  {

    Error_Handler();

  }

  if (USBH_RegisterClass(&hUsbHostFS, USBH_MSC_CLASS) != USBH_OK)

  {

    Error_Handler();

  }

  if (USBH_Start(&hUsbHostFS) != USBH_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USB_HOST_Init_PostTreatment */

  /* Activate VBUS on the port */

  USBH_LL_DriverVBUS(&hUsbHostFS, 0);

  /* USER CODE END USB_HOST_Init_PostTreatment */

}

 

    2. 在USB连接、断开等事件中添加FATFS功能代码。

void MX_FATFS_Init(void)

{

  /*## FatFS: Link the USBH driver ###########################*/

  retUSBH = FATFS_LinkDriver(&USBH_Driver, USBHPath);

  /* USER CODE BEGIN Init */

  /* additional user code for init */ 

  /* USER CODE END Init */

}

 

/*

 * user callback definition

 */

static void USBH_UserProcess  (USBH_HandleTypeDef *phost, uint8_t id)

{

  /* USER CODE BEGIN CALL_BACK_1 */

  switch(id)

  {

  case HOST_USER_SELECT_CONFIGURATION:

  break;

 

  case HOST_USER_DISCONNECTION:

  Appli_state = APPLICATION_DISCONNECT;

  FATFS_UnLinkDriver(USBHPath);

  f_mount(NULL, "", 0);

  break;

 

  case HOST_USER_CLASS_ACTIVE:

  Appli_state = APPLICATION_READY;

  break;

 

  case HOST_USER_CONNECTION:

  Appli_state = APPLICATION_START;

  f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 0);

  break;

 

  default:

  break;

  }

  /* USER CODE END CALL_BACK_1 */

}

 

 

     3. 按键中断处理。置一个标志位。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

  if(USER_Btn_Pin == GPIO_Pin)

  {

    btnClickFlag = 1;

  }

}

 

    4. 按键实现创建文件功能。在主函数的while循环中添加功能代码。测试在U盘中生成文件名为testFile的txt文件。

    if(btnClickFlag)

    {

      btnClickFlag = 0;

      //创建一个文件

      f_open(&testFile, "testFile.txt", FA_CREATE_ALWAYS | FA_WRITE);

      f_close(&testFile);

    }

 

四、板子USB OTG接U盘测试。此处注意,U盘的格式须为FAT格式,NTFS、exFAT等无法识别。

板子USB OTG接U盘测试.png

 

五、文件查看,在U盘中生成testFile.txt文件。由于没有内容,文件大小为0Kb。

U盘截图-1.png

 

本帖最后由 sylar^z 于 2020-5-19 00:38 编辑

回复评论 (3)

试试在testFile.txt里写一段hello eeworld

虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2020-6-15 20:54
引用: littleshrimp 发表于 2020-6-15 20:54 试试在testFile.txt里写一段hello eeworld

我今天出差了。这个要等我回去了才能改了。

点赞  2020-6-15 22:15

终于回来啦。

在搭建好FATFS系统,生成文件后,在文件中些内容还是比较简单。

只需添加fwrite()函数将内容写入即可。

 

写hello eeworld到文件中.png

代码中的headbuff[17]数组在此仅显示内容,在此时注释掉的,程序中是定义在文件头部的。

点赞  2020-6-23 19:55
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复