你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 2615|回复: 5

【HAL库每天一例】第059例:USB-SD卡模拟U盘

[复制链接]

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
发表于 2016-7-3 11:50:05 | 显示全部楼层 |阅读模式
【HAL库每天一例】系列例程从今天开始持续更新。。。。。
我们将坚持每天至少发布一个基于YS-F1Pro开发板的HAL库例程,
该系列例程将带领大家从零开始使用HAL库,后面会持续添加模块应用例程。
同样的,我们还程序发布基于HAL库的指导文档和视频教程,欢迎持续关注,并提出改进意见。
例程下载:
资料包括程序、相关说明资料以及软件使用截图
链接:https://pan.baidu.com/s/1i574oPv
密码:r3s3

(硬石YS-F1Pro开发板HAL库例程持续更新\1. 软件设计之基本裸机例程(HAL库版本)\YSF1_HAL-059. USB-SD卡模拟U盘

/**
  ******************************************************************************
  *                           硬石YS-F1Pro开发板例程功能说明
  *
  *  例程名称: YSF1_HAL-059. USB-SD卡模拟U盘
  *   
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  *
  * 淘宝:
  * 论坛:硬石电子社区
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */

【1】例程简介
  STM32F103ZET6内部集成USB控制器,在无需外接芯片可以做为USB从设备。
  
【2】跳线帽情况
******* 为保证例程正常运行,必须插入以下跳线帽 **********
丝印编号     IO端口      目标功能引脚        出厂默认设置
  JP1        PA10        TXD(CH340G)          已接入
  JP2        PA9         RXD(CH340G)          已接入
  JP3        PB0           LED1               已接入
  
【3】操作及现象
  将一张小于32G大小的Micro SD卡插入到开发板上的SD卡槽内,使用开发板配套USB线连接
到开发板标示“USB协议”字样的MIMI USB接口,打开开发板电源开关。下载完程序之后,
在电脑端会发现“可移动硬盘”并自动安装驱动,然后在“我的电脑”中就可以发现SD卡设
备,效果与读卡器相同。对于容量较大的设备,需要一定的扫描时间才可以打开。正常运行
后开发板LED1灯不断闪烁。
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/
CubeMX_1.jpg
CubeMX_2.jpg
CubeMX_3.jpg
CubeMX_4.jpg
CubeMX_5.jpg
CubeMX_6.jpg
CubeMX_7.jpg
CubeMX_8.jpg
CubeMX_9.jpg
CubeMX_10.jpg
CubeMX_11.jpg
CubeMX_12.jpg
CubeMX_13.jpg


usbd_msc_storage.c文件内容
  1. /**
  2.   ******************************************************************************
  3.   * @file           : usbd_storage_if.c
  4.   * @brief          : Memory management layer
  5.   ******************************************************************************
  6.   * COPYRIGHT(c) 2016 STMicroelectronics
  7.   *
  8.   * Redistribution and use in source and binary forms, with or without modification,
  9.   * are permitted provided that the following conditions are met:
  10.   * 1. Redistributions of source code must retain the above copyright notice,
  11.   * this list of conditions and the following disclaimer.
  12.   * 2. Redistributions in binary form must reproduce the above copyright notice,
  13.   * this list of conditions and the following disclaimer in the documentation
  14.   * and/or other materials provided with the distribution.
  15.   * 3. Neither the name of STMicroelectronics nor the names of its contributors
  16.   * may be used to endorse or promote products derived from this software
  17.   * without specific prior written permission.
  18.   *
  19.   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  20.   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21.   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22.   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  23.   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24.   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  25.   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  26.   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  27.   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28.   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.   *
  30.   ******************************************************************************
  31. */

  32. /* Includes ------------------------------------------------------------------*/
  33. #include "usbd_msc_storage.h"
  34. /* USER CODE BEGIN INCLUDE */
  35. #include "sdio/bsp_sdcard.h"
  36. /* USER CODE END INCLUDE */

  37. /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  38.   * @{
  39.   */

  40. /** @defgroup USBD_STORAGE
  41.   * @brief usbd core module
  42.   * @{
  43.   */

  44. /** @defgroup USBD_STORAGE_Private_TypesDefinitions
  45.   * @{
  46.   */
  47. /* USER CODE BEGIN PRIVATE_TYPES */
  48. /* USER CODE END PRIVATE_TYPES */
  49. /**
  50.   * @}
  51.   */

  52. /** @defgroup USBD_STORAGE_Private_Defines
  53.   * @{
  54.   */
  55. #define STORAGE_LUN_NBR                  1  
  56. #define STORAGE_BLK_SIZ                  0x200

  57. /* USER CODE BEGIN PRIVATE_DEFINES */
  58. /* USER CODE END PRIVATE_DEFINES */
  59.   
  60. /**
  61.   * @}
  62.   */

  63. /** @defgroup USBD_STORAGE_Private_Macros
  64.   * @{
  65.   */
  66. /* USER CODE BEGIN PRIVATE_MACRO */
  67. /* USER CODE END PRIVATE_MACRO */

  68. /**
  69.   * @}
  70.   */

  71. /** @defgroup USBD_STORAGE_IF_Private_Variables
  72.   * @{
  73.   */
  74. /* USB handler declaration */
  75. /* Handle for USB Full Speed IP */
  76.   USBD_HandleTypeDef  *hUsbDevice_0;
  77. /* USER CODE BEGIN INQUIRY_DATA_FS */
  78. /* USB Mass storage Standard Inquiry Data */
  79. const int8_t  STORAGE_Inquirydata_FS[] = {//36
  80.   
  81.   /* LUN 0 */
  82.   0x00,               
  83.   0x80,               
  84.   0x02,               
  85.   0x02,
  86.   (STANDARD_INQUIRY_DATA_LEN - 5),
  87.   0x00,
  88.   0x00,        
  89.   0x00,
  90.   'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
  91.   'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product      : 16 Bytes */
  92.   ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
  93.   '0', '.', '0' ,'1',                     /* Version      : 4 Bytes */
  94. };
  95. /* USER CODE END INQUIRY_DATA_FS */

  96. /* USER CODE BEGIN PRIVATE_VARIABLES */
  97. /* USER CODE END PRIVATE_VARIABLES */

  98. /**
  99.   * @}
  100.   */

  101. /** @defgroup USBD_STORAGE_IF_Exported_Variables
  102.   * @{
  103.   */
  104.   extern USBD_HandleTypeDef hUsbDeviceFS;
  105. /* USER CODE BEGIN EXPORTED_VARIABLES */
  106. /* USER CODE END EXPORTED_VARIABLES */

  107. /**
  108.   * @}
  109.   */
  110.   
  111. /** @defgroup USBD_STORAGE_Private_FunctionPrototypes
  112.   * @{
  113.   */
  114. static int8_t STORAGE_Init_FS (uint8_t lun);
  115. static int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size);
  116. static int8_t STORAGE_IsReady_FS (uint8_t lun);
  117. static int8_t STORAGE_IsWriteProtected_FS (uint8_t lun);
  118. static int8_t STORAGE_Read_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr,uint16_t blk_len);
  119. static int8_t STORAGE_Write_FS (uint8_t lun, uint8_t *buf, uint32_t blk_addr,uint16_t blk_len);
  120. static int8_t STORAGE_GetMaxLun_FS (void);

  121. /* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
  122. /* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */

  123. /**
  124.   * @}
  125.   */
  126.   
  127. USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
  128. {
  129.   STORAGE_Init_FS,
  130.   STORAGE_GetCapacity_FS,
  131.   STORAGE_IsReady_FS,
  132.   STORAGE_IsWriteProtected_FS,
  133.   STORAGE_Read_FS,
  134.   STORAGE_Write_FS,
  135.   STORAGE_GetMaxLun_FS,
  136.   (int8_t *)STORAGE_Inquirydata_FS,
  137. };

  138. /* Private functions ---------------------------------------------------------*/
  139. /*******************************************************************************
  140. * Function Name  : STORAGE_Init_FS
  141. * Description    :
  142. * Input          : None.
  143. * Output         : None.
  144. * Return         : None.
  145. *******************************************************************************/
  146. int8_t STORAGE_Init_FS (uint8_t lun)
  147. {
  148.   /* USER CODE BEGIN 2 */
  149.   MX_SDIO_SD_Init();
  150.   return (USBD_OK);
  151.   /* USER CODE END 2 */
  152. }

  153. /*******************************************************************************
  154. * Function Name  : STORAGE_GetCapacity_FS
  155. * Description    :
  156. * Input          : None.
  157. * Output         : None.
  158. * Return         : None.
  159. *******************************************************************************/
  160. int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size)
  161. {
  162.   /* USER CODE BEGIN 3 */   
  163.   /* Get SD card Information */
  164.   HAL_SD_Get_CardInfo(&hsdcard, &SDCardInfo);
  165.   
  166.   *block_num  = SDCardInfo.CardCapacity/STORAGE_BLK_SIZ-1;
  167.   *block_size = STORAGE_BLK_SIZ;
  168.   return (USBD_OK);
  169.   /* USER CODE END 3 */
  170. }

  171. /*******************************************************************************
  172. * Function Name  : STORAGE_IsReady_FS
  173. * Description    :
  174. * Input          : None.
  175. * Output         : None.
  176. * Return         : None.
  177. *******************************************************************************/
  178. int8_t  STORAGE_IsReady_FS (uint8_t lun)
  179. {
  180.   /* USER CODE BEGIN 4 */
  181.   if(HAL_SD_GetStatus(&hsdcard)==SD_TRANSFER_OK)
  182.     return (USBD_OK);
  183.   else
  184.     return -1;
  185.   /* USER CODE END 4 */
  186. }

  187. /*******************************************************************************
  188. * Function Name  : STORAGE_IsWriteProtected_FS
  189. * Description    :
  190. * Input          : None.
  191. * Output         : None.
  192. * Return         : None.
  193. *******************************************************************************/
  194. int8_t  STORAGE_IsWriteProtected_FS (uint8_t lun)
  195. {
  196.   /* USER CODE BEGIN 5 */
  197.   return (USBD_OK);
  198.   /* USER CODE END 5 */
  199. }

  200. /**
  201.   * @brief SD_DMAConfigRx
  202.   * @par Function Description
  203.   *   This function configure the DMA to receive data from the SD card
  204.   * @retval
  205.   *  SD_ERROR or SD_OK
  206.   */
  207. HAL_SD_ErrorTypedef SD_DMAConfigRx(SD_HandleTypeDef *hsd)
  208. {
  209.   static DMA_HandleTypeDef hdma_rx;
  210.   HAL_StatusTypeDef status = HAL_ERROR;
  211.   
  212.   if(hsd->hdmarx == NULL)
  213.   {
  214.     /* Configure DMA Rx parameters */
  215.     hdma_rx.Init.Direction           = DMA_PERIPH_TO_MEMORY;
  216.     hdma_rx.Init.PeriphInc           = DMA_PINC_DISABLE;
  217.     hdma_rx.Init.MemInc              = DMA_MINC_ENABLE;
  218.     hdma_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  219.     hdma_rx.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
  220.     hdma_rx.Init.Priority            = DMA_PRIORITY_VERY_HIGH;

  221.     hdma_rx.Instance = DMA2_Channel4;

  222.     /* Associate the DMA handle */
  223.     __HAL_LINKDMA(hsd, hdmarx, hdma_rx);

  224.     /* Stop any ongoing transfer and reset the state*/
  225.     HAL_DMA_Abort(&hdma_rx);
  226.    
  227.     /* Deinitialize the Channel for new transfer */
  228.     HAL_DMA_DeInit(&hdma_rx);

  229.     /* Configure the DMA Channel */
  230.     status = HAL_DMA_Init(&hdma_rx);
  231.    
  232.     /* NVIC configuration for DMA transfer complete interrupt */
  233.     HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 1, 0);
  234.     HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);
  235.   }
  236.   else
  237.   {
  238.     status = HAL_OK;
  239.   }
  240.   
  241.   return (status != HAL_OK? SD_ERROR : SD_OK);
  242. }

  243. /**
  244.   * @brief SD_DMAConfigTx
  245.   * @par Function Description
  246.   *   This function configure the DMA to transmit data to the SD card
  247.   * @retval
  248.   *  SD_ERROR or SD_OK
  249.   */
  250. HAL_SD_ErrorTypedef SD_DMAConfigTx(SD_HandleTypeDef *hsd)
  251. {
  252.   static DMA_HandleTypeDef hdma_tx;
  253.   HAL_StatusTypeDef status;
  254.   
  255.   if(hsd->hdmatx == NULL)
  256.   {
  257.     /* Configure DMA Tx parameters */
  258.     hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
  259.     hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
  260.     hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
  261.     hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  262.     hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_WORD;
  263.     hdma_tx.Init.Priority            = DMA_PRIORITY_VERY_HIGH;
  264.    
  265.     hdma_tx.Instance = DMA2_Channel4;
  266.    
  267.     /* Associate the DMA handle */
  268.     __HAL_LINKDMA(hsd, hdmatx, hdma_tx);
  269.    
  270.     /* Stop any ongoing transfer and reset the state*/
  271.     HAL_DMA_Abort(&hdma_tx);
  272.    
  273.     /* Deinitialize the Channel for new transfer */
  274.     HAL_DMA_DeInit(&hdma_tx);
  275.    
  276.     /* Configure the DMA Channel */
  277.     status = HAL_DMA_Init(&hdma_tx);
  278.    
  279.     /* NVIC configuration for DMA transfer complete interrupt */
  280.     HAL_NVIC_SetPriority(DMA2_Channel4_5_IRQn, 1, 0);
  281.     HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn);  
  282.   }
  283.   else
  284.   {
  285.     status = HAL_OK;
  286.   }
  287.   
  288.   return (status != HAL_OK? SD_ERROR : SD_OK);
  289. }

  290. /*******************************************************************************
  291. * Function Name  : STORAGE_Read_FS
  292. * Description    :
  293. * Input          : None.
  294. * Output         : None.
  295. * Return         : None.
  296. *******************************************************************************/
  297. int8_t STORAGE_Read_FS (uint8_t lun,
  298.                         uint8_t *buf,
  299.                         uint32_t blk_addr,                       
  300.                         uint16_t blk_len)
  301. {
  302.   /* USER CODE BEGIN 6 */
  303.   uint8_t state = 0;
  304.   hsdcard.hdmatx=NULL;
  305.   
  306.   /* Prepare the dma channel for a read operation */
  307.   state = ((SD_DMAConfigRx(&hsdcard) == SD_OK) ? 0 : -1);
  308.   
  309.   if(state == 0)
  310.   {
  311.     /* Read block(s) in DMA transfer mode */

  312.     state = ((HAL_SD_ReadBlocks_DMA(&hsdcard,(uint32_t *)buf,
  313. blk_addr*STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len) == SD_OK) ? 0 : -1);
  314.    
  315.     /* Wait until transfer is complete */
  316.     if(state == 0)
  317.     {
  318.       state = ((HAL_SD_CheckReadOperation(&hsdcard, (uint32_t)0xFFFFFFFF) == SD_OK) ? 0 : -1);
  319.     }   
  320.   }
  321.   
  322.   return (state);
  323.   /* USER CODE END 6 */
  324. }

  325. /*******************************************************************************
  326. * Function Name  : STORAGE_Write_FS
  327. * Description    :
  328. * Input          : None.
  329. * Output         : None.
  330. * Return         : None.
  331. *******************************************************************************/
  332. int8_t STORAGE_Write_FS (uint8_t lun,
  333.                          uint8_t *buf,
  334.                          uint32_t blk_addr,
  335.                          uint16_t blk_len)
  336. {
  337.   /* USER CODE BEGIN 7 */
  338.   uint8_t state = 0;
  339.   
  340.   /* Invalidate the dma rx handle*/
  341.   hsdcard.hdmarx = NULL;
  342.   
  343.   /* Prepare the dma channel for a read operation */
  344.   state = ((SD_DMAConfigTx(&hsdcard) == SD_OK) ? 0 : -1);
  345.   
  346.   if(state == 0)
  347.   {
  348.     /* Write block(s) in DMA transfer mode */

  349.     state = ((HAL_SD_WriteBlocks_DMA(&hsdcard, (uint32_t *)buf,
  350. blk_addr*STORAGE_BLK_SIZ, STORAGE_BLK_SIZ, blk_len) == SD_OK) ? 0 : -1);
  351.    
  352.     /* Wait until transfer is complete */
  353.     if(state == 0)
  354.     {
  355.       state = ((HAL_SD_CheckWriteOperation(&hsdcard, (uint32_t)0xFFFFFFFF) == SD_OK) ? 0 : -1);
  356.     }
  357.   }
  358.   
  359.   return state;
  360.   /* USER CODE END 7 */
  361. }

  362. /*******************************************************************************
  363. * Function Name  : STORAGE_GetMaxLun_FS
  364. * Description    :
  365. * Input          : None.
  366. * Output         : None.
  367. * Return         : None.
  368. *******************************************************************************/
  369. int8_t STORAGE_GetMaxLun_FS (void)
  370. {
  371.   /* USER CODE BEGIN 8 */
  372.   return (STORAGE_LUN_NBR - 1);
  373.   /* USER CODE END 8 */
  374. }

  375. /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
  376. /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */

  377. /**
  378.   * @}
  379.   */

  380. /**
  381.   * @}
  382.   */  
  383. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码



