请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 13457|回复: 57
收起左侧

[开源应用] 【原创开源应用第5期】基于RL-USB+RL-FlashFS的外挂U盘解决方案

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
发表于 2018-8-29 18:24:07 | 显示全部楼层 |阅读模式
说明:
1、RL-USB外挂U盘的例子,最近太多网友咨询,再不做一个例子就说不过去了。此例子为此而生。
2、RTX及其所有中间件基本都做例子了,就差这个USB Host功能了,这次算是补上,所有功能基本已经做全面。
3、此例子仅支持MDK4.74版本,因为RTX,RL-FlashFS,RL-USB都是来自MDK4.74的安装目录,使用MDK4.74才是最佳组合。要使用MDK5的话,看此贴说明:链接
4、RL-FlashFS的文件名仅支持ASCII,不支持中文,这点要特别注意。
5、RL-FlashFS的函数是标准的C库函数,跟电脑端的文件系统使用方法一样。
6、相比ST的USB库,兼容性稍好点。


使用说明:

大家首次测试时,先将U盘插上,上电后会进行枚举并串口打印是否连接成功。如果能够识别U盘并且操作也正常,后续就可以测试热插拔操作是否正常。

支持热插拔,可以自动识别并做初始化操作,无需调用加载和卸载指令.
请选择串口操作命令,电脑键盘打印数字即可:
L - 加载USB
U - 卸载USB
1 - 显示SD卡容量和剩余容量
2 - 显示SD卡根目录下的文件
3 - 创建三个text文本并使用不同函数写入内容
4 - 使用三个不同函数读取文本
5 - 创建一个text文本并指定一个位置对其进行读写操作
6 - 删除文件夹和文件
7 - 测试文件读写速度
8 - 写数据到CSV文件中
9 - 从CSV文件中读数据


注意事项:
当前RL-USB的Host功能,仅调通了STM32的FS接口外接U盘,而HS接口外接U盘未做调试。
对于我们的V5和V6开发板来说,FS接口是做为Device使用的,要做Host功能使用的话,需要对外做5V供电。解决办法这里接1个5V杜邦线。看下面两个红色方框的地方进行连接即可。
QQ截图20180829182129.png

接口要使用MicroUSB接口,也就是需要大家外接一个转接线接测试U盘了。
2.png


百度云:
链接: https://pan.baidu.com/s/12s6FMD7fQ5yxLOAoDFsbOg 提取码: dbjh

例程下载:
基于STM32F407IGT6的RTX RL-USB RL-FlashFS的外挂U盘解决方案.7z (2.1 MB, 下载次数: 1127)
基于STM32F429BIT6的RTX RL-USB RL-FlashFS的外挂U盘解决方案.7z (3.02 MB, 下载次数: 1813)


2018-08-29_182719.jpg


兼容性方便,手头这4个U盘都可以成功识别并测试。







回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2018-8-29 19:12:28 | 显示全部楼层
几年过去了,还是这四个U盘啊。老大体贴民众,赞赞赞赞
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-8-30 00:46:20 | 显示全部楼层
sanit 发表于 2018-8-29 19:12
几年过去了,还是这四个U盘啊。老大体贴民众,赞赞赞赞

这几个U盘跟了我好几年了
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2018-8-30 11:15:14 | 显示全部楼层
还有机会出HS接口外接U盘的例程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-8-30 12:01:15 | 显示全部楼层
永恒的_eSg02 发表于 2018-8-30 11:15
还有机会出HS接口外接U盘的例程吗?

后面有精力做下,没精力的话,可能就不做了
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2018-8-30 12:04:17 | 显示全部楼层
eric2013 发表于 2018-8-30 12:01
后面有精力做下,没精力的话,可能就不做了

辛苦了,点赞!
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2018-8-30 17:13:03 | 显示全部楼层
V5板是不是改下引脚就可以用USB-A的插座?
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2018-8-30 17:27:58 | 显示全部楼层
一个不幸的消息,程序直接下载到V5板,然后就不识别CPU了。
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2018-8-30 17:28:33 | 显示全部楼层
蜂鸣器上和右侧的灯一直在闪
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-8-31 00:33:41 | 显示全部楼层
waterx3 发表于 2018-8-30 17:13
V5板是不是改下引脚就可以用USB-A的插座?

不能哦,好像底层驱动要稍微修改,具体还没有去研究。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-8-31 00:33:58 | 显示全部楼层
waterx3 发表于 2018-8-30 17:27
一个不幸的消息,程序直接下载到V5板,然后就不识别CPU了。

多试试。
回复

使用道具 举报

33

主题

203

回帖

302

积分

高级会员

积分
302
发表于 2018-8-31 09:55:13 | 显示全部楼层

