NUCLEO-H743ZI板子自带USB接口,既可以作为设备USB口,也可以作为主USB口来外接U盘、HID设备等。
一、硬件原理图
NUCLEO-H743ZI板子USB接口的硬件电路。USB_VBUS、USB_DM、USB_DP、USB_ID、GND为USB5个引脚。USB_PowerSwitchOn为电源输出控制引脚。USB_OverCurrent为电源型号检测引脚。
二、STM32CubeMX创建工程
首先通过STM32CubeMX来创建工程,不熟悉STM32CubeMX的朋友可以参看我上一篇帖子(https://bbs.eeworld.com.cn/thread-1122042-1-1.html)有关于STM32CubeMX创建NUCLEO-H743ZI工程的说明。
进入NUCLEO-H743ZI的配置界面,主要配置如下几个功能项:
1. USB_OTG_FS配置
左边列表选择USB_OTG_FS,配置模式为Host_Only,并启用VBUS_sensing检测。开启global中断。其他默认即可。
2. USB中间层功能配置
左边列表选择USB_HOST,配置模式为MSC,大容量存储器模式。电源驱动选择IO输出,引脚为PG6。其他默认即可。
3. FATFS功能配置
左边列表选择FATFS,配置模式为USB Disk。配置中CODE_PAGE选择支持简体中文。其他默认即可。
4.添加按键中断
板子上的用户按键为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等无法识别。
五、文件查看,在U盘中生成testFile.txt文件。由于没有内容,文件大小为0Kb。
引用: littleshrimp 发表于 2020-6-15 20:54 试试在testFile.txt里写一段hello eeworld
我今天出差了。这个要等我回去了才能改了。