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

你使用STM32也可以操作U盘

[复制链接]
木木&点点 发布时间:2019-12-26 00:41
简介
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。
) [6 X- ]( _' e3 D) L# z在 USB 体系中又包括 USB Host(主机)和USB Device(设备)USB Host任何USB系统中只有一个主机。主机系统的USB接口被称为主机控制器。主机控制器可以以硬件,固件或软件的组合来实现。根集线器集成在主机系统内以提供一个或多个连接点。USB Device USB Device 可以分为 USB Hub 和 USB FunctionUSB Hub 提供了一种低成本、低复杂度的 USB接口扩展方法。Hub 的上行端口面向 HOST,下行端口面向设备(Hub 或功能设备)。在下行端口上,Hub 提供了设备连接检测和设备移除检测的能力,并给各下行端口供电。Hub 可以单独使能各下行端口。不同端口可以工作在不同的速度等级(高速/全速/低速)。USB Function 能够通过总线传输或接收数据或控制信息的设备,在 USB2.0 标准中,别称为 Class
% G4 h' k% n! L: I* L% D
本文主要是基于正点原子 stm32f767-atk-apollo 开发板,给出了 USB Host 读写 U 盘的配置和使用示例。本文准备资料如下:
  • RT-Thread 源码
  • Env 工具
  • U 盘
    # ?, s1 K7 ~. ~8 z* t$ ]

8 c% g9 |3 p  C$ @+ [依赖
  • RT-Thread 4.0.2+
  • RT-Thread 设备驱动框架
    " e, w/ z, E- h

) A# ]& C" K- g0 M硬件连接准备

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

ENV 配置
打开 USB Host$ I) M, T/ O' X" A: [; j

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