MDK,debug的Settings里也看不到CPU了,降速也看不到。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-1 01:20:09 | 显示全部楼层
waterx3 发表于 2018-8-31 09:55
MDK,debug的Settings里也看不到CPU了,降速也看不到。

改用串口下载一次,估计是你的SWD接口锁住了。
回复

使用道具 举报

1

主题

17

回帖

20

积分

新手上路

积分
20
发表于 2018-9-4 12:58:15 | 显示全部楼层
硬汉大神,请教个问题:keil RTX的USB Device协议栈是以库的形式提供吗?提供协议栈源码吗?
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2018-9-4 14:26:42 | 显示全部楼层
虽然我已经调试出来了,但是还是要赞一下硬汉。正是需要这个东东的时候,刚好可以拿来做参考。硬汉!真是服了你了。刚开始还不习惯你的代码风格,刚开始用原子的,后来慢慢发现,还是硬汉厉害!!!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-4 15:30:33 | 显示全部楼层
活出自我 发表于 2018-9-4 12:58
硬汉大神,请教个问题:keil RTX的USB Device协议栈是以库的形式提供吗?提供协议栈源码吗?

keil的除了RTX4和RTX5有源码,其它的中间件都只有库
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-5 15:04:17 | 显示全部楼层
eric2013 发表于 2018-9-4 15:30
keil的除了RTX4和RTX5有源码,其它的中间件都只有库

FSN_CM3.lib库是不支持FAT长文件名的,但是看手册这个库FS_CM3.lib是支持的呀,硬汉哥有没有试过这个库呢?


现在我移植这个例子到我的板子上,到 finit("U0:"); 这里板子就开始一直复位了,拔掉U盘就又不复位,在、不知咋回事
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-5 15:07:02 | 显示全部楼层
小狐狸 发表于 2018-9-5 15:04
FSN_CM3.lib库是不支持FAT长文件名的,但是看手册这个库FS_CM3.lib是支持的呀,硬汉哥有没有试过这个库呢 ...

有时间我试试。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-6 17:37:12 | 显示全部楼层
eric2013 发表于 2018-9-5 15:07
有时间我试试。

今天使用你的例子测试了下FlashFS和RL-USB驱动,得出如下结论:
1、FlashFS的部分功能比FATFS要少许多,例如没有新建文件夹的函数,不支持中文文件名,不支持长文件名的文件夹等等,但是FlashFS也有自己的特点,比如均衡,支持的flash类型多,稳定性高等等。
下面是FlashFS支持的api
1.png
2.png
3.png
4.png
5.png
6.png
7.png
8.png
9.png
10.png


下面是FATFS支持的:
FatFs provides various filesystem functions for the applications as shown below.
  • File Access
  • Directory Access
  • File and Directory Management
    • f_stat - Check existance of a file or sub-directory
    • f_unlink - Remove a file or sub-directory
    • f_rename - Rename/Move a file or sub-directory
    • f_chmod - Change attribute of a file or sub-directory
    • f_utime - Change timestamp of a file or sub-directory
    • f_mkdir - Create a sub-directory
    • f_chdir - Change current directory
    • f_chdrive - Change current drive
    • f_getcwd - Retrieve the current directory and drive
  • Volume Management and System Configuration
    • f_mount - Register/Unregister the work area of the volume
    • f_mkfs - Create an FAT volume on the logical drive
    • f_fdisk - Create logical drives on the physical drive
    • f_getfree - Get total size and free size on the volume
    • f_getlabel - Get volume label
    • f_setlabel - Set volume label
    • f_setcp - Set active code page
2、RL-USB驱动的稳定性和兼容性比STM32F407自带的好很多很多,同样的板子,1个FAT16的1G TF卡转U盘,1个FAT32的8G TF卡转U盘,1个FAT32的16G U盘,RL-USB驱动时3个U盘随意插拔读写,没有出现1次不成功或者U盘不识别的。但是使用407自带的驱动,几乎每次都出现加载U盘驱动失败的情况,也有可能是我的驱动+FATFS移植的不好,造成407自带的USB驱动兼容性较差。



