利用stm32cube实现USB+FATFS的usbdisk程序--实现Fatfs对U盘文件操作
本来是要实现usb通过U盘来升级芯片flash程序的
不过实现之前,要先调通fatfs操作u盘
这里记录一下我的操作和想法实现的整个过程,
说句实话,实现之后的代码什么的没什么用,
学习过程才是根本,尤其是实现之中的种种思考方法
大家也不要一味只是拿代码
多思考下为什么这样做?
为什么这样写?
那样写为什么就不行?
我这个教程也不是一次写成的,中间也是各种曲折,各种查资料
相应的我也会在分享的过程中写出我所查的资料和思考的方向
同时,希望大家也能踊跃的分享些自己的学习过程
分享的过程就是再次巩固的过程!
当你写出来的时候,你会以别人的角度看待这个问题,为了描述清楚,你就要比别人更加清楚其中的原理,这也是学习的方法!
>>声明:本站原创不提倡转载,如需转载请注明出处!!!
好了,言归正传,我的是stm32f407discovery板,原理图什么的想必大家看了其他帖子也都了解了.
晶振8M
首先,选外部晶振
我们要用到usb的u盘功能,所以选择fs模式的host_only 主机模式
回到顶部,usb_host中选择MSC大容量存储,并在fatfs中选择usb disk
这个时候,我发现原理图里面Vbus 是被PC0控制的,
所以PC0要选择输出,为了更好的观察,开启两个led灯,PD12/13
去设置时钟,主频168,usb48,我比较懒,让它自动生成的时钟
这时候,去configuration面板,先去设置下usb的中断优先级为5.0
下面的图是gpio口的,PC0原理图里面有了上拉了,所以就NOpull了,
打开usb_host的按钮进行设置,选择PC0作为VBUS的驱动口
configuration面板中其他的都默认即可,我们再去设置下工程的Heap和Stack分别为0x2000
ok,生成工程文件吧.
本帖相关完整程序可在本站百度网盘中找到.
文件名:USBDisk(FatFs+USB操作U盘).7z
不过实现之前,要先调通fatfs操作u盘
这里记录一下我的操作和想法实现的整个过程,
说句实话,实现之后的代码什么的没什么用,
学习过程才是根本,尤其是实现之中的种种思考方法
大家也不要一味只是拿代码
多思考下为什么这样做?
为什么这样写?
那样写为什么就不行?
我这个教程也不是一次写成的,中间也是各种曲折,各种查资料
相应的我也会在分享的过程中写出我所查的资料和思考的方向
同时,希望大家也能踊跃的分享些自己的学习过程
分享的过程就是再次巩固的过程!
当你写出来的时候,你会以别人的角度看待这个问题,为了描述清楚,你就要比别人更加清楚其中的原理,这也是学习的方法!
>>声明:本站原创不提倡转载,如需转载请注明出处!!!
好了,言归正传,我的是stm32f407discovery板,原理图什么的想必大家看了其他帖子也都了解了.
晶振8M
首先,选外部晶振
我们要用到usb的u盘功能,所以选择fs模式的host_only 主机模式
回到顶部,usb_host中选择MSC大容量存储,并在fatfs中选择usb disk
这个时候,我发现原理图里面Vbus 是被PC0控制的,
所以PC0要选择输出,为了更好的观察,开启两个led灯,PD12/13
去设置时钟,主频168,usb48,我比较懒,让它自动生成的时钟
这时候,去configuration面板,先去设置下usb的中断优先级为5.0
下面的图是gpio口的,PC0原理图里面有了上拉了,所以就NOpull了,
打开usb_host的按钮进行设置,选择PC0作为VBUS的驱动口
configuration面板中其他的都默认即可,我们再去设置下工程的Heap和Stack分别为0x2000
ok,生成工程文件吧.
本帖相关完整程序可在本站百度网盘中找到.
文件名:USBDisk(FatFs+USB操作U盘).7z
49 个回复
admin
赞同来自:
就是控制usb vbus的那个 stmps241 芯片
这个芯片能不能删除?
是做什么用的?
能用什么替换?
从中可以看出,这个是作为开关管
stmps241 支持输出500MA电流给外设
500MA更好就是笔记本电脑的usb口对应的输出电流,
支持ttl驱动
反向电流保护
拥有8KV的esd静电防护,保护CPU芯片.
ok,现在知道了,这个芯片可以去除,但是去除后可能有单片机被静电击穿的危险.
admin
赞同来自: 木子dong
编号是:UM1721
从图中我们知道,要操作u盘,主程序中需要定义 还需要依次使用
来完成一个完整的写入操作.
好了,我们打开刚才生成的工程的
main.c文件
从上到下看下去,
时钟配置
gpio初始化
然后是
我们打开这个函数,查看他的内容
看到里面已经包含了FATFS_LinkDriver();
说明我们之后的程序中不需要再去刻意写了.
然后是i
查看他 的内容
里面先初始化了用户进程类
又注册了系统MSC进程类,并开启了usb模式
其中的用户进程类就类似于callback
我们查看下他的内容
里面根据不同的usb通信状态id来改变外接flag标识,
根据上面我们提到的um1721文档介绍流程图,我们可以得到一个执行顺序:Host_USER_CONNECTION 连接I/o
HOST_USER_SELECT_CONFIGURATION 驱动配置
HOST_USER_CLASS_ACTIVE 处理过程
HOST_USER_DISCONNECTION 失去连接
我们在看看flag标识
我们这里只用到ready和disconnect即可.
admin
赞同来自: caoenq
我们准备利用usb的各种回调状态进行不同的操作,
在while(1)大循环中添加
上面因为用到了Appli_state这个变量,而这个变量是在usb_host.c中实现状态间的切换,所以,我们在main文件头部添加外部引用:
上面的那个switch状态解释如下:
如果usb的用户可控状态(APPLICATION_READY)准备好了,那么进行
MSC_Application();//u盘的读写操作
读写完毕之后,将usb用户可控状态设置为APPLICATION_DISCONNECT;//未连接
这样的话下次循环到这里就切换到
case APPLICATION_DISCONNECT这个里面进行操作,而这个里面
要理解这个意思先看它的定义
当第一个参数是NULL的时候,就是unmount 意思就是卸载这个逻辑磁盘
所以switch的真个含义就是: 当usb准备好了,就执行一次对u盘的写入或者读出操作,然后卸载掉这个磁盘,防止多次重复操作u盘.
完整的msc对u盘的操作程序如下:
下面贴出完成的main.c文件内容
ok编译,烧写到discovery板,通过OTG线连接一个u盘,就可以在这个u盘上自动生成一个stm32.txt的文件
内容是:The site is STM32cube.com working with FatFs
admin
赞同来自:
于是立马去查看UM1721上面关于文件名长度的地方
上面说,如果使用长文件名,那么必须
因为我不使用UNICODE编码命名文件名所以
这样我就可以,命名文件名类似:stm32cubeadkfdghkglfgj.txt这样长的了
下面说下利用stm32cubemx怎么设置为长文件名(不使用中文)
打开先前的stm32cubemx工程,只需要修改一个地方:
这样保存再次生成整个工程,
只要你的代码按照书写规范,生成的时候是不会删除用户自己编写的代码的,所以,你现在可以修改main中的文件名了
例如:
然后,编译,拿u盘测试,
OK,完成实验
注:我是不准备用中文名称作为文件名的,而且里面无论是读取还是写入都没有中文,所以上面的配置够我使用了,
要是用中文就去参考其他帖子.
秋枫、
赞同来自:
zhanghl45 - STM32L4XX用户
赞同来自:
admin
赞同来自: 仲尼jony
这样就齐活了,下面可以安心的去实现U盘更新flash来烧写程序了.
nemo1991
赞同来自:
张良123
赞同来自: gonghuwei
孤独的行者。
赞同来自:
admin
赞同来自:
为了增加拔插U盘状态指示,需要在这个程序的基础上增加一点代码,
其实奏是增加一个开灯和关灯
main()函数中大循环while(1)修改如下:
这样重新编译后,插入U盘写入文件完毕就会灯亮,拔掉u盘后灯灭,再插上再亮,.....
坂田银时
赞同来自: rzx1990 、刘涛(抚) 、海阔天空1234
好好学习0864 - IT工程师
赞同来自:
释怀过客
赞同来自: 欲予玉屿
你好,我用的是SD卡,像知道和你这个用USB的区别大吗?
bme_bright
赞同来自:
学习下。
谢谢分享。
我抬头望着天
赞同来自:
好
nothing
赞同来自:
请问 U盘 容量大小怎么设置?
U盘被电脑识别出来但是 可用空间为0字节。无法格式化,怎么样设定U盘容量和MCU 内置FLASH 匹配?欲予玉屿
赞同来自:
你好,按照楼主给的程序,能够实现U盘插上去,灯就亮,拔出就熄灭。那么这样的情况下,就意味着可以对U盘进行读写了吗?现在所遇到的问题就是在U盘中没有看到新建的.TXT的文档,程序进入到了错误处理程序中,即两个灯在交替闪烁,不知道是什么原因造成的,请楼主帮忙解答一下,所有的程序都是按照楼主给的步骤来的,不知道是否还有其他需要注意的地方
凯旋
赞同来自:
666666666
坤
赞同来自:
很好的教程
新的生活 - 90后IT男
赞同来自: Amos
你好,和你这样教程做,老是提示


