一、USB功能的添加(作为U盘)

添加文件

将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹:

  1. usb class为硬件相关(Library\Class);
  2. usb driver为底层驱动(Driver);
  3. usb library为设备核心库(Library\Core);
  4. usb application为自建目录,存放上述三个文件夹中的各需要修改的template文件(.c.h各2个),和官方例程中的几个文件(3个.c1个.h)。
  5. 前三个目录下的文件均为只读,不修改;移植时只修改usb application目录下的文件。

移植修改

  1. usbd_desc.c、.h, usbd_pwr.c, usbd_usr.c:来自官方例程,不修改
  2. usb_conf.h:去掉eval相关的两个.h包含;添加#define INTERNAL_PULLUP
  3. usbd_conf.h:删除MSC Class之外的所有Class defines;修改MSC_MEDIA_PACKET为单扇区大小(4096)
  4. usb_bsp.c:
    1. USB_BSP_Init函数:修改输入参数,符合头文件;使能USB APB时钟;将RCC_USBCLK_HSI48选为USB CLK;配置CRS(时钟恢复系统)。
    2. USB_BSP_EnableInterrupt函数:配置、使能USB中断。
  5. usbd_storage.c:
    1. 将USBD_MICRO_SDIO_fops的定义移到相关函数声明下方,修改STORAGE_GetCapacity函数第三个参数的参数类型(2处),为STORAGE_Inquirydata加上强制类型转换
    2. 修改STORAGE_GetCapacity、STORAGE_IsReady、STORAGE_Read、STORAGE_Write函数。

调试修改

出现的问题:编译一直无法通过,提示某些宏定义不存在——可是它们都已经正确地定义了。

解决:将SPIFlash的头文件从usbd_conf.h中移走,仅在usbd_storage.c中包含,问题解决,原因未明。

二、USB与FatFs不冲突的方案选择

USB和FatFs都会操作SPIFlash、对文件页表、目录表做出修改。如果同时在程序中开启USB、挂载FatFs,有可能出现同时修改文件页表、一方修改文件数据与另一方修改文件页表冲突、二者操作SPIFlash冲突等情况,导致系统崩溃。

为了避免这个可能会发生的问题,设想了三种方案:

  1. 方案1:在需要用FatFs写入时禁用USB中断,检测完毕打开中断。
    1. 程序中的现象:程序可以正常运行,USB功能没有崩溃;但可能是由于禁用USB中断后没有清空中断标志位,使能中断后有时会错误地进入中断(不影响程序功能)。
    2. PC端的现象:在程序禁用USB中断后,PC端依旧能看到可移动磁盘,但无法正常对其进行有效操作;使能中断后,PC又可以正常访问可移动磁盘。
    3. 选择:这种方法虽然可行性、操作性上没有问题,但这是不合规范的、有风险的,如果有更优方案,应选择更优方案;如果找不到更优方案,只能选择此方案。
  2. 方案2:通过三极管,在需要用FatFs写入时断开D+D-。
    1. 因需进行硬件修改,暂时无法测试,但这可能是手机上选择充电模式/传文件模式的原理。硬件上直接断开这两根线,相当于拔出了USB线(仅保留供电),理论上完全可行,并且没有风险。
    2. 选择:此方案优于方案1,但需要对硬件进行更改,如果有其他方案优先选择不更改硬件的方案。
  3. 方案3:仅在需要USB时初始化USB(其他中断控制),其他时候不初始化USB。
    1. 实现方式:开机后不初始化USB;在收到设定的某个中断时(比如串口收到"connect")break出原while(1),初始化USB;收到另一个中断信号后(比如串口收到"disconnect"),软件复位单片机。
    2. 测试结果:完全可行,USB和FatFs在完全分隔开的两端程序中,完全没有交叉,不会互相影响;也不用担心USB的注销问题,直接软件复位即可。
    3. 选择:选择方案3。