3、使用FSN_CM3.lib库时文件名是支持ASCII码格式的长文件名的,但是文件夹还是不支持长文件名,不知为什么
2018-09-06_171747.png
4、demo文件中 DemoFlashFS 函数存在板子上电时如果不插U盘,第一次插入时U盘时会出现U盘没有被挂载器问题(仿真发现是没有进行U盘初始化,拔出,第二次插入后就好了。我修改了这个问题,硬汉哥看看对不对。
  1. void DemoFlashFS(void)
  2. {
  3.   int8_t cmd = 0;
  4.   uint8_t con, con_ex;
  5.   uint8_t ucRunFlag=1;

  6.   /* 打印命令列表,用户可以通过串口操作指令 */
  7.   DispMenu();

  8.   con = InitUSB();
  9.   if(con)
  10.   {
  11.     ucRunFlag = 0;//初始化成功后,后面就不用再初始化,2018-09-06
  12.   }
  13.   con_ex = con | 0x80;  /* 首次上电强制执行一次if(con^con_ex)里面的内容 */

  14.   while (1)
  15.   {
  16.     /* 断开连接后,此函数也会卸载资源 */
  17.     usbh_engine(0);
  18.     con = usbh_msc_status(0, 0);
  19.     if (con ^ con_ex)
  20.     {
  21.       if (!con)
  22.       {
  23.         ucRunFlag = 1;//下次插入U盘后需要重新初始化一次,2018-09-06
  24.         printf("U盘已经拔出\r\n");
  25.         printf("------------------------------------------------------------------\r\n");
  26.       }
  27.       else
  28.       {
  29.         /* 系统上电首次运行和调用指令L后,不需要重复初始化 */
  30.         if (ucRunFlag)
  31.         {
  32.           ucRunFlag = 0;
  33.           con = InitUSB();
  34.         }
  35.       }
  36.       con_ex = con;
  37.     }

  38.     cmd = getkey();
  39.     if (cmd > 0)
  40.     {
  41.       switch (cmd)
  42.       {
  43.         case 'L':
  44.           printf("【L - InitUSB】\r\n");
  45.           con = InitUSB();  /* U盘的挂载,卸载及其容量显示 */
  46.           break;

  47.         case 'U':
  48.           printf("【U - UnInitUSB】\r\n");
  49.           UnInitUSB();    /* U盘挂载,卸载及其容量显示 */
  50.           break;

  51.         case '1':
  52.           printf("【1 - ViewSDCapacity】\r\n");
  53.           ViewSDCapacity();   /* U盘挂载,卸载及其容量显示 */
  54.           break;

  55.         case '2':
  56.           printf("【2 - ViewRootDir】\r\n");
  57.           ViewRootDir();        /* 显示U盘根目录下的文件名 */
  58.           break;

  59.         case '3':
  60.           printf("【3 - CreateNewFile】\r\n");
  61.           CreateNewFile();      /* 创建三个text文本并使用不同函数写入内容 */
  62.           break;

  63.         case '4':
  64.           printf("【4 - ReadFileData】\r\n");
  65.           ReadFileData();         /* 使用三个不同函数读取文本  */
  66.           break;

  67.         case '5':
  68.           printf("【5 - SeekFileData】\r\n");
  69.           SeekFileData();         /* 创建一个text文本,在指定位置对其进行读写操作  */
  70.           break;

  71.         case '6':
  72.           printf("【6 - DeleteDirFile】\r\n");
  73.           DeleteDirFile();      /* 删除文件夹和文件  */
  74.           break;

  75.         case '7':
  76.           printf("【7 - WriteFileTest】\r\n");
  77.           WriteFileTest();      /* 测试文件读写速度  */
  78.           break;

  79.         case '8':
  80.           printf("【8 - WriteCSVFile】\r\n");
  81.           WriteCSVFile();         /* 写数据到CSV文件中  */
  82.           break;

  83.         case '9':
  84.           printf("【9 - ReadCSVFileData】\r\n");
  85.           ReadCSVFileData();      /* 从CSV文件中读数据  */
  86.           break;
  87.          
  88.         default:
  89.           DispMenu();
  90.           break;
  91.       }
  92.     }

  93.     os_dly_wait(1);
  94.   }
  95. }
复制代码



回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-6 17:49:13 | 显示全部楼层
刚写了600个文件,一切正常。每个文件夹中写60个文件,每个文件10K,写了10个文件夹
22.png
33.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-7 01:07:25 | 显示全部楼层
小狐狸 发表于 2018-9-6 17:49
刚写了600个文件,一切正常。每个文件夹中写60个文件,每个文件10K,写了10个文件夹

flashfs是采用的标准C库API,电脑端的文件系统也是这些API,你说的创建文件夹是支持的,长文件名应该也没问题的,使用库文件FS_CM3.lib,后面我试试文件夹的长文件名问题。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-7 10:31:06 | 显示全部楼层
eric2013 发表于 2018-9-7 01:07
flashfs是采用的标准C库API,电脑端的文件系统也是这些API,你说的创建文件夹是支持的,长文件名应该也没 ...

f_mkdir建立文件函数是哪个呢,在flashfs中,我就想单独的建立多个文件夹,暂时不先建立文件,怎么实现呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-7 10:50:39 | 显示全部楼层
小狐狸 发表于 2018-9-7 10:31
f_mkdir建立文件函数是哪个呢,在flashfs中,我就想单独的建立多个文件夹,暂时不先建立文件,怎么实现呢

函数fout = fopen ("N0:\\test\\", "w"); 就可以创建
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-8 12:13:39 | 显示全部楼层
eric2013 发表于 2018-9-7 10:50
函数fout = fopen ("N0:\\test\\", "w"); 就可以创建

谢谢啦

没有专门的函数,这样实现也行
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-8 12:15:35 | 显示全部楼层
小狐狸 发表于 2018-9-8 12:13
谢谢啦

没有专门的函数,这样实现也行

C标准库没有mkdir函数的,就是靠这个函数创建的。
回复

使用道具 举报

20

主题

249

回帖

309

积分

高级会员

积分
309
发表于 2018-9-8 12:30:19 | 显示全部楼层
eric2013 发表于 2018-9-8 12:15
C标准库没有mkdir函数的,就是靠这个函数创建的。

恩恩,谢谢
老大对这些研究的很透彻
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-9-8 14:30:34 | 显示全部楼层
小狐狸 发表于 2018-9-8 12:30
恩恩,谢谢
老大对这些研究的很透彻

回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2018-10-30 11:31:19 | 显示全部楼层
挂载文件系统失败 (1:IO错误,I/O驱动初始化失败,或者没有存储设备,或者设备初始化失败)   怎么解决?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-10-30 13:44:16 | 显示全部楼层
要努力_rSaUr 发表于 2018-10-30 11:31
挂载文件系统失败 (1:IO错误,I/O驱动初始化失败,或者没有存储设备,或者设备初始化失败)   怎么解决?

估计是没有移植成功。另外换几个U盘试试。
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2018-10-30 15:17:06 | 显示全部楼层
eric2013 发表于 2018-10-30 13:44
估计是没有移植成功。另外换几个U盘试试。

找到原因了,是我自己的板子换成了8M晶振,配置没改,谢谢eric 大神
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2018-10-30 16:29:46 | 显示全部楼层
要努力_rSaUr 发表于 2018-10-30 15:17
找到原因了,是我自己的板子换成了8M晶振,配置没改,谢谢eric 大神

好的
回复

使用道具 举报

2

主题

14

回帖

20

积分

新手上路

积分
20
发表于 2019-2-15 17:53:59 | 显示全部楼层
请教下eric RL_usb 和 RL_FLashFs现在有没有教程,或者什么时候嗯那个出来
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2019-2-15 17:55:47 | 显示全部楼层
吻云浩 发表于 2019-2-15 17:53
请教下eric RL_usb 和 RL_FLashFs现在有没有教程,或者什么时候嗯那个出来

看这个就行

http://www.armbbs.cn/forum.php?m ... mp;highlight=RL-CAN
回复

使用道具 举报

10

主题

33

回帖

63

积分

初级会员

积分
63
发表于 2019-5-12 00:31:51 | 显示全部楼层
测了2个USB3.0的u盘都不行啊!!(一个16G的,一个32G的)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2019-5-12 02:25:46 | 显示全部楼层
younew 发表于 2019-5-12 00:31
测了2个USB3.0的u盘都不行啊!!(一个16G的,一个32G的)

3.0的话,务必格式化为FAT32格式,这样就木问题了。
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
发表于 2019-8-9 11:33:56 | 显示全部楼层
我的开发板V6用SanDisk  U盘8G识别不了,用V6-348-FreeRTOS实验_FreeRTOS+STemWin+FatFS+USB Host综合这个例程就可以识别,什么原因啊,RL-USB比ST 库还差?
回复

使用道具 举报

36

主题

142

回帖

255

积分

高级会员

积分
255
发表于 2019-8-9 15:20:54 | 显示全部楼层
看了注意事项才发现用FS接口的。我硬件仅有HS接口
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2019-8-9 15:50:43 | 显示全部楼层
takent 发表于 2019-8-9 15:20
看了注意事项才发现用FS接口的。我硬件仅有HS接口

对,使用的接口不同。
回复

使用道具 举报

29

主题

177

回帖

264

积分

高级会员

积分
264
发表于 2020-9-22 15:51:50 | 显示全部楼层
MDK4.74  编译STM32F107系列的USB HOST   
U盘读不成功   硬汉哥了解这个情况不
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106398
QQ
 楼主| 发表于 2020-9-24 10:15:43 | 显示全部楼层
wlx18682353162 发表于 2020-9-22 15:51
MDK4.74  编译STM32F107系列的USB HOST   
U盘读不成功   硬汉哥了解这个情况不

估计是哪里没有移植好。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-19 03:02 , Processed in 0.459987 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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