使用stm32F4的HSUSB移植一个usb和sd卡组合当做U盘使用的操作

想要做到这个功能,大致如下几个步骤
1,SDIO/SPI 驱动 SD卡,具体的驱动可以使用keil提供的eval库
2,下载usb device驱动,我们这里使用的是被动模式,slave
3,添加usb文件到工程
4,修改添加usb底层驱动代码

其实,移植usb驱动相对来说比较简单,只需要知道什么是移植。usb驱动是干嘛用的,大致了解它的工作顺序就可以了,这里只做简单的简绍移植步骤,具体的usb配置这里不说(其实我也没有搞透)

1,SDIO/SPI 驱动 SD卡
驱动SD卡,SD卡的接口我知道的有两种,一种是SDIO接口,一种是SPI接口的,不过无论哪种接口,都不影响,因为底层代码已经有一个现成的库写好了。
EVAL库是由3.5的标准库提供的,在目录

STM32 3.5固件库官网原文件\STM32F10x_StdPeriph_Lib_V3.5.0\Utilities\STM32_EVAL\Common

这下面有这么几个文件

从名字可以看出来,分别是几个不同模块的驱动方式,我们这里选择的是SDIO_SD模式,(注意区分F4的库和F1的库)
基本上添加到工程里面,然后调用sd_init 函数初始化之后,就可以用read write进行操作了

2,下载usb device驱动,添加usb文件到工程
usb驱动可以去ST官网是下载,只需要下载device模式的就可以了
我这里没有下载官网的,使用的是野火的例子,然后修改的,代码我已经上传到github了,

git@github.com:writeing/STM32_F4_USB_SD.git

下载完成之后,对应的添加到工程目录下,这一步就算做完了

usb_otg:是usb设备的公共驱动文件,里面主要包含的就是中断的索引,比如usb插进去的时候中断工作,比如usb拔除的时候,等等
usb_device:是usb slave模式下的驱动文件
usb_APP:是我们需要修改的文件,下面只有四个。分别是bsp,desc,msd。usr ,sd_bsp是我的sd卡的驱动文件
4,修改添加usb底层驱动代码
这一步是最重要的。也是最麻烦的,
下面想说基本的移植步骤,具体修改那些,后面再说

1,在主函数里面调用初始化函数

USB_OTG_CORE_HANDLE USB_OTG_dev;
USBD_Init(&USB_OTG_dev,USB_OTG_FS_CORE_ID,&USR_desc,&USBD_MSC_cb,&USR_cb);

调用初始化函数之后,事件就会注册到中断上,当USB进行相应的操作的时候就会触发中断,然后调用底层函数

2,填充usbd_storage_msd.c文件下的init。read等函数