<
回复

使用道具 举报

227

主题

601

回帖

32

蝴蝶豆

金牌会员

最后登录
2020-11-10
发表于 2016-12-6 12:17:16 | 显示全部楼层
本帖最后由 hpdell 于 2016-12-6 12:22 编辑

不错不错, 可惜现在下载不了哟
回复 支持 反对

使用道具 举报

122

主题

129

回帖

0

蝴蝶豆

论坛元老

最后登录
2019-5-28
 楼主| 发表于 2016-12-6 16:24:30 | 显示全部楼层
hpdell 发表于 2016-12-6 12:17
不错不错, 可惜现在下载不了哟

百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1
回复 支持 反对

使用道具 举报

227

主题

601

回帖

32

蝴蝶豆

金牌会员

最后登录
2020-11-10
发表于 2016-12-6 17:02:38 | 显示全部楼层
haohao663 发表于 2016-12-6 16:24
百度云盘:https://pan.baidu.com/s/1slN8rIt 密码:u6m1

多谢多谢了啊
回复 支持 反对

使用道具 举报

2

主题

73

回帖

4

蝴蝶豆

金牌会员

最后登录
2020-10-16
发表于 2017-11-22 10:22:20 | 显示全部楼层
回复 支持 反对

使用道具 举报

2

主题

73

回帖

4

蝴蝶豆

金牌会员

最后登录
2020-10-16
发表于 2017-11-22 11:34:34 | 显示全部楼层
咦没有这个帖子的源代码吗?云盘没找到啊
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版