HAL库USB+SD卡,读卡器设置
主控:STM32L476VE
STM32CUBE设置如下


开启SDMMC的DMA,RX和TX都设置为轮询模式


开启FATFS修改红框中内容

开启USB,设置device_only
host:主机
device:从机
OTG:既可以是主机也可以是从机,双功能设备
speed:传输速度,全速USB最高12M
low power: 低功耗模式
link power management :电源管理
VBUS sensing :USB 检测
signal start of frame:帧开始信号
开启USB_DEVICE中间件,选择mass storage class
mass storage class :大容量存储
audio storage class :音频协议
Communication Device Class:USB通信设备
download firmware updata : 固件更新
human interface device class :HID设备


中断优先级设置,SDMMC的DMA中断要低于SDMMC中断,USB中断要低于SDMMC的DMA中断

修改sdmmc.C和bsp_driver_sd.c见上一篇

修改usbd_storage_if.c

int8_t STORAGE_Init_FS(uint8_t lun)
{/* USER CODE BEGIN 2 *///MX_SDMMC1_SD_Init();BSP_SD_Init();return (USBD_OK);/* USER CODE END 2 */
}int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{/* USER CODE BEGIN 3 */HAL_SD_CardInfoTypeDef info;int8_t ret = -1;  if(BSP_SD_IsDetected() != SD_NOT_PRESENT){BSP_SD_GetCardInfo(&info);*block_num =  info.LogBlockNbr  - 1;*block_size = info.LogBlockSize;ret = 0;}return ret;/* USER CODE END 3 */
}int8_t STORAGE_IsReady_FS(uint8_t lun)
{/* USER CODE BEGIN 4 */static int8_t prev_status = 0;int8_t ret = -1;if(BSP_SD_IsDetected() != SD_NOT_PRESENT){if(prev_status < 0){BSP_SD_Init();prev_status = 0;}if(BSP_SD_GetCardState() == SD_TRANSFER_OK){ret = 0;}}else if(prev_status == 0){prev_status = -1;}return ret;/* USER CODE END 4 */
}int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
{/* USER CODE BEGIN 5 */return (USBD_OK);/* USER CODE END 5 */
}int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 6 */int8_t ret = -1;  if(BSP_SD_IsDetected() != SD_NOT_PRESENT){  BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);/* Wait for Rx Transfer completion */// while (ReadStatus == 0){}//  ReadStatus = 0;/* Wait until SD card is ready to use for new operation */while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}ret = 0;}return ret;/* USER CODE END 6 */
}int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{/* USER CODE BEGIN 7 */int8_t ret = -1;  if(BSP_SD_IsDetected() != SD_NOT_PRESENT){ BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);/* Wait for Tx Transfer completion *///    while (WriteStatus == 0){}//   WriteStatus = 0;  /* Wait until SD card is ready to use for new operation */while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}ret = 0;}return ret;/* USER CODE END 7 */
}int8_t STORAGE_GetMaxLun_FS(void)
{/* USER CODE BEGIN 8 */return (STORAGE_LUN_NBR - 1);/* USER CODE END 8 */
}

插入usb,电脑文件管理中就会显示有u盘了。

其中写函数中的
while (WriteStatus == 0){}
WriteStatus = 0;
和读函数中的
while (ReadStatus == 0){}
ReadStatus = 0;
这四句语句为官方例程中带的,注释掉后也可正常使用
但不注释掉会有问题
上面两个等待的变量应该在下面这两个回调函数中置1
void BSP_SD_WriteCpltCallback(void)
{

WriteStatus = 1;
}

void BSP_SD_ReadCpltCallback(void)
{
ReadStatus = 1;
}