int8_t STORAGE_Init (uint8_t lun)
{#ifdef USB_SD_BSP#undef USB_SD_BSPUSB_SD_Init();  #endifreturn 0;
} int8_t STORAGE_GetCapacity (uint8_t lun, uint32_t *block_num, uint32_t *block_size)
{       #ifndef USB_SD_BSP*block_size=512;  *block_num=SDCardInfo.CardCapacity/512; #endifreturn 0;
} int8_t  STORAGE_IsReady (uint8_t lun)
{ USB_STATUS_REG|=0X10;return 0;
} int8_t  STORAGE_IsWriteProtected (uint8_t lun)
{return  0;
} int8_t STORAGE_Read (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
{int8_t res=0;USB_STATUS_REG|=0X02;#ifndef USB_SD_BSPres=SD_ReadDisk(buf,blk_addr,blk_len);#endifif(res)USB_STATUS_REG|=0X08;return res;
}int8_t STORAGE_Write (uint8_t lun,uint8_t *buf,uint32_t blk_addr,uint16_t blk_len)
{int8_t res=0;USB_STATUS_REG|=0X01;#ifndef USB_SD_BSPres=SD_WriteDisk(buf,blk_addr,blk_len);#endifif(res)USB_STATUS_REG|=0X04;      return res;
}int8_t STORAGE_GetMaxLun (void)
{return (STORAGE_LUN_NBR - 1);
}

这里野火添加了一些标志了,用来判断USB驱动走到哪一步,出了什么错误

  1. STORAGE_Init 函数就是初始化,在插入USB口之后,会触发中断,然后调用这个函数,进行SD卡的 初始化
  2. STORAGE_GetCapacity 这个函数就是返回SD卡的大小和每一块的大小,那个结构体的填充是在SD卡的初始化函数里面实现的errorstatus = SD_GetCardInfo(&SDCardInfo); 这里的值可以随便写。比如把block_num写成10G,在电脑显示的时候,就是10G,
  3. STORAGE_Read 调用的是SD卡的读函数,我这里使用的是野火封装好的一个函数,3.5库自带的是没有这个函数的,得自己封装
  4. STORAGE_Write 这个函数一样,写函数
  5. STORAGE_GetMaxLun 这个函数是返回,有多少个SD卡,也就是在电脑上显示几个盘符,好像这个驱动就支持2个,也就是lun最大也就是2

3,添加延时函数
在usb_bsp.c下面,有两个延时函数,一个是us级的,一个是ms级的。最好的办法是使用sys进行延时。记得实现就好

这几个实现完了之后,基本上就移植成功了,下载程序,然后插上usb,基本上就能识别了

下面是移植的时候遇到的几个问题:
1。usb驱动未知(设备描述符无效)
这种情况,有两种可能,一个是设备驱动需要更新,一个是内部的中断程序没有正确相应,

  1. 更新usb驱动,如果更新之后还是无法识别
  2. 这种情况就是usb设备驱动没有正确被调用与SD卡无关,首先应该是单步更新检查中断调用函数,我发生过两次,一次是延时函数没弄好,导致死机了,一次是usb文件没有移植完成,弄错库了,,,,意思就是说,只要调用初始化函数,基本上就会识别出来,

2,设备识别出来了,但是没有读取到SD卡,
这种情况只有一个,那就是sd卡的驱动出了问题
我遇到一个很神奇的事情,就是3.5的库直接调用读写很正常,但是用usb读写就是不行,后来换成了野火的例子,就是好的了, 也分析过,太复杂了,没有找到原因,

其他的一些宏,自己去琢磨,也没啥好说的,
设备读写缓存设置的宏在usb_conf.h里面
设备工作模式选择的宏在sd卡的头文件里面,有DMA和POLL两种

STM32F4-usb_slave u盘相关推荐

  1. STM32F4通过U盘升级程序

    昨天的文章中介绍F4系列单片机的内部Flash读写,包括之前文章中介绍了FatFS文件系统读写U盘的操作.本篇文章就是将两者结合,实现F4系列单片机程序的U盘升级. 首先对内部Flash空间进行划分, ...

  2. RT-Thread:U盘读写

    文章目录 前言 一.使用env进行配置 二.测试生成的工程,并解决问题 三.下载运行 总结 前言 学习如何在RT-Thread中让STM32F4读取U盘 一.使用env进行配置 1.使能USB HOS ...

  3. ADS1220的几种应用介绍(含源码)

    最近有好几个朋友私信问我ADS1220芯片相关的问题,之前的文章中做过一些介绍<SPI应用之驱动ADS1220>,今天再来做一个补充. 芯片简介   一个具有 PGA.VREF.2 个 I ...

  4. 步进电机S型曲线加速的实现

    之前做电机相关的项目比较少,最近有个项目涉及到步进电机的精确控制,参考了一些资料研究了一下S型曲线加减速,这里总结一下分享给大家. 硬件是:STM32+驱动器+步进电机. STM32定时器输出PWM, ...

  5. STM32F4 HAL库开发 -- USB U盘

    主要实现读写 U 盘/读卡器等大容量 USB 存储设备. 一.U盘简介 U盘,全程USB闪存盘,英文名"USB flash disk".它是一种使用USB接口的无需物理驱动器的微型 ...

  6. 2. STM32F4 USB协议研究 - SD卡模拟U盘

    有用的函数 串口打印 #include "stdarg.h"int USART1Printf(const char* format, ...) {static char sendB ...

  7. STM32F4开发板硬件简介

    参考:STM32F4开发板硬件平台简介 作者:SKY丶丿平才 发布时间: 2021-03-20 10:44:41 网址:https://blog.csdn.net/weixin_48264057/ar ...

  8. STM32Cube MX USB双设备MSC+CDC 实现虚拟U盘+虚拟串口

    前言 在上一篇文章实现USB虚拟U盘之后,项目需要用同一个USB口同时实现MSC和CDC功能,既能进行串口通信又能读取片外FLASH虚拟U盘.对于USB通用串行总线如果要真正搞明白这个协议还是比较困难 ...

  9. STM32F4开发板硬件平台简介

    文章目录 前言 一.ALIENTEK 探索者 STM32F4 开发板资源初探 1.开发板资源图 2.ALIENTEK 探索者 STM32F4 开发板板载资源汇总 3.ALIENTEK 探索者 STM3 ...

  10. pdfstamper生成pdf无法显示汉字_正点原子STM32F4/F7水星开发板资料连载第四十六章 汉字显示实验...

    1)实验平台:正点原子水星 STM32F4/F7 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 3)全套实验源码+手册+视频下载 ...

最新文章

  1. 【深度学习篇】--神经网络中的调优二,防止过拟合
  2. Linux下添加新硬盘,分区及挂载
  3. Jenkins将致力于提升稳定性、易用性和云原生兼容性
  4. html5 td中的5它空隙--待解决
  5. 计算机程序的思维逻辑 (12) - 函数调用的基本原理
  6. 计算机如何用vb文本加密,信息加密与隐藏工具的设计与实现VB231
  7. 1321. Robot
  8. api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决
  9. VMware 上Ubuntu虚拟机(15.1) ping不通物理主机(win10),但windows可以ping通虚拟机的问题解决方法...
  10. windows server 2008配置之AD域服务器 2
  11. Angr安装与使用之使用篇(十六)
  12. python,爬取图片
  13. 石油大学个人训练赛(一)补题----问题 D: 卡片
  14. MATLAB如何读取文件某一行的内容,如何读取文件的某一行
  15. MySQL inet aton函数_有个统计需求,需要对IP进行分类统计,Mysql提供了inet_aton()和inet_ntoa()函数进程处理。具体可以查看官方手册。INET_ATON(e...
  16. 检查图片是否空白图片
  17. 机房在线搬迁的规划与实施
  18. 麒麟系统ip连接数据库
  19. Unsupervised Question Answering by Cloze Translation 通过完形填空翻译的无监督的问答
  20. 【GPGPU编程模型与架构原理】第一章 1.3 现代 GPGPU 产品

热门文章

  1. miui11稳定版获取完整root_MIUI11系统怎么样刷入开发版获得Root超级权限
  2. duilib库combo box提供输入字符模糊查询
  3. 写论文时遇到的问题及解决办法
  4. iOS内购-防越狱破解刷单
  5. python中按钮位置设定_tkinter Python中的按钮位置(网格)
  6. 计算机网络实训报告总结,学习计算机网络的实训总结
  7. 逍遥安卓模拟器卡android,逍遥模拟器不流畅解决方法 逍遥安卓模拟器怎么设置不卡...
  8. Velodyne 64线激光雷达协议
  9. CentOS7.2安装配置scylladb
  10. 第一章 Java性能调优概述