stm32--USB(作为U盘)+FatFs的实现的更多相关文章

  1. STM32之独立版USB(Host)驱动+MSC+Fatfs移植

    源:STM32之独立版USB(Host)驱动+MSC+Fatfs移植 STM32之USB驱动库详解(架构+文件+函数+使用说明+示例程序)

  2. STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)

    硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...

  3. STM32 USB转串口驱动 Virtual COM Port Driver(V1.3.1)

    将stm32的USB口接到PC端后,PC端会要求安装一个STM32 USB Virtual COM Port Driver,然后就可以用串口调试助手对其操作了

  4. STM32 USB虚拟串口(转)

    源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...

  5. STM32 USB 问题汇总(转)

    源:STM32 USB 问题汇总 汇总1:STM32的USB例程修改步骤,来自http://blog.csdn.net/cy757/archive/2010/01/01/5117610.aspx 以下 ...

  6. [Openwrt 扩展上篇]USB挂载&U盘启动&Samba共享

    最近偷懒,没学习,反想起自己的路由刷了Openwrt,正好闲置了一个硬盘想拿来做个网络硬盘,于是开始了折腾....这里将不谈论如何刷Openwrt,如何ssh,如何添加PPOE,如何添加相对应服务的包 ...

  7. STM32平台SD卡的FatFS文件系统开发

    STM32平台SD卡的FatFS文件系统开发 系统平台: STM32系列的STM32F103ZE SPI方式与SD卡通信 SD上移植FatFS系统 1 FatFS文件系统 1.1 FatFS简介 Fa ...

  8. STM32 USB虚拟串口

    串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方 ...

  9. STM32 USB Virtual COM

    STM32 USB Virtual COM USB转串口的功能实现   这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...

  10. stm32 向W25Q256FLASH中通过 FATFS文件系统写入数据 写多了之后出现错误,之前存储的全都找不到了

    stm32 像W25Q256FLASH中通过  FATFS文件系统写入数据  写多了之后出现错误,之前存储的全都找不到了 http://firebbs.cn/thread-23490-1-1.html ...

随机推荐

  1. hdu-1754 I Hate It---线段树模板题

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题目大意: 求区间最大值+单点修改 解题思路: 直接套用模板即可 #include<bi ...

  2. 应用性能指数(APDEX)是如何计算出来的?

    应用性能指数(APDEX)是如何计算出来的?在应用性能管理领域聚合指标是一种常见手段,主要是用来把成百上千的指标通过某种计算方法聚合成一个或几个指标,用来反映应用的整体健康状态.在这些聚合指标中,比较 ...

  3. spring boot应用启动原理分析

    spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个We ...

  4. Linux 安装ruby编译环境

    1.输入:yum install ruby 1.1如果安装文件出错Error Downloading Packages: 输入:yum clean all 输入:yum makecache,此时如果出 ...

  5. 【洛谷P1363】幻象迷宫

    P1363 幻想迷宫 显然,若从原图中起点走到相邻的图中对应的"起点"位置 ,就可以无限走下去, 若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去 我们不妨记录下 ...

  6. oracle日常监控语句

    oracle常用的性能监控SQL语句 一.查询历史SQL: ---正在执行的SQL语句: select a.username, a.sid,b.SQL_TEXT, b.SQL_FULLTEXT fro ...

  7. React性能优化总结(转)

    原文链接: https://segmentfault.com/a/1190000007811296?utm_source=tuicool&utm_medium=referral 初学者对Rea ...

  8. django-模板层基础2

    1.模板的导入 {% include 模板名%} 首先在你的的项目中,需要很多地方用到同一个组件(相对于头部,你进行每个页面的切换,网页最上面的头 部不需要改变),那么这样我们可以把那个头部重新写在一 ...

  9. Sass 基础(一)

    css 是一些非常简单得语句的组合,既然简单的语句,就不可避免的有很多重复的,冗余的东西,而且没有传统编程语言变量,控制语句等高级特性,所以造成了css 编写低效,往往需要查找替换,大量复制来修改或者 ...

  10. 取消Eclipse的自动代码格式化

    前段时间在Eclipse里面设置了java文件保存时自动格式化,在java->Code Style->Formatter里设置了自定义的格式化的样式,这样每次保存后都会自动格式化代码,用了 ...