需要修改sd_diskio.c文件中static volatile UINT WriteStatus = 0, ReadStatus = 0;
改为uint8_t WriteStatus = 0, ReadStatus = 0;(定义为全局变量)
在sd_diskio.h文件中声明extern uint8_t WriteStatus , ReadStatus ;
(同时加上#include “ff_gen_drv.h”,否则Diskio_drvTypeDef 报错)
在usbd_storage_if.c文件中加上#include “sd_diskio.h”
然后编译即可

HAL库USB+SD卡,读卡器设置相关推荐

  1. STM32F1 HAL库读写SD卡的操作要点

    本文采用的HAL库版本为STM32Cube_FW_F1_V1.8.0(带Patch-CubeF1 1.8.4). 知识点一:SD卡数据线位宽的配置 SD卡可以采用1位数据线模式,也可以采用4位数据线模 ...

  2. STM32 USB SD卡读卡器和NAND FLASH模拟U盘

    本次工程是要同时实现SD卡读卡器和NAND Flash模拟U盘的功能.结合之前的两个工程,稍稍修改下就可以了. 既然要实现两个盘,当然在usb_prop.c中的Max_Lun变量赋值为1,在USB_U ...

  3. 使用STM32CUBEMX HAL库读写SD卡

    SD 卡系统(包括主机和 SD 卡)定义了两种操作模式: 卡识别模式 数据传输模式 在系统复位后,主机处于卡识别模式,寻找总线上可用的 SD卡设备:同时,SD 卡也处于卡 识别模式,直到被主机识别到. ...

  4. VS code+STM32CubeMX 使用 FreeRTOS+FatFS+USB_DEVICE 搭建 SD卡 读卡器 和 读写 SD卡 示例项目

    文章目录 1. 新建项目 2. 配置 CubeMX 项目 3. 配置 EIDE 项目 4. 编写代码 5. 编译下载 6. 效果展示 本例介绍如何使用 vscode 插件 EIDE 和 STM32Cu ...

  5. ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能)

    ZYNQ裸机实现 USB MASS STORAGE (usb+sd卡 实现U盘功能) 之所以写裸机,也就是没有操作系统的实现方法是因为linux系统下的实现方法网上已经有很多了,之前使用的STM32实 ...

  6. Arduino ESP32 第三方库读取SD卡信息(三)

    Arduino ESP32 第三方库读取SD卡信息(三) 相关篇<Arduino ESP32 第三方库读取SD卡信息(一)> <Arduino ESP32 第三方库读取SD卡信息(二 ...

  7. 杰里之SD 卡 IO 设置【篇】

    芯片内部只有一组卡口,不管选择那组卡口 SDMMCA_EN 不需要修改. 在这里设置 sd 卡.

  8. SD卡读卡程序 C语言 IO模拟,单片机SD卡读卡器仿真+源程序+电路原理图

    #include #define F_OSC  11059200//晶振平率Hz #define F_BAUD 9600 #define RELOAD 256-F_OSC/12/32/F_BAUD # ...

  9. 基于51单片机的SD卡读卡器MMC存储器 proteus仿真程序设计

    硬件设计 (末尾附文件) 程序设计 #include <reg52.H>#define F_OSC 11059200//晶振平率Hz #define F_BAUD 9600 #define ...

最新文章

  1. PHP代码程序,php代码自动执行
  2. vue axios跨域请求_axios的请求拦截和vue路由的导航守卫有什么区别
  3. 数学 希腊字母 Greek Alphabet
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1109:开关灯
  5. C# 中的 lock的陷阱
  6. java元数据是什么_用存储过程和 JAVA 写报表数据源有什么弊端?
  7. 任务调度系统 xxl-job,V1.4.1 新特性速览
  8. python创建和删除文件有什么区别_python创建和删除文件
  9. java爬虫防屏蔽_Java爬虫技术之绕过百度云防护抓取网站内容
  10. nanohttpd:实现跨域(CORS)请求
  11. c语言判断算符优先级,C语言算符优先级(精华)
  12. 2018美国大学计算机科学,美国大学计算机2018最新排名
  13. 苹果公司的iPhone产品以及其历史
  14. gif原理+gifsicle压缩gif
  15. 小米笔记本Air 13.3 的键盘功能按键使用方式
  16. 千锋python培训班课程
  17. css入门之CSS1、CSS2、CSS3、CSS4发展历程
  18. 计算机网络技术教程第3版课后答案,《计算机网络技术基础教程》课后习题答案刘四清版3.doc...
  19. UG/NX二次开发 选择坐标系控件 uc1630
  20. 计算机英语词典 txt,英汉词典TXT格式英汉词典TXT格式.doc

热门文章

  1. 联想erazert410_联想erazert410
  2. 生成sitemap类
  3. 【JAVA程序设计】(C00067)基于SSM(非maven)图书馆座位预约管理系统
  4. AAC音频格式详解和实战解析
  5. 塔防游戏制作教程(四)
  6. 计算机的特点包括哪些?
  7. MoveBase源码阅读笔记
  8. 签名文件及使用360加固保生成渠道包
  9. 视频号的直播还有视频怎么下载呀?
  10. 【Python的configparser模块读取.ini文件内容并输出】