一、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. git多站点多用户情况下SSH配置

    个人使用github,但是公司使用的是 GitLab .那么在一个电脑上进行处理时,由于先设置了 github 的,导致没办法从 GitLab 上处理 git .其实是由于 ssh 的问题. 下面记录 ...

  2. 设计模式——建造者模式(BuilderPattern)

    建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. UML图: Builder: package com.cnblog.clarck; /** * ...

  3. 编程思想的理解(POP,OOP,SOA,AOP)

    http://blog.csdn.net/hawksoft/article/details/7021435 1)POP--面向过程编程(Process-oriented programming ):面 ...

  4. bzoj 3028 生成函数

    计算完后为 f(x): 根据我翻高数书,终于推倒出来了. (- ̄▽ ̄)-

  5. VOJ1049 送给圣诞夜的礼品 【矩阵经典4】

    任意门:https://vijos.org/p/1049 描述 当小精灵们把贺卡都书写好了之后.礼品准备部的小精灵们已经把所有的礼品都制作好了.可是由于精神消耗的缘故,他们所做的礼品的质量越来越小,也 ...

  6. c#加一个后台线程

  7. logback.xml常用配置

    一.logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件.logback当前分成三个模块:logback-core,logback- classic和logback-acc ...

  8. 超简单,快速修改Oracle10g的默认8080端口

    因为Oracle数据库默认的端口是8080,这也是tomcat服务器的默认端口. 为了避免端口冲突,我们通常会修改掉其中一个. 这里我们选择修改Oracle数据库的端口. 第一步:以管理员身份运行cm ...

  9. js实现div滚动条在页面刷新 滚动条位置固定

    思想:1.通过div的onscroll事件记录滚动条的scrollTop值,设置到document.cookie 2.页面加载时再读取document.cookie的值,设置给div的scrollTo ...

  10. Android学习笔记_41_TabHost自定义标签和TraceView性能测试

    一.tabhost第一种用法,通过在帧布局放入定义好的page页面来实现,这样导致在当前activity下代码量比较大. 1.页面布局: |        |        |        |    ...