STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器

STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器

总体流程

STM32CubeMX设置

MDK代码修改

最后

STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器

本人今天由于项目的原因,要用到将STM32作为一个大容量的存储器,网上看了许多教程,这方面写的都不是较好,最后参考原子哥的例程,实现了这一功能。废话不多说。

总体流程

首先大致介绍一下整体的流程

在STM32CubeMX中 ,配置USB device为Mass Storage Class;

打开SDIO外设,根据SD卡的类型,选择对应的Mode;

打开SPI外设,设置为全双工主机模式,不使能硬件NSS;

生成MDK工程;

在MDK中修改usbd_storage_if.c文件的内容;

下载验证;

STM32CubeMX设置

首先基本的时钟设置等,就不再赘述。

下面首先选择USB为Device模式。

选择之后,列表会多出来一个USB_DEVICE选项,在里面设置为Mass Storage Class

好了,基本的USB模式设置已经完成,之后需要设置SD卡的模式

SD卡基本设置,本人用的是4线的SD卡,所以选择的是4 bits的模式

然后是设置SPI,这里我们选择全双工主机模式,不使能硬件NSS

然后需要设置一下时钟,我这里设置的是64分频,其他默认就行了

需要修改heap的大小,我这里修改为0x1000,如果不修改,就不能正常运行,最后生成MDK代码

MDK代码修改

首先我们需要加入SPI Flash的驱动,我用的是W25Q128这个闪存芯片,这部分驱动代码省略。

找到usbd_storage_if.c文件,先修改STORAGE_LUN_NBR宏定义为2,这样就表示我们有两个设备

增加设备的标识等,按格式增加就行了,如果后面设置正常,插入usb之后,电脑usb设备的标识会和这里的一样

const int8_t STORAGE_Inquirydata_FS[] = {

0x00,

0x80,

0x02,

0x02,

(STANDARD_INQUIRY_DATA_LEN - 5),

0x00,

0x00,

0x00,

'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ',

'P', 'r', 'o', 'd', 'u', 'c', 't', ' ',

' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',

'0', '.', '0' ,'1',

0x00,

0x80,

0x02,

0x02,

(STANDARD_INQUIRY_DATA_LEN - 5),

0x00,

0x00,

0x00,

'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ',

'S', 'P', 'I', 'F', 'L', 'A', 'S', 'H',

' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',

'0', '.', '0' ,'1'

};

之后,在里面修改下面这个函数int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)

主要需要修改的内容是block_num 和block_size,在里面需要指出容量的大小和扇区的大小,到此,如果我们下载代码,插上USB,就会发现电脑里面已经能够识别大容量USB设备了,但是无法进行格式化等操作。

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)

{

if(lun==0)

{

HAL_SD_CardInfoTypeDef CardInfo;

HAL_SD_GetCardInfo(&hsd,&CardInfo);

*block_num = CardInfo.BlockNbr;

*block_size = CardInfo.BlockSize;

}

else

{

*block_num = 1024*1024*12/512;

*block_size = 512;

}

return (USBD_OK);

}

完成之后,接下来需要修改读写操作的函数,这样才能实现U盘的正常读写

修改int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)这个函数,修改的内容如下:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)

{

int8_t res=0;

if(lun==0)

{

res=HAL_SD_ReadBlocks(&hsd,buf,blk_addr,blk_len,0xffff);

}

else

{

W25QXX_Read(buf,blk_addr*512,blk_len*512);

}

return (USBD_OK);

}

修改int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)这个函数,修改的内容如下:

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)

{

int8_t res=0;

if(lun==0)

{

res=HAL_SD_WriteBlocks(&hsd,buf,blk_addr,blk_len,0xffff);

}

else

{

W25QXX_Write(buf,blk_addr*512,blk_len*512);

}

return (USBD_OK);

}

还需要注意的一个地方是生成的main函数中,我们要在usb初始化之前,初始化sd卡和spi flash

MX_GPIO_Init();

MX_SDIO_SD_Init();

// MX_USB_DEVICE_Init();

// MX_SPI1_Init();

MX_SPI1_Init();

W25QXX_Init();

MX_USB_DEVICE_Init();

好了,基本的修改就完成了,我们就可以下载代码进行验证

如果一切正常,就会像这样,多出来两个磁盘,名称就是我们最开始数组中设置的

也能在里面正常的读写文件,如此,这样就完成了基本的功能

最后

本文中,简单介绍了如何使用STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器,下面将在此基础上,增加FATFS文件系统,此部分的代码上传至Github.,有需要的朋友可以下载

cubemx 读卡器_STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器相关推荐

  1. Keil(MDK)下用仿真器烧程序的同时烧写附加数据到SPI FLASH

    之前在i.MX rt板块经常看到i.MX RT最新支持XXX Flash的下载算法,于是冒出一个问题,下载算法是啥.故花时间研究了一下. 一.了解下载算法 研究过程中参考了这篇文章:更进一步的了解Ke ...

  2. STM32F4-SPI

    SPI 简介 SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口.是 Motorola首先在其 MC68HCXX 系列处理器上定义的.SPI ...

  3. STM32F4 HAL库开发 -- SPI Flash

    一.驱动 bsp_spi_flash.c #include "THC_Board_include_h.h"/* Private define ------------------- ...

  4. stm32 cubemx usb spi flash w25q128 u盘调试笔记

    真的太简单了,十分钟就搞定 参考文章 我卡住了几天,最后发现delay函数的问题,去掉就好了.(评论大佬解释了这一现象) 步骤如下 使用cube mx 生成基本代码 调试spi flash 调试usb ...

  5. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  6. STM32F4内的FLASH和RAM

    STM32F4内的FLASH和RAM(CCM) 单片机的flash和RAM,可以简单理解为电脑的硬盘和内存条. FLASH 什么是FLASH?FLASH的作用? 掉电不丢失数据,能够存储数据的存储器, ...

  7. STM32CubeMX学习笔记(25)——FatFs文件系统使用(操作SPI Flash)

    一.FatFs简介 FatFs 是面向小型嵌入式系统的一种通用的 FAT 文件系统.它完全是由 ANSI C 语言编写并且完全独立于底层的 I/O 介质.因此它可以很容易地不加修改地移植到其他的处理器 ...

  8. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(SPI flash)

    一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...

  9. 在RT-Thread STM32F407平台下配置SPI flash为U盘

    记录下SPI Flash U盘实现过程中踩过的坑,与您分享. 前提条件是,需要先将SPI Flash 配置到elm fal文件系统,并挂载成功.如下图 然后开始配置USB 1,在CubeMX,选择SU ...

最新文章

  1. Java常用四大线程池用法以及ThreadPoolExecutor详解
  2. 如何使用PHP解析JSON文件? [重复]
  3. php基于laravel框架的批量插入操作
  4. 揭开Google暴利秘密的数学公式
  5. 【pmcaff专栏】陆蔚青:漫谈商业智能
  6. asp.net core 错误定位 vs2017 远程调试部署在centos上的asp.net core程序
  7. AUTOSAR从入门到精通100讲(三十八)-通信网络中的⽐特和帧同步技术
  8. [原创] 在XP/2K 下实现 Win+Ctrl+Del 等键的屏蔽的方法,附源码与演示程序下载。...
  9. java: Iterator的使用
  10. 【2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16) A】The game of Osho【SG函数+找规律】
  11. COMSOL指南:COMSOL案例库文件夹的寻找
  12. ENSP静态路由配置
  13. c java long_C语言中输出long long型数据怎么输出
  14. android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...
  15. 农历阳历转换 java_Java编程实例:Java版农历和阳历转换源码
  16. 电脑:键盘快捷键的更改(主要以dell笔记本电脑为模拟对象)
  17. 常用的18大学术搜索引擎
  18. 简单学JAVA-Java学习方法-JavaSE阶段
  19. CPU性能衡量参数-主频,MIPS,CPI,时钟周期,机器周期,指令周期
  20. 使用Vue写一个登录页面

热门文章

  1. svn——svn commit 用法
  2. 网络安全:漏洞类型和解决方案
  3. 装系统的时候提示当前引导方式不是BIOS
  4. c 语言单位转换编程,《C语言及程序设计》实践参考——单位转换对照表
  5. python图表excel数据改变_如何不让Excel图表随源数据改变而改变
  6. 深信服企业云部署步骤
  7. 木瓜移动CFO刘凡 释放数字时代女性创新力量
  8. 宝洁聚焦“用爱指引”的2020东京奥运会参赛运动员,称颂他们的举动,并鼓励其他运动员采取积极行动
  9. 让你的网站关键词排名排到首页的九大技巧
  10. Base64加密后+丢失问题