ennocheung - 70
赞同来自:
admi水平真高,UM1721已下载,很有用。
谢谢admi
caoenq - 硬件设计大师
赞同来自:
果然是高手啊
ZGJ20170905
赞同来自: bob3
哇塞,受教了,写的太好了
ckpcmpkun - 90后嵌入式
赞同来自:
看了好几个帖子就这个最管用,666
後知後覺
赞同来自:
怎么下载
usrrsr
赞同来自:
Nicley written
chen1233
赞同来自:
为啥我下进去,识别U盘后就死机了?
wcyingdream
赞同来自:
按照楼主的教程来,已经成功在U盘写入文件,很棒
蓝
赞同来自:
这个状态根本无法达到,分析代码 当USB作为复合设备时才可能达到这个状态
rgzdb
赞同来自:
编译后提示 ../Src/main.c(110): warning: #111-D: statement is unreachable,无法建立文件
_one
赞同来自:
谢谢楼主的分享
寂静の烛光
赞同来自:
楼主的教程很好,但是我发现我现在插usb2.0U盘一切正常,但是插3.0U盘检测不到APPLICATION_READY状态。。。。
dagu - 嵌入式
赞同来自:
有尝试过检测U盘热拔插吗?
血染风采
赞同来自: 刘涛(抚) 、shanshan
裸机这么玩一点问题都没有,但是使用了freertos之后就不行了,usb的状态一直是start,到不了ready状态。
@ 爱尔多 @
赞同来自:
确实写的很好
血染风采
赞同来自:
STM32CubeIDE配置USB Host,裸机情况下,可以正常识别U盘;使用了FreeRTOS之后,识别不了U盘了,到不了Ready的状态,只能到达Start。STM32CubeMX+MDK5:裸机和FreeRTOS都可以识别U盘。
不知道STM32CubeIDE还需要设置什么?大佬,可以试试看。
╰ˇ野萝莉ˇ╯
赞同来自:
是啥哦,找不到诶
吉跃华
赞同来自:
还没试,但能看出来楼主写的非常详细非常清楚,赞一个!
好き好き好き
赞同来自:
我的环境是 NUCLEO-F767ZI,按这个设定后U盘一直不到Ready。查找了很多网站,现在有些进展了。留下来希望有人能用得着。
Clock Configuration里的HSE:8,PLLM:8,PLLN:432,PLLP:2,PLLQ:9
现在在这个设定下就可以W/R,把HSE和PLLM一改动就不行了。。。。这个些该怎么调不怎么懂 好难啊!
李黑山
赞同来自:
你好,完全按照这个操作,最后总是debug在HOST ABORT STATE,提下提示device not supporting 。已知正点原子的程序可以运行,硬件应该是没有问题的。
我用的cube5.0版本
再回首 沧海依旧
赞同来自:
你好 我用的是STM32F105的核心板,CubeMX设置按照你这个来的,现在一直是卡在Appli_state = APPLICATION_START这一步,显示ERROR: Control error: Device not responding,请问不同的板子哪些地方需要修改吗?
Vaksrian
赞同来自:
你好,我用的是STM32F407ZET6,正点原子探索者开发板,开发环境STM32CUBEIDE,按照上面的操作,上电后插入U盘,Appli_state一直处于APPLICATION_IDLE状态;而如果是插入U盘后再上电,则Appli_state一直处于APPLICATION_DISCONNECT状态。未进入过START和READY状态,换了几个U盘尝试,USB2.0和3.0都不行。
学习2下
赞同来自:
我能问下从哪里下载不
Jerry_zheng
赞同来自:
大佬, 下面代码放在EXTI_Callback 外部中断回调里面运行,会卡在f_open 无法打开,不知道这个问题是否有遇到过.
switch(Appli_state)
{
case APPLICATION_READY:
MSC_Application();
Appli_state = APPLICATION_DISCONNECT;
break;
case APPLICATION_DISCONNECT:
f_mount(NULL, (TCHAR const*)"", 0);
break;
default:
break;
}
李安 - 00后
赞同来自:
十分感谢
yjsjsy
赞同来自:
学习学习!
Tesla﹏✎
赞同来自:
网盘链接怎么失效了?
天爱学习
赞同来自:
如何下载您的工程啊,大神