OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 23937|回复: 43

[分享]用STM32CubeMX快速生成一个U盘模拟程序

[复制链接]

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
发表于 2016-6-3 16:49:38 | 显示全部楼层 |阅读模式
本帖最后由 adlu 于 2016-6-4 14:44 编辑

本帖以STM32F407开发板为平台(只要引出了USB接口即可),用STM32CubeMX快速生成一个U盘模拟程序。
用STM32CubeMX快速生成一个U盘模拟程序.pdf (1.43 MB, 下载次数: 5027)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 16:51:35 | 显示全部楼层
Step5.配置时钟树,USB模块输入要求为48MHz时钟。
5.jpg

Step6.配置USB设备描述符。此处默认即可。
5A.jpg

Step7.生成MDK工程及代码。特别注意,一定要加大堆栈大小,否则USB设备无法启动。
6.jpg


回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 16:54:29 | 显示全部楼层
Step8.打开MDK工程。
7.jpg
8.jpg
9.jpg
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 16:55:49 | 显示全部楼层
Step9.选择芯片型号。


10.jpg

Step10.编译工程。
11.jpg
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 16:58:58 | 显示全部楼层
Step11.编译下载运行。
运行程序后,通过USB线链接电脑,将出现如下提示信息。


A.jpg
B.jpg
C.jpg
D.jpg
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 17:02:25 | 显示全部楼层
查看 “设备管理器”,可以看到USB MSC设备
E.jpg
“我的电脑”界面下可以可移动磁盘。
F.jpg
G.jpg
但是,双击无法打开,出现格式化提示。
H.jpg
进入格式化对话框,可以看到磁盘总容量是32MB。
I.jpg
实际上无法进行格式化操作。

回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 17:06:32 | 显示全部楼层
Step12.修改代码。只需修改usbd_storage_if.c文件。
60行的宏定义改为200,即将要模拟的U盘有200个扇区。61行是扇区大小定义512。
J.jpg
用60,61行的宏,定义一个二维数组,这个数组就是将要模拟的U盘的实际存储空间。
因此该U盘总容量为100KB。

QQ截图20160603170512.jpg
然后为两个函数添加功能,一个是读块,一个是写块。他们是对msc_data数组的读写操作。
操作规则就和SD卡一样,按照512字节为一个扇区进行整体的读/写。
K.jpg
L.jpg
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-3 17:08:39 | 显示全部楼层
Step13.再次编译下载运行。
运行程序后,通过USB线链接电脑,不再像前一次一样出现很多提示信息,只是在任务栏最右边出现U盘插入的图标。
在“我的电脑”界面下可以看到“可移动磁盘”。双击无法打开,提示进行格式化,点“是”进入格式化窗口。可以看到U盘容量为100KB
勾选“快速格式化”,点击“格式化”按钮。不支持普通格式化,我也没弄清楚原因.

M.jpg N.jpg
格式化完成后,就可以双击打开这个“U盘”了,这是一个可以进行读写的U盘。
将这个U盘弹出,然后断开USB链接线,然后再重新连接,就可以被360 U盘助手发现了。
实际可用空间为81920字节。下图是我在U盘中新建一个txt文件后的结果.
O.jpg

回复 支持 反对

使用道具 举报

3

主题

177

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1603
金钱
1603
注册时间
2016-1-28
在线时间
265 小时
发表于 2016-6-3 17:41:03 | 显示全部楼层
支持!!!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-6-3 21:39:47 | 显示全部楼层
牛逼
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-4 09:02:24 | 显示全部楼层

多谢赞赏!
我本来想做一个读卡器的,没有成功,所以只能分享这个初步成果。

八度有用过Cube吗?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-6-4 09:13:57 | 显示全部楼层
adlu 发表于 2016-6-4 09:02
多谢赞赏!
我本来想做一个读卡器的,没有成功,所以只能分享这个初步成果。

没用过,我都是自己组织代码的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-6-4 12:00:23 | 显示全部楼层
不错,现在用CUBE的例程非常缺乏啊。实际上一些熟悉STM32的人用CUBE开发简单应用很方便的(在缺少例程的情况下对新人倒是不太好用除了一些闪灯之类的小程序)
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-6-4 14:30:48 | 显示全部楼层
本帖最后由 adlu 于 2016-6-4 14:34 编辑
yyx112358 发表于 2016-6-4 12:00
不错,现在用CUBE的例程非常缺乏啊。实际上一些熟悉STM32的人用CUBE开发简单应用很方便的(在缺少例程的情 ...

其实ST为各系列的STM32提供了支持包,如STM332CubeF1,STM332CubeF4等等,解压之后可以在STM32Cube_FW_F4_Vxxx\Projects看到很多例程。
这些例程的平台包括官方的EVAL,Discovery,Nucleo等开发板,每个开发板的例程也几乎涵盖了所有片上外设。
1.jpg
2.jpg
回复 支持 反对

使用道具 举报

4

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-5-28
在线时间
14 小时
发表于 2016-6-21 10:17:53 | 显示全部楼层
谢谢分享 学习中
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-9-18
在线时间
14 小时
发表于 2016-9-18 16:58:09 | 显示全部楼层
非常好的教程,请问可以使用外置SD卡或者spi nand flash作为大容量存储吗?
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-9-18
在线时间
14 小时
发表于 2016-9-18 17:24:09 | 显示全部楼层
还有怎么在实现了无法格式化可移动磁盘之后,对代码进行修改,就会报错,可以编译,但是不能build。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-9-18
在线时间
14 小时
发表于 2016-9-18 17:26:20 | 显示全部楼层
我百度看了下,错误提示应该是没有足够的内存了。不知道怎么解决,我的芯片是STM32F103ZET6
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-9-19 08:47:56 | 显示全部楼层
cyang 发表于 2016-9-18 16:58
非常好的教程,请问可以使用外置SD卡或者spi nand flash作为大容量存储吗?

应该是可以的,把step12的两个函数改成对SD卡或NAND FLASH的就行了。

具体我也没试过。欢迎分享你的实验结果。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-9-18
在线时间
14 小时
发表于 2016-9-19 09:41:23 | 显示全部楼层
我执行12步之后出现的结果。
错误提示.png
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-9-19 10:28:24 | 显示全部楼层
cyang 发表于 2016-9-19 09:41
我执行12步之后出现的结果。

这个肯定是一个低级错误。
STM32F103ZET6的RAM是64k,如果你定义了一个很大的数组,总消耗超过内部RAM大小,就会出现这样的错误。

如果你要映射到外部SRAM或FLASH,应该将step12的数组msc_data[ ]屏蔽。
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
发表于 2016-9-19 21:41:59 | 显示全部楼层
八度空间 发表于 2016-6-4 09:13
没用过,我都是自己组织代码的

我不信
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-9-20 08:53:40 | 显示全部楼层
本帖最后由 八度空间 于 2016-9-20 08:54 编辑

STM32F302的硬件I2C就搞死人了,手册翻来翻去的看,全英文,头大
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2016-9-18
在线时间
14 小时
发表于 2016-9-20 09:42:45 | 显示全部楼层
adlu 发表于 2016-9-19 10:28
这个肯定是一个低级错误。
STM32F103ZET6的RAM是64k,如果你定义了一个很大的数组,总消耗超过内部RAM大 ...

请问我要映射到外部的FLASH怎么办?
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-9-21 14:01:12 | 显示全部楼层
本帖最后由 adlu 于 2016-9-22 15:15 编辑
cyang 发表于 2016-9-20 09:42
请问我要映射到外部的FLASH怎么办?

实现usbd_storage_if.c文件中所有xxx_FS函数的功能。因为本例中使用的是内部SRAM,很多操作是直接返回USBD_OK的。映射到外部FLASH的时候,就要按实际功能实现。

我没有实现过,也不知道会遇到什么问题。
但有个问题一定需要注意,就是STARAGE_Write_FS( )函数,对于FLASH来说,擦除操作是按页进行的。因此在实现其功能的时候,必须有回读-擦除-修改-写入的处理过程。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2016-9-22
在线时间
1 小时
发表于 2016-9-22 11:33:47 | 显示全部楼层
不错,学习了
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2014-6-14
在线时间
0 小时
发表于 2016-9-24 09:24:20 来自手机 | 显示全部楼层
接收的CBW,放在了哪里?
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2016-9-24 09:54:58 | 显示全部楼层
mantishell 发表于 2016-9-24 09:24
接收的CBW,放在了哪里?

这个不清楚。太底层的东西,我不懂。
使用Cube开发就是要屏蔽底层操作,专注应用开发。
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-2-7
在线时间
4 小时
发表于 2017-2-18 16:01:54 | 显示全部楼层
楼主你好,能留下,联系方式么? 小弟最近也在搞这个,有几个问题想请教一下。
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1026
金钱
1026
注册时间
2016-1-28
在线时间
134 小时
发表于 2017-3-4 14:04:08 | 显示全部楼层
支持楼主了!
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1026
金钱
1026
注册时间
2016-1-28
在线时间
134 小时
发表于 2017-3-4 15:07:54 | 显示全部楼层
为啥每次插入,都得格式化,且上次数据未保存~
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2017-3-6 12:39:57 | 显示全部楼层
qjp1988113 发表于 2017-3-4 15:07
为啥每次插入,都得格式化,且上次数据未保存~

这个是虚拟的U盘,数据区全部在SRAM里面,不是在FLASH,断电当然就没了。
所以每次插入都是未格式化的U盘。除非你外部另外供电,然后拔插USB线。
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1026
金钱
1026
注册时间
2016-1-28
在线时间
134 小时
发表于 2017-3-6 16:30:08 | 显示全部楼层
adlu 发表于 2017-3-6 12:39
这个是虚拟的U盘,数据区全部在SRAM里面,不是在FLASH,断电当然就没了。
所以每次插入都是未格式化的U ...

嗯,是的,原子的例子好像有个读卡器的例子呢,可以体验一把~
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2017-3-22 09:05:58 | 显示全部楼层
真的非常感谢楼主大大!
昨天在搞F4 USB的时候发现 DFU及模拟U盘的 都运行不了,插上电脑能显示USB设备但是有个感叹号,没想到是堆栈设置小了。太谢谢了
回复 支持 反对

使用道具 举报

杀破狼 该用户已被删除
发表于 2017-3-30 19:42:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-9-4
在线时间
12 小时
发表于 2018-9-4 14:05:27 | 显示全部楼层
adlu 发表于 2016-6-3 17:06
Step12.修改代码。只需修改usbd_storage_if.c文件。将60行的宏定义改为200,即将要模拟的U盘有200个扇区。6 ...

前辈,您好,我按照您的方法用STM32F429IGT6片内FLASH模拟U盘空间,以上的这些代码都改为操作内部flash的函数,但是插上U盘后无法格式化,不知道是哪的问题,还请前辈有时间指点一下,小弟初学ST,还望不吝赐教。谢谢
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2018-9-4 15:27:29 | 显示全部楼层
chenbao 发表于 2018-9-4 14:05
前辈,您好,我按照您的方法用STM32F429IGT6片内FLASH模拟U盘空间,以上的这些代码都改为操作内部flash的 ...

帖子时间挺久远了,细节我已经记不清了,详细过程都写在pdf中了。
看8楼的内容,看看是不是这个原因
Step13.再次编译下载运行。
运行程序后,通过USB线链接电脑,不再像前一次一样出现很多提示信息,只是在任务栏最右边出现U盘插入的图标。
在“我的电脑”界面下可以看到“可移动磁盘”。双击无法打开,提示进行格式化,点“是”进入格式化窗口。可以看到U盘容量为100KB。
勾选“快速格式化”,点击“格式化”按钮。不支持普通格式化,我也没弄清楚原因.

回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-9-4
在线时间
12 小时
发表于 2018-9-4 15:51:39 | 显示全部楼层
adlu 发表于 2018-9-4 15:27
帖子时间挺久远了,细节我已经记不清了,详细过程都写在pdf中了。
看8楼的内容,看看是不是这个原因

感谢前辈的回复,我以为我的消息会石沉大海,没想到前辈这么快就回复了。赞一个!!!
我再仔细研究下,谢谢啦。。。
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-7-24
在线时间
21 小时
发表于 2018-9-4 23:18:57 | 显示全部楼层
我的407不行,不过不是window系统,插上usb没有反应,刷官方那个可以看到盘符 flash 和sd卡内容
回复 支持 反对

使用道具 举报

5

主题

18

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2018-9-4
在线时间
12 小时
发表于 2018-9-5 13:56:01 | 显示全部楼层
游水鸡鸡 发表于 2018-9-4 23:18
我的407不行,不过不是window系统,插上usb没有反应,刷官方那个可以看到盘符 flash 和sd卡内容

你也是用内部flash模拟U盘吗?
回复 支持 反对

使用道具 举报

25

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2013-9-9
在线时间
21 小时
发表于 2018-9-7 18:28:03 | 显示全部楼层
我这里怎么生成不了工程文件啊。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-11-8
在线时间
4 小时
发表于 2020-4-13 10:19:31 | 显示全部楼层
学习学习 ,谢谢分享
回复 支持 反对

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2019-9-25
在线时间
25 小时
发表于 2020-7-22 16:52:18 | 显示全部楼层
大佬,我可否转发一下你的分享??
回复 支持 反对

使用道具 举报

12

主题

228

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1730
金钱
1730
注册时间
2016-3-8
在线时间
678 小时
 楼主| 发表于 2020-7-27 08:45:14 | 显示全部楼层
chenkangshdu 发表于 2020-7-22 16:52
大佬,我可否转发一下你的分享??

欢迎扩散!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 06:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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