stm32--USB(作为U盘)+FatFs的实现
一、USB功能的添加(作为U盘)
添加文件
将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹:
- usb class为硬件相关(Library\Class);
- usb driver为底层驱动(Driver);
- usb library为设备核心库(Library\Core);
- usb application为自建目录,存放上述三个文件夹中的各需要修改的template文件(.c.h各2个),和官方例程中的几个文件(3个.c1个.h)。
- 前三个目录下的文件均为只读,不修改;移植时只修改usb application目录下的文件。
移植修改
- usbd_desc.c、.h, usbd_pwr.c, usbd_usr.c:来自官方例程,不修改
- usb_conf.h:去掉eval相关的两个.h包含;添加#define INTERNAL_PULLUP
- usbd_conf.h:删除MSC Class之外的所有Class defines;修改MSC_MEDIA_PACKET为单扇区大小(4096)
- usb_bsp.c:
- USB_BSP_Init函数:修改输入参数,符合头文件;使能USB APB时钟;将RCC_USBCLK_HSI48选为USB CLK;配置CRS(时钟恢复系统)。
- USB_BSP_EnableInterrupt函数:配置、使能USB中断。
- usbd_storage.c:
- 将USBD_MICRO_SDIO_fops的定义移到相关函数声明下方,修改STORAGE_GetCapacity函数第三个参数的参数类型(2处),为STORAGE_Inquirydata加上强制类型转换
- 修改STORAGE_GetCapacity、STORAGE_IsReady、STORAGE_Read、STORAGE_Write函数。
调试修改
出现的问题:编译一直无法通过,提示某些宏定义不存在——可是它们都已经正确地定义了。
解决:将SPIFlash的头文件从usbd_conf.h中移走,仅在usbd_storage.c中包含,问题解决,原因未明。
二、USB与FatFs不冲突的方案选择
USB和FatFs都会操作SPIFlash、对文件页表、目录表做出修改。如果同时在程序中开启USB、挂载FatFs,有可能出现同时修改文件页表、一方修改文件数据与另一方修改文件页表冲突、二者操作SPIFlash冲突等情况,导致系统崩溃。
为了避免这个可能会发生的问题,设想了三种方案:
- 方案1:在需要用FatFs写入时禁用USB中断,检测完毕打开中断。
- 程序中的现象:程序可以正常运行,USB功能没有崩溃;但可能是由于禁用USB中断后没有清空中断标志位,使能中断后有时会错误地进入中断(不影响程序功能)。
- PC端的现象:在程序禁用USB中断后,PC端依旧能看到可移动磁盘,但无法正常对其进行有效操作;使能中断后,PC又可以正常访问可移动磁盘。
- 选择:这种方法虽然可行性、操作性上没有问题,但这是不合规范的、有风险的,如果有更优方案,应选择更优方案;如果找不到更优方案,只能选择此方案。
- 方案2:通过三极管,在需要用FatFs写入时断开D+D-。
- 因需进行硬件修改,暂时无法测试,但这可能是手机上选择充电模式/传文件模式的原理。硬件上直接断开这两根线,相当于拔出了USB线(仅保留供电),理论上完全可行,并且没有风险。
- 选择:此方案优于方案1,但需要对硬件进行更改,如果有其他方案优先选择不更改硬件的方案。
- 方案3:仅在需要USB时初始化USB(其他中断控制),其他时候不初始化USB。
- 实现方式:开机后不初始化USB;在收到设定的某个中断时(比如串口收到"connect")break出原while(1),初始化USB;收到另一个中断信号后(比如串口收到"disconnect"),软件复位单片机。
- 测试结果:完全可行,USB和FatFs在完全分隔开的两端程序中,完全没有交叉,不会互相影响;也不用担心USB的注销问题,直接软件复位即可。
- 选择:选择方案3。
stm32--USB(作为U盘)+FatFs的实现的更多相关文章
- STM32之独立版USB(Host)驱动+MSC+Fatfs移植
源:STM32之独立版USB(Host)驱动+MSC+Fatfs移植 STM32之USB驱动库详解(架构+文件+函数+使用说明+示例程序)
- STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)
硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...
- STM32 USB转串口驱动 Virtual COM Port Driver(V1.3.1)
将stm32的USB口接到PC端后,PC端会要求安装一个STM32 USB Virtual COM Port Driver,然后就可以用串口调试助手对其操作了
- STM32 USB虚拟串口(转)
源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...
- STM32 USB 问题汇总(转)
源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...
- [Openwrt 扩展上篇]USB挂载&U盘启动&Samba共享
最近偷懒,没学习,反想起自己的路由刷了Openwrt,正好闲置了一个硬盘想拿来做个网络硬盘,于是开始了折腾....这里将不谈论如何刷Openwrt,如何ssh,如何添加PPOE,如何添加相对应服务的包 ...
- STM32平台SD卡的FatFS文件系统开发
STM32平台SD卡的FatFS文件系统开发 系统平台: STM32系列的STM32F103ZE SPI方式与SD卡通信 SD上移植FatFS系统 1 FatFS文件系统 1.1 FatFS简介 Fa ...
- STM32 USB虚拟串口
串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方 ...
- STM32 USB Virtual COM
STM32 USB Virtual COM USB转串口的功能实现 这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...
- stm32 向W25Q256FLASH中通过 FATFS文件系统写入数据 写多了之后出现错误,之前存储的全都找不到了
stm32 像W25Q256FLASH中通过 FATFS文件系统写入数据 写多了之后出现错误,之前存储的全都找不到了 http://firebbs.cn/thread-23490-1-1.html ...
随机推荐
- python UI自动化实战记录二:请求接口数据并提取数据
该部分记录如何获取预期结果-接口响应数据,分成两步: 1 获取数据源接口数据 2 提取后续页面对比中要用到的数据 并且为了便于后续调用,将接口相关的都封装到ProjectApi类中. 新建python ...
- 简单的PHP算法题
简单的PHP算法题 目录 1.只根据n值打印n个0 2.根据n值打印一行 0101010101010101010101…… 3.根据n值实现1 00 111 0000 11111…… 4.根据n值实现 ...
- 2018.10.2 Eclipse中如何测地修改一个we项目步骤
找到项目的web.xml文件 大概的路径如下: 修改xml文件中的display-name 节点的值 下一步就是切换工作目录 显示的效果 打开最后一个文件修改 接下来找到这个文件 是部署的时候用的 运 ...
- WebStorm11 注册码及激活
网址:http://www.jianshu.com/p/5ce394a28ce5 1.获取注册码 打开第一个网址(IntelliJ IDEA 注册码),我们能看到下面的界面,直接点击获取激活码,将生成 ...
- HDU 1216 Assistance Required(暴力打表)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1216 Assistance Required Time Limit: 2000/1000 MS (Ja ...
- Git相关内容
先聊一点关于gitlab的内容和github的内容 Gitlab和GitHub,都是我们可以存放代码库的地方.不过Gitlab可以免费的存储私人代码,GitHub需要花钱才能够存储私人代码库,不过我想 ...
- iOS-GCD使用详解
前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步.异步.串行.并行和死锁这几个名词的漩涡中渐渐放弃治疗.本文将使用图文表并茂的方式给大家形象地解释其中的原理和规律. 线程.任务和队列的概 ...
- Django从请求到返回流程
图1:流程图 1. 用户通过浏览器请求一个页面2.请求到达Request Middlewares,中间件对request做一些预处理或者直接response请求3.URLConf通过urls.py文件 ...
- Windows环境下的RTKPlot_Qt版本编译时遇到的问题和解决方法
在使用了 RTKLIB开源包自带的 rtkplot.exe后,知道了它所具有的功能,就想着如何模仿它做出一个 demo.一开始看的是之前下载的 2.4.2版本的 RTKLIB,里面是使用 Delphi ...
- LeetCode 翻转链表
基本思路 从元首节点之后每次取一个节点,并将节点接到元首节点前面 代码实现 /** * Definition for singly-linked list. * struct ListNode { * ...