1---- Hardware Drivers Config( F/ ~/ ?& H& M  I9 s  w( D# P
2    ----On-Chip Peripheral Drivers$ t! h. C, V1 ]
3        ----Enable USH Host, o7 z  W" F0 b! L
4            ----Enable Udisk Drivers; Y; p7 Z% {# M& m; ~
/ t' w# ^, i2 k5 p9 T- s
配置界面如下图所示

1.jpg

打开文件系统

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

1---- RT-Thread Components# M$ ]% ~  N3 P
2    ----Device virtual file system
* V$ g4 F. H0 s. t( K  X$ h2 n3        ----Using device virtual file system
. s( a( _5 A/ N
配置界面如下图所示

2.jpg

生成工程并下载

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

3.jpg

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

1#include <dfs_posix.h>
" O# _1 ]6 V5 J# p' j2 m* m 2#define TEST_FN     "/test_usbh.c"
/ ?9 b  X# |' U 3static char test_data[120], buffer[120];
5 H/ O2 c; o! P8 F 4
/ C7 {& W  p% A/ F& b$ ~  t 5void readwrite(const char* filename)/ S2 o7 _+ [+ Y/ n9 E/ ^! v; o
6
{
0 N  u2 H/ D+ S: k' @/ R" m 7    int fd;' w: d0 o5 Y& z7 Q! v% O
8    int index, length;
( |: K- A9 L4 ?+ A& q 95 P. f6 V9 R1 O+ U+ b  }/ g
10    fd = open(TEST_FN, O_WRONLY | O_CREAT | O_TRUNC, 0);
/ ]: |6 \+ n! P11    if (fd < 0)& @6 A- K2 R. s. G0 {
12    {4 }+ {" |! \) ?
13        rt_kprintf("open file for write failed\n");
( T9 j* j9 f7 ]. t14        return;4 T' U) ~2 r8 T' D
15    }
$ K0 ?3 _6 [8 r; f: g; V163 n" }1 J3 f+ s1 D. A( a
17    for (index = 0; index < sizeof(test_data); index ++)
6 k$ T0 K) O' r% O18    {
0 x$ N3 \' f+ t" x19        test_data[index] = index + 27;
) p) W9 v9 d/ ~7 d# k( C1 e20    }
5 R0 s3 G0 K! H  h0 G# B+ r1 ^21$ m8 G% d% C/ @/ f5 m, g, I
22    length = write(fd, test_data, sizeof(test_data));! C2 E1 q. l* C: K7 E+ Z% J# R/ C
23    if (length != sizeof(test_data))
. f/ @: l# Z: X7 z+ e) {3 u24    {
# ^, _7 G' I% A. b9 a4 V; a$ F) }) y25        rt_kprintf("write data failed\n");5 f4 R( ]5 B9 d; G$ b6 k# G2 s
26        close(fd);2 n& K/ {6 f+ ?3 C8 k! s
27        return;
, j& }$ a$ `. ^/ f* |% P% Z, `4 a28    }& F5 k5 W& i& |7 ~% ~
292 X. {& ?9 X3 G' z0 O
30    close(fd);1 f0 Y- h. z3 d. Q
31
1 m3 n- N, W7 S32    fd = open(TEST_FN, O_RDONLY, 0);1 x5 w, t2 {- U! |3 Y3 L8 D( e- R
33    if (fd < 0)
/ ]2 `' a+ B$ q& E34    {# H( [* g3 M9 Y3 k2 h% o
35        rt_kprintf("check: open file for read failed\n");
( A7 V7 d3 \$ F( D. N! [6 M) y, i36        return;4 Q; L& l, f* Q, U+ ~9 P6 ^
37    }" @+ B2 V: G: `8 y
387 h# ?/ E# i; r6 \& i- q& h2 M
39    length = read(fd, buffer, sizeof(buffer));
4 u2 J6 ]4 i) F" {' D6 U$ X0 G40    if (length != sizeof(buffer))6 w' Q/ J! l9 [( k: f2 j! Z8 C
41    {2 P8 n; u: k% K% v# Q7 r
42        rt_kprintf("check: read file failed\n");% i6 i5 k: Q: F
43        close(fd);1 F& n8 `4 `6 P. N, j% I( B
44        return;+ O) K, [) \8 ~* J& B4 W6 ]+ Z
45    }
3 q% R( d1 s( A# |46
- H! W5 H& {( t( N6 a47    for (index = 0; index < sizeof(test_data); index ++)
! c" T7 ]5 ~3 S+ R6 D: j48    {- L' Y5 Y. }' z
49        if (test_data[index] != buffer[index])) `" G! p( \) C' X( n) E, g1 n, {0 I
50        {7 k4 ]6 E; p9 Z2 h# O2 I6 N
51            rt_kprintf("check: check data failed at %d\n", index);5 Q! ?" F9 g' z0 h0 P' A4 w8 o! A
52            close(fd);+ M- ^/ |/ W! E' L1 u+ g8 _( N9 X( S
53            return;* {/ V5 `/ M7 J7 w: p+ \3 x
54        }8 A- c9 z: C4 p
55    }% [5 u+ t! w0 ^( \1 N/ q
56- \: o7 P* x+ x: I
57    rt_kprintf("usb host read/write udisk successful\r\n");
& ?: v- q' M8 K1 ?# X# S: f581 L" {( z8 O7 d% `3 a8 |
59    close(fd);7 A4 K1 q" ]# I) P2 ]8 c+ P( M6 E
60}
* [1 ~6 ]( f& f2 h4 b, d618 s- a) B! ~0 s* y7 ^$ e/ ]
62MSH_CMD_EXPORT(readwrite, usb host read write test);
) O5 Y6 ~# l+ L+ z( a3 R
% G) o( c! Y  ~, w: o2 b

运行测试程序
2 e9 \! X& H. p3 E! Y: V$ a

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

4.jpg

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

5.jpg

在串口运行导出的 readwrite 测试函数的结果如下图所示
! o, M/ q" m4 Z) Y2 P 6.jpg   P) }5 w! n/ I. k, n2 r. }' K& {

; [4 [) w, o8 @" Z

& P5 s% g% q' V, f7 k再次使用 ls 命令可以看到在 U 盘的根目录下已经新建了一个 test_usbh.c 文件,并且大小为 120 个字节,如下图所示

7.jpg

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

8.jpg

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

6 j5 v3 ^1 \1 P9 M- s; d

ENV 用户手册3 N8 C6 f. k0 H$ n' y/ \7 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

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

常见问题Q: 在 rt-thread\bsp\stm32\libraries 目录下没有 drv_usbh.c 文件?A: 该问题一般是当前版本还没有支持 USB Host 的驱动,请使用 RT-Thread 4.0.2+ 的版本进行测试。Q:工程目录下没有 drv_usbh.c 文件?A: 该问题一般是当前 BSP 没有添加 drv_usbh.c 的驱动,请参考STM32 外设添加指南。
& q# S& ~0 i% N9 V7 Q% `# l
赞 收藏 2 评论1 发布时间:2019-12-26 00:41

举报

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