本人今天由于项目的原因,要用到将STM32作为一个大容量的存储器,网上看了许多教程,这方面写的都不是较好,最后参考原子哥的例程,实现了这一功能。废话不多说。 首先大致介绍一下整体的流程 首先基本的时钟设置等,就不再赘述。 好了,基本的USB模式设置已经完成,之后需要设置SD卡的模式 需要修改heap的大小,我这里修改为 首先我们需要加入SPI Flash的驱动,我用的是W25Q128这个闪存芯片,这部分驱动代码省略。 找到usbd_storage_if.c文件,先修改 增加设备的标识等,按格式增加就行了,如果后面设置正常,插入usb之后,电脑usb设备的标识会和这里的一样 之后,在里面修改下面这个函数 主要需要修改的内容是block_num 和block_size,在里面需要指出容量的大小和扇区的大小,到此,如果我们下载代码,插上USB,就会发现电脑里面已经能够识别大容量USB设备了,但是无法进行格式化等操作。 完成之后,接下来需要修改读写操作的函数,这样才能实现U盘的正常读写 修改 修改 还需要注意的一个地方是生成的main函数中,我们要在usb初始化之前,初始化sd卡和spi flash 好了,基本的修改就完成了,我们就可以下载代码进行验证 本文中,简单介绍了如何使用STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器,下面将在此基础上,增加FATFS文件系统,此部分的代码上传至Github.,有需要的朋友可以下载STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器
STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器
总体流程
STM32CubeMX设置
0x1000
,如果不修改,就不能正常运行,最后生成MDK代码MDK代码修改
STORAGE_LUN_NBR
宏定义为2
,这样就表示我们有两个设备const int8_t STORAGE_Inquirydata_FS[] = {/* 36 */ /* LUN 0 */ 0x00, 0x80, 0x02, 0x02, (STANDARD_INQUIRY_DATA_LEN - 5), 0x00, 0x00, 0x00, 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ 'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '.', '0' ,'1', /* Version : 4 Bytes */ /* LUN 1 */ 0x00, 0x80, 0x02, 0x02, (STANDARD_INQUIRY_DATA_LEN - 5), 0x00, 0x00, 0x00, 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ 'S', 'P', 'I', 'F', 'L', 'A', 'S', 'H', /* Product : 16 Bytes */ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '0', '.', '0' ,'1' /* Version : 4 Bytes */ };
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size) { /* USER CODE BEGIN 3 */ if(lun==0)/*指定为SD*/ { HAL_SD_CardInfoTypeDef CardInfo; HAL_SD_GetCardInfo(&hsd,&CardInfo); *block_num = CardInfo.BlockNbr; *block_size = CardInfo.BlockSize; } else/*指定为Flash*/ { *block_num = 1024*1024*12/512; *block_size = 512; } return (USBD_OK); /* USER CODE END 3 */ }
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) { /* USER CODE BEGIN 6 */ 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); /* USER CODE END 6 */ }
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) { /* USER CODE BEGIN 7 */ 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); /* USER CODE END 7 */ }
MX_GPIO_Init(); MX_SDIO_SD_Init(); // MX_USB_DEVICE_Init(); // MX_SPI1_Init(); /* USER CODE BEGIN 2 */ MX_SPI1_Init(); W25QXX_Init(); MX_USB_DEVICE_Init(); /* USER CODE END 2 */
如果一切正常,就会像这样,多出来两个磁盘,名称就是我们最开始数组中设置的
也能在里面正常的读写文件,如此,这样就完成了基本的功能最后
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算