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 ...
 
随机推荐
- 使用字面量或者绑定变量在HANA Studio里执行SQL语句
			
在SAP note 2000002 – FAQ: SAP HANA SQL Optimization里提到了SQL语句的两种执行方式,具体差异体现在where语句里搜索条件的指定方式上. 所谓Lite ...
 - Python语言程序设计基础(4)—— 程序的控制结构
			
PM2.5 pm = eval(input()) if pm>=75: print("空气存在污染") else : print("空气没有污染") pr ...
 - cascade  DecodeBBox层
			
https://zhuanlan.zhihu.com/p/36095768 我的推断,第二第三阶段应该不是把所有anchor进行bounding box regression,然后再选取当前条件下的所 ...
 - json 二进制传输方案
			
json 传输二进制数组方案 json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型.如果想要传输图片等二进制文件的话,是没办法直接 ...
 - 【洛谷P3818】小A和uim之大逃离 II
			
小A和uim之大逃离 II 题目链接 比较裸的搜索,vis[i][j]再加一层[0/1]表示是否使用过魔液 转移时也将是否使用过魔液记录下来,广搜即可 #include<iostream> ...
 - Asset Store 下载的package存在什么地方?
			
发现从Asset store下载的packages都不知道放在了什么地方 Windows 7,C:\Users\<username>\AppData\Roaming\Unity\Asset ...
 - CSS选择器种类及使用方法
			
css选择器 有通配符选择器书写格式:*+{声名块} 并集选择器/组合选择器 书写格式;元素或类或id+""+元素或类或id+","+元素或类或id{声明块} ...
 - SpringMvc获取上下文
			
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.spri ...
 - 原生js的常见封装
			
)); } ;;;;]){ ]; ] = ;;;,) ,) ,) ,) ,) , ...
 - openresty安装配置 Ubuntu下
			
1.进入openresty-1.11.2.4的压缩包木木,我这里是在“/usr/local/”下: 2.进入后执行[tar -xzvf openresty-1.11.2.4.tar.gz]进行解压 3 ...