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

   日期:2020-06-01     浏览:455    评论:0    
核心提示:STM32CubeMX实现STM32F4读卡器欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。嵌

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

  • STM32CubeMX+Keil实现 STM32F4 SDcard+SPI Flash读卡器
    • 总体流程
    • STM32CubeMX设置
    • MDK代码修改
    • 最后

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

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

总体流程

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

  1. STM32CubeMX中 ,配置USB deviceMass Storage Class
  2. 打开SDIO外设,根据SD卡的类型,选择对应的Mode
  3. 打开SPI外设,设置为全双工主机模式,不使能硬件NSS
  4. 生成MDK工程
  5. MDK中修改usbd_storage_if.c文件的内容;
  6. 下载验证;

STM32CubeMX设置

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

  1. 下面首先选择USB为Device模式。
  2. 选择之后,列表会多出来一个USB_DEVICE选项,在里面设置为Mass Storage Class

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

  1. SD卡基本设置,本人用的是4线的SD卡,所以选择的是4 bits的模式
  2. 然后是设置SPI,这里我们选择全双工主机模式,不使能硬件NSS
  3. 然后需要设置一下时钟,我这里设置的是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.,有需要的朋友可以下载

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服