stm32-USB使用记录(二)

前面的笔记中已经提到了就是可以通过STM32的USB外设来完成虚拟串口(CDC)还有大容量储存设备(MSB)的功能,但是对于单片机而言,内部的flsh总是不够的,使用内部flsh来作为一种存储性的用途是在是有点浪费了,因此本文就来介绍使用外部flsh芯片还有外挂的SD卡来实现类似USB内存卡的功能!

上一篇文章的链接如下:stm32-USB使用记录(一)

1、使用外挂FLASH芯片模拟U盘

这里我们选用比较常见的W25Q64,其实这个也就是做个接口,我们就是调用这个接口给对应的flash读取函数去使用就行了。

这里我用的FLASH接口如下所示:
在这里插入图片描述
选用的FLASH芯片最小的块地址还有块数量可以在芯片手册中查到如下所示
在这里插入图片描述
转换成16进制如下所示:
在这里插入图片描述
因此我们在代码中修改如下
在这里插入图片描述
添加W25Q64驱动函数,因为本篇文章重点不是介绍W25Q64的读写驱动,所以这里我直接用了比较成熟的代码
在这里插入图片描述
在配置上也只需要就是配置好对应的引脚还有片选信号就可以了
在这里插入图片描述
之后就是跟配置FLASH一样的来配置读取的函数了,首先是初始化函数
在这里插入图片描述
下面是读取的块大小还有数量
在这里插入图片描述
下面是读取还有写入函数
在这里插入图片描述
源码如下所示:

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
    
    
  /* USER CODE BEGIN 6 */
	W25qxx_ReadSector(buf,blk_addr,0,blk_len*4096);
  return (USBD_OK);
  /* USER CODE END 6 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
    
    
  /* USER CODE BEGIN 7 */
	uint32_t i = 0;
	for(i = 0;i < blk_len; i++)
	{
    
    
		W25qxx_EraseSector(i + blk_addr);
	}
	//W25qxx_EraseSector(blk_addr);
	W25qxx_WriteSector(buf,blk_addr,0,blk_len*4096);
  return (USBD_OK);
  /* USER CODE END 7 */
}

之后我们将程序下载到开发板,并打开资源管理器,就可以看到我们的u盘被展示出来了
在这里插入图片描述
尝试往u盘中写入文件,效果如下所示:
在这里插入图片描述

2、使用sd卡模拟U盘

我们首先还是根据原理图来设置SD卡的状态,可以看到这里野火的MINI开发板是将SD卡和flash用的同一套SPI的总线,然后区别就在片选信号上了。
在这里插入图片描述
在cubemx中的配置如下,记得就是要配置好片段信号,只要设置为输出模式即可
在这里插入图片描述
下面就是加入SD卡的驱动移植了,这里还是一样的,就是按照正常的操作来即可,选择一个正常的SD卡操作函数即可
在这里插入图片描述
下面就是在USB初始化的时候加入SD卡的初始化函数还有就是块大小还有块数量
在这里插入图片描述
之后就是在读写函数里面加上SD卡的操作接口
在这里插入图片描述
讲程序下载到开发板,连上USB线,就可以看到我们的U盘了
在这里插入图片描述
尝试进行读写,一切正常!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51220742/article/details/124142429