微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 第060例: USB-串行Flash模拟U盘

第060例: USB-串行Flash模拟U盘

时间:10-02 整理:3721RD 点击:
【HAL库每天一例】系列例程从今天开始持续更新。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:http://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-060. USB-串行Flash模拟U盘)
/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-060. USB-串行Flash模拟U盘
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */
【1】例程简介
  STM32F103ZET6内部集成USB控制器,在无需外接芯片可以做为USB从设备。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP3        PB0           LED1               已接入
  
【3】操作及现象
  使用开发板配套USB线连接到开发板标示“USB协议”字样的MIMI USB接口,打开开发板电源
开关。下载完程序之后,在电脑端会发现“可移动硬盘”并自动安装驱动,然后在“我的电脑”中
就可以发现串行Flash设备,效果与读卡器相同。正常运行后开发板LED1灯不断闪烁。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

usbd_msc_storage.c文件内容

  1. /* Includes ------------------------------------------------------------------*/
  2. #include "usbd_msc_storage.h"
  3. /* USER CODE BEGIN INCLUDE */
  4. #include "spiflash/bsp_spiflash.h"
  5. /* USER CODE END INCLUDE */

  6. /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  7.   * @{
  8.   */

  9. /** @defgroup USBD_STORAGE
  10.   * [url=home.php?mod=space&uid=247401]@brief[/url] usbd core module
  11.   * @{
  12.   */

  13. /** @defgroup USBD_STORAGE_Private_TypesDefinitions
  14.   * @{
  15.   */
  16. /* USER CODE BEGIN PRIVATE_TYPES */
  17. /* USER CODE END PRIVATE_TYPES */
  18. /**
  19.   * @}
  20.   */

  21. /** @defgroup USBD_STORAGE_Private_Defines
  22.   * @{
  23.   */
  24. #define SPI_FLASH_SECTOR_SIZE    4096    // 串行Flash扇区大小
  25. #define SPI_FLASH_START_SECTOR   1792    // 串行Flash文件系统FatFS偏移量
  26. #define SPI_FLASH_SECTOR_COUNT   2304    // 串行Flash文件系统FatFS占用扇区个数  

  27. #define STORAGE_LUN_NBR          1  
  28. #define STORAGE_BLK_SIZ          SPI_FLASH_SECTOR_SIZE

  29. /* USER CODE BEGIN PRIVATE_DEFINES */
  30. /* USER CODE END PRIVATE_DEFINES */
  31.   
  32. /**
  33.   * @}
  34.   */

  35. /** @defgroup USBD_STORAGE_Private_Macros
  36.   * @{
  37.   */
  38. /* USER CODE BEGIN PRIVATE_MACRO */
  39. /* USER CODE END PRIVATE_MACRO */

  40. /**
  41.   * @}
  42.   */

  43. /** @defgroup USBD_STORAGE_IF_Private_Variables
  44.   * @{
  45.   */
  46. /* USB handler declaration */
  47. /* Handle for USB Full Speed IP */
  48.   USBD_HandleTypeDef  *hUsbDevice_0;
  49. /* USER CODE BEGIN INQUIRY_DATA_FS */
  50. /* USB Mass storage Standard Inquiry Data */
  51. const int8_t  STORAGE_Inquirydata_FS[] = {//36
  52.   
  53.   /* LUN 0 */
  54.   0x00,               
  55.   0x80,               
  56.   0x02,               
  57.   0x02,
  58.   (STANDARD_INQUIRY_DATA_LEN - 5),
  59.   0x00,
  60.   0x00,        
  61.   0x00,
  62.   'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
  63.   'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
  64.   ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  65.   '0', '.', '0' ,'1',                     /* Version      : 4 Bytes */
  66. };
  67. /* USER CODE END INQUIRY_DATA_FS */

  68. /* USER CODE BEGIN PRIVATE_VARIABLES */
  69. /* USER CODE END PRIVATE_VARIABLES */

  70. /**
  71.   * @}
  72.   */

  73. /** @defgroup USBD_STORAGE_IF_Exported_Variables
  74.   * @{
  75.   */
  76.   extern USBD_HandleTypeDef hUsbDeviceFS;
  77. /* USER CODE BEGIN EXPORTED_VARIABLES */
  78. /* USER CODE END EXPORTED_VARIABLES */

  79. /**
  80.   * @}
  81.   */
  82.   
  83. /** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  84.   * @{
  85.   */
  86. static int8_t STORAGE_Init_FS (uint8_t lun);
  87. static int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
  88. static int8_t STORAGE_IsReady_FS (uint8_t lun);
  89. static int8_t STORAGE_IsWriteProtected_FS (uint8_t lun);
  90. static int8_t STORAGE_Read_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr,uint16_t blk_len);
  91. static int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr,uint16_t blk_len);
  92. static int8_t STORAGE_GetMaxLun_FS (void);

  93. /* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
  94. /* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

  95. /**
  96.   * @}
  97.   */
  98.   
  99. USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
  100. {
  101.   STORAGE_Init_FS,
  102.   STORAGE_GetCapacity_FS,
  103.   STORAGE_IsReady_FS,
  104.   STORAGE_IsWriteProtected_FS,
  105.   STORAGE_Read_FS,
  106.   STORAGE_Write_FS,
  107.   STORAGE_GetMaxLun_FS,
  108.   (int8_t *)STORAGE_Inquirydata_FS,
  109. };

  110. /* Private functions ---------------------------------------------------------*/
  111. /*******************************************************************************
  112. * Function Name  : STORAGE_Init_FS
  113. * Description    :
  114. * Input          : None.
  115. * Output         : None.
  116. * Return         : None.
  117. *******************************************************************************/
  118. int8_t STORAGE_Init_FS (uint8_t lun)
  119. {
  120.   /* USER CODE BEGIN 2 */
  121.   int8_t res=-1;
  122.   MX_SPIFlash_Init();
  123.     if(SPI_FLASH_ReadID()==SPI_FLASH_ID)
  124.   {
  125.     res=USBD_OK;
  126.   }
  127.   return res;
  128.   /* USER CODE END 2 */
  129. }

  130. /*******************************************************************************
  131. * Function Name  : STORAGE_GetCapacity_FS
  132. * Description    :
  133. * Input          : None.
  134. * Output         : None.
  135. * Return         : None.
  136. *******************************************************************************/
  137. int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
  138. {
  139.   /* USER CODE BEGIN 3 */  
  140.   *block_num  = SPI_FLASH_SECTOR_COUNT;
  141.   *block_size = STORAGE_BLK_SIZ;
  142.   return (USBD_OK);
  143.   /* USER CODE END 3 */
  144. }

  145. /*******************************************************************************
  146. * Function Name  : STORAGE_IsReady_FS
  147. * Description    :
  148. * Input          : None.
  149. * Output         : None.
  150. * Return         : None.
  151. *******************************************************************************/
  152. int8_t  STORAGE_IsReady_FS (uint8_t lun)
  153. {
  154.   /* USER CODE BEGIN 4 */
  155.   if(SPI_FLASH_ReadID()==SPI_FLASH_ID)
  156.     return (USBD_OK);
  157.   else
  158.     return -1;
  159.   /* USER CODE END 4 */
  160. }

  161. /*******************************************************************************
  162. * Function Name  : STORAGE_IsWriteProtected_FS
  163. * Description    :
  164. * Input          : None.
  165. * Output         : None.
  166. * Return         : None.
  167. *******************************************************************************/
  168. int8_t  STORAGE_IsWriteProtected_FS (uint8_t lun)
  169. {
  170.   /* USER CODE BEGIN 5 */
  171.   return (USBD_OK);
  172.   /* USER CODE END 5 */
  173. }

  174. /*******************************************************************************
  175. * Function Name  : STORAGE_Read_FS
  176. * Description    :
  177. * Input          : None.
  178. * Output         : None.
  179. * Return         : None.
  180. *******************************************************************************/
  181. int8_t STORAGE_Read_FS (uint8_t lun,
  182.                         uint8_t *buf,
  183.                         uint32_t blk_addr,                       
  184.                         uint16_t blk_len)
  185. {
  186.   /* USER CODE BEGIN 6 */
  187.   blk_addr+=SPI_FLASH_START_SECTOR;      
  188.   SPI_FLASH_BufferRead(buf, blk_addr*SPI_FLASH_SECTOR_SIZE, blk_len*SPI_FLASH_SECTOR_SIZE);
  189.   return (USBD_OK);
  190.   /* USER CODE END 6 */
  191. }

  192. /*******************************************************************************
  193. * Function Name  : STORAGE_Write_FS
  194. * Description    :
  195. * Input          : None.
  196. * Output         : None.
  197. * Return         : None.
  198. *******************************************************************************/
  199. int8_t STORAGE_Write_FS (uint8_t lun,
  200.                          uint8_t *buf,
  201.                          uint32_t blk_addr,
  202.                          uint16_t blk_len)
  203. {
  204.   /* USER CODE BEGIN 7 */
  205.   uint32_t write_addr;
  206.   /* 扇区偏移7MB,外部Flash文件系统空间放在SPI Flash后面9MB空间 */
  207.   blk_addr+=SPI_FLASH_START_SECTOR;
  208.   write_addr = blk_addr*SPI_FLASH_SECTOR_SIZE;   
  209.   SPI_FLASH_SectorErase(write_addr);
  210.   SPI_FLASH_BufferWrite(buf,write_addr,blk_len*SPI_FLASH_SECTOR_SIZE);
  211.   return USBD_OK;
  212.   /* USER CODE END 7 */
  213. }

  214. /*******************************************************************************
  215. * Function Name  : STORAGE_GetMaxLun_FS
  216. * Description    :
  217. * Input          : None.
  218. * Output         : None.
  219. * Return         : None.
  220. *******************************************************************************/
  221. int8_t STORAGE_GetMaxLun_FS (void)
  222. {
  223.   /* USER CODE BEGIN 8 */
  224.   return (STORAGE_LUN_NBR - 1);
  225.   /* USER CODE END 8 */
  226. }

  227. /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
  228. /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

  229. /**
  230.   * @}
  231.   */

  232. /**
  233.   * @}
  234.   */  
  235. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

复制代码


小编:分享了,谢谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top