你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32上使用USB Host读写U盘

[复制链接]
eefishing 发布时间:2020-2-2 21:18
1.jpg
简介& m6 A: _0 v  g6 D

  S  |/ a5 O5 [; z
( O# f, ~0 O  I( v- S4 f9 k1 X
, N. w; H. \7 }" m. R2 y9 V
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。
/ d* ^' G0 R: N3 }( _" i# \7 S5 o2 X+ m$ C9 T+ s) U
在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提供一个或多个连接点。USB Device 可以分为 USB Hub 和 USB FunctionUSB Hub 提供了一种低成本、低复杂度的 USB接口扩展方法。Hub 的上行端口面向 HOST,下行端口面向设备(Hub 或功能设备)。! w, m" \. e: H. N; M
. ?8 W, f; v4 S$ s; j$ @5 W

& X7 D2 ]; d( G* h8 C在下行端口上,Hub 提供了设备连接检测和设备移除检测的能力,并给各下行端口供电。Hub 可以单独使能各下行端口。不同端口可以工作在不同的速度等级(高速/全速/低速)。USB Function 能够通过总线传输或接收数据或控制信息的设备,在 USB2.0 标准中,别称为 Class
- G( I# w1 x4 w: k# P2 E8 E# `+ ?% o$ |! P7 Z* h1 ]3 @0 ]
本文主要是基于正点原子 stm32f767-atk-apollo 开发板,给出了 USB Host 读写 U 盘的配置和使用示例。4 l3 W8 g( f% K  g
9 X! q- N7 X7 F7 k

8 E2 D; h4 s9 z& z4 G) a3 Z本文准备资料如下:
$ }. x0 ?) D, X- Z; z( d
  • RT-Thread 源码
  • Env 工具
  • U 盘

    $ h: w. g( ^6 g) h) Z: u. k4 V, k/ V

1 m! C" l6 ^8 k, I# C; U依赖
  • RT-Thread 4.0.2+
  • RT-Thread 设备驱动框架

    2 t9 f( ~. Z" l. I
8 C4 G# w; e- d* ^2 Q& t
硬件连接准备

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

9 d; g' H+ \/ ^+ f  W

: z4 A& @2 o1 w1 e( H/ I

ENV 配置

% x& C& _# {. Z5 t0 `: o

" w6 Q7 [" h; G" I3 [  a% K/ M; U  p打开 USB Host
% i' u5 o1 e/ Q( Q+ n

% M0 v8 j# d+ [) |  F3 Z

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

1---- Hardware Drivers Config
& w" J8 p- K: S) d2    ----On-Chip Peripheral Drivers
4 k/ E. X% y% J, Y, T$ `! K7 @* l3        ----Enable USH Host
) ?# w: d* \, o7 S# _0 N5 R* G3 o; _4            ----Enable Udisk Drivers
& l) o3 p2 x$ S3 w
3 t: {8 M# j! a; q( y
配置界面如下图所示

2.jpg

打开文件系统

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

1---- RT-Thread Components2 S" k9 f) }' R2 I+ }
2    ----Device virtual file system* i& t4 X* p/ u% D, Z" q) C- M
3        ----Using device virtual file system
* P. T+ }3 `' L! {( y! J$ ^7 d$ J& L2 j* d
配置界面如下图所示

3.jpg

生成工程并下载

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

4.jpg

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

(向右滑动查看全部代码)+ u  B% s: o; \# K) Q, I1 \

1#include <dfs_posix.h>
# v6 i; }( y; Z* C 2#define TEST_FN     "/test_usbh.c"
8 Q0 T  ~% a/ L; j) d, P5 B 3static char test_data[120], buffer[120];2 t' G+ W* ?4 X) m
48 C* l$ G2 t5 b% \7 a5 Y0 Z+ O
5void readwrite(const char* filename)
0 L& |/ g% S1 N( m7 c, S/ m& u 6
{
8 }9 r, s- y, U4 z- a- h 7    int fd;
7 U: v6 B0 v# I6 U0 U) W5 x 8    int index, length;
3 z) i( T3 d  l% o% C0 r6 H+ H 91 K- U9 d& L  ?8 i. v
10    fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
3 g% K% h# _8 S" X11    if (fd < 0)5 ?9 M! U8 _* _: T. d
12    {* I) D2 a, A) D0 T9 P
13        rt_kprintf("open file for write failed\n");
( i/ `: u9 b# }/ q# X14        return;. P3 X# b5 G6 P+ ^% s/ Q
15    }
" q5 _4 i" \% v9 e9 I3 F0 K16
5 x4 V& m. |, K7 w& G5 @" _17    for (index = 0; index < sizeof(test_data); index ++)2 P0 H4 ]9 G! `8 s' Z" L. @0 `. I
18    {; U' D, E# }% J" S4 S
19        test_data[index] = index + 27;
- i6 B  Q, Z# D, ~0 t20    }
5 [; ^& v* B8 I( Y3 q  {21) z; P; a+ s) w* x+ _& B
22    length = write(fd, test_data, sizeof(test_data));
9 }* A3 ^& M# t  C$ p23    if (length != sizeof(test_data))
* @- s! y) w0 ~+ ~( w9 H24    {8 F8 x: O& u" g8 b
25        rt_kprintf("write data failed\n");& Y7 V, j9 B' o' [, e8 r; W
26        close(fd);' M% t( U1 N7 a8 K. B# a9 I
27        return;
, O' M* m; T3 z8 N28    }
3 ~0 a/ p/ p9 k" A+ }$ }29
6 M3 a6 ]3 I: @* f) A0 ^30    close(fd);
0 K' k0 c  ^" k; y! y31
8 V9 ~3 ~  O! b( }4 H32    fd = open(TEST_FN, O_RDONLY, 0);) |& h  V5 W3 ?0 d; _9 B: E
33    if (fd < 0)
& n- b, L% ?8 K- t  v5 ^34    {. D3 M) M8 f4 D9 E6 c( K" R5 a& g! v
35        rt_kprintf("check: open file for read failed\n");
, R% l9 r- e; i# N* ^36        return;. A( E. H# t) W& Y) Z& ~; S
37    }
% \, c7 s  \& L$ l# J, f# {38
; S! C6 W  A6 l5 N& z# A- I39    length = read(fd, buffer, sizeof(buffer));
: j# H, X6 m" }) b# T9 y: F40    if (length != sizeof(buffer))
! R/ U! Q, V+ N& h7 s4 J; S41    {5 f: w4 w; q1 o, p& M6 B% z
42        rt_kprintf("check: read file failed\n");9 x8 h% v; V- q* M3 [
43        close(fd);
+ x( i/ Q5 H& d: V6 r' C  f44        return;. y8 f9 K: N' M; B  C8 q
45    }% B7 H. @7 E: P- Z
46. E/ U. r. O( S: ~! o+ P; Y% o5 Y1 B
47    for (index = 0; index < sizeof(test_data); index ++)
( |" v) @/ f! a. z7 b2 x48    {
; J1 W5 c/ q3 o2 z* c2 ~. w; }49        if (test_data[index] != buffer[index])
7 \3 c: _# _5 g+ i3 j. C! T% M50        {- P' o( b+ F* K
51            rt_kprintf("check: check data failed at %d\n", index);
' E' b- L; I  S6 ]0 Z9 s- I52            close(fd);
( `+ w' F' x7 F. J5 \, }! p* [53            return;
$ B% ^% _6 ~. S& k- k, P54        }
# I6 S" ^) M. S8 Z+ t9 e55    }3 [/ _& [2 P: i0 u' k5 n2 t& f/ x
56
3 u, e1 n$ Q% U: q% y, J* ~57    rt_kprintf("usb host read/write udisk successful\r\n");+ m8 I4 O8 |# {' G. S
58
5 ^5 [' P* k! T9 d" y$ c59    close(fd);& c% b" U$ p( N
60}9 `. ?$ R; Y; l1 q
618 g2 w8 \1 k5 I0 T) j5 t4 ~
62MSH_CMD_EXPORT(readwrite, usb host read write test);
5 n, r% W% n. i0 J6 C2 |! O7 C9 S% Y$ t- K; u  a# l' n

运行测试程序
& o7 ]. q* [0 F) f. W1 G3 B. K& T+ @

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

5.jpg

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

6.jpg

在串口运行导出的 readwrite 测试函数的结果如下图所示
( D# [# E% \3 W. S$ ] 7.jpg
8 B+ b0 I9 i3 p8 A. O再次使用 ls 命令可以看到在 U 盘的根目录下已经新建了一个 test_usbh.c 文件,并且大小为 120 个字节,如下图所示
, K8 L9 D3 L- L# g( ]) v. l: f" ^

8.jpg

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

9.jpg

从电脑上我们可以看到已经成功创建了一个 test_usbh.c 的文件。到这一步为止,在 STM32 上使用 USB Host 读写 U 盘的介绍就结束了
3 @9 \! m) M' ?: i3 ~
8 x' k; N; o- ^5 E: A+ h7 ]/ i

! z+ }. c% I0 h! w2 X1 v' g1 }: _
& o& k& C# Q$ n- a& a
+ p7 H: K& _3 J
参考资料7 A8 ?9 c, o; S



) {: k8 i. a. r6 w5 D

ENV 用户手册
) s+ a% }, Z" Q

http://www.rt-thread.org/document/site/programming-manual/env/env/

虚拟文件系统

http://www.rt-thread.org/document/site/programming-manual/filesystem/filesystem/

RT-Thread源码

http://github.com/RT-Thread/rt-thread

(以上链接请复制至外部浏览器打开)

4 E, G+ N; J7 b: l' U* T
& f/ J3 L% Q) v7 \/ N
: @2 }2 M  ^1 W$ Y% A' Z

1 c/ C1 b. `. @' L1 b. M& N常见问题Q:
' T( _. {% j/ n* {/ Y$ S% B5 C) t3 O2 T: p1 Z; M* n$ C3 ]9 u

) H/ }9 {8 W. t3 O在 rt-thread\bsp\stm32\libraries 目录下没有 drv_usbh.c 文件?
" u& z5 W$ Y$ t! ?A: 该问题一般是当前版本还没有支持 USB Host 的驱动,请使用 RT-Thread 4.0.2+ 的版本进行测试。
5 t  z* Z+ S$ l0 m% m# pQ:工程目录下没有 drv_usbh.c 文件?
) H$ |3 ?+ S' S9 q) ^A: 该问题一般是当前 BSP 没有添加 drv_usbh.c 的驱动,请参考STM32 外设添加指南。
, J: ?, v% k( f. R& `6 c! P
赞 收藏 评论2 发布时间:2020-2-2 21:18

举报

2个回答
zhuzhe 回答时间:2020-4-17 16:52:42
楼主能提供下代码吗
李康1202 回答时间:2020-4-18 11:35:59
谢谢分享!

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版