搜索
查看: 1828|回复: 0

[分享] 如何在 STM32 上使用 USB Host 读写 U 盘?

[复制链接]

该用户从未签到

2586

主题

2613

帖子

0

蝴蝶豆

版主

最后登录
2021-3-16
发表于 2020-4-1 18:47:35 | 显示全部楼层 |阅读模式
微信图片_20200401184454.png
简介
USB(Universal Serial Bus)是一种支持热插拔的通用串行总线。它使用差分信号来传输数据,在 USB 1.0和 USB 1.1 版本中,只支持 1.5Mb/s 的低速(low-speed)模式和 12Mb/s 的全速(full-speed)模式,在 USB 2.0 中,又加入了480Mb/s 的高速模式,USB 3.0(super speed),传输速率最大5Gbps。
在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提供一个或多个连接点。USB Device 可以分为 USB Hub 和 USB FunctionUSB Hub 提供了一种低成本、低复杂度的 USB接口扩展方法。Hub 的上行端口面向 HOST,下行端口面向设备(Hub 或功能设备)。在下行端口上,Hub 提供了设备连接检测和设备移除检测的能力,并给各下行端口供电。Hub 可以单独使能各下行端口。不同端口可以工作在不同的速度等级(高速/全速/低速)。USB Function 能够通过总线传输或接收数据或控制信息的设备,在 USB2.0 标准中,别称为 Class
本文主要是基于正点原子 stm32f767-atk-apollo 开发板,给出了 USB Host 读写 U 盘的配置和使用示例。本文准备资料如下:
  • RT-Thread 源码
  • Env 工具
  • U 盘


依赖
  • RT-Thread 4.0.2+
  • RT-Thread 设备驱动框架


硬件连接准备

本文是基于 U 盘的读写,所以需要准备好一个 U 盘,并插入开发板上的 U 盘接口。

ENV 配置
打开 USB Host

RT-Thread 可以很方便的通过 ENV 来配置和生成工程。在 rt-thread\bsp\stm32\stm32f767-atk-apollo 目录下打开 ENV 工具,使用 menuconfig 进入如下配置界面并选中。

1---- Hardware Drivers Config
2    ----On-Chip Peripheral Drivers
3        ----Enable USH Host
4            ----Enable Udisk Drivers


配置界面如下图所示

微信图片_20200401184502.png

打开文件系统

本文使用的是 USB Host 读写 U 盘的功能,所以需要打开 RT-Thread 的虚拟文件系统功能,打开文件系统的操作如下

1---- RT-Thread Components
2    ----Device virtual file system
3        ----Using device virtual file system

配置界面如下图所示

微信图片_20200401184506.png

生成工程并下载

在 ENV 中打开 USB Host 和虚拟文件系统的功能之后,工程配置就结束了,退出配置界面并保存。在 ENV 工具中使用 scons --target=mdk5 命令重新生成工程并打开。工程打开之后可以看到 USB Host 的框架代码和驱动代码都已经自动加入到工程里面了,如下图所示

微信图片_20200401184509.png

在 main.c 文件中加入以下测试代码并下载

(向右滑动查看全部代码)

1#include <dfs_posix.h>
2#define TEST_FN     "/test_usbh.c"
3static char test_data[120], buffer[120];
4
5void readwrite(const char* filename)
6
{
7    int fd;
8    int index, length;
9
10    fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
11    if (fd < 0)
12    {
13        rt_kprintf("open file for write failed\n");
14        return;
15    }
16
17    for (index = 0; index < sizeof(test_data); index ++)
18    {
19        test_data[index] = index + 27;
20    }
21
22    length = write(fd, test_data, sizeof(test_data));
23    if (length != sizeof(test_data))
24    {
25        rt_kprintf("write data failed\n");
26        close(fd);
27        return;
28    }
29
30    close(fd);
31
32    fd = open(TEST_FN, O_RDONLY, 0);
33    if (fd < 0)
34    {
35        rt_kprintf("check: open file for read failed\n");
36        return;
37    }
38
39    length = read(fd, buffer, sizeof(buffer));
40    if (length != sizeof(buffer))
41    {
42        rt_kprintf("check: read file failed\n");
43        close(fd);
44        return;
45    }
46
47    for (index = 0; index < sizeof(test_data); index ++)
48    {
49        if (test_data[index] != buffer[index])
50        {
51            rt_kprintf("check: check data failed at %d\n", index);
52            close(fd);
53            return;
54        }
55    }
56
57    rt_kprintf("usb host read/write udisk successful\r\n");
58
59    close(fd);
60}
61
62MSH_CMD_EXPORT(readwrite, usb host read write test);


运行测试程序

将以上程序下载入开发板之后连接串口调试工具可以看到如下调试信息

微信图片_20200401184512.png

这里可以看到 U 盘的大小约为 7.4G,说明 U 盘已经成功挂载到开发板上面的文件系统了。使用文件系统的 ls 命令查看 U 盘目录的结果如下图:

微信图片_20200401184515.png

在串口运行导出的 readwrite 测试函数的结果如下图所示 微信图片_20200401184518.png 再次使用 ls 命令可以看到在 U 盘的根目录下已经新建了一个 test_usbh.c 文件,并且大小为 120 个字节,如下图所示

微信图片_20200401184520.png

我们可以将 U 盘拔出并插在电脑上验证一下我们刚才写入的文件。

微信图片_20200401184524.png

从电脑上我们可以看到已经成功创建了一个 test_usbh.c 的文件。到这一步为止,在 STM32 上使用 USB Host 读写 U 盘的介绍就结束了
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-5-4 20:41 , Processed in 1.152823 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表