金牌会员
 
- 积分
- 2099
- 金钱
- 2099
- 注册时间
- 2017-2-11
- 在线时间
- 306 小时
|
本帖最后由 jiangyy 于 2021-3-25 13:30 编辑
使用STM32CUBEIDE软件,生成USB Slave 读取SD卡,直接用该软件烧录到STM32F407中,可以实现热插拔功能。有些细节要注意:
第一,基于HAL库,对于SDIO时钟的配置,貌似不能0分频(否则SD卡读写文件错误,也无法识别SD卡),必须2分频,代码如下:
第二,修改usbd_storage_if.c文件,这里好多需要用户自定义,代码 usbd_storage_if.c 更改如下:
- /* USER CODE BEGIN Header */
- /**
- ******************************************************************************
- * [url=home.php?mod=space&uid=175224]@file[/url] : usbd_storage_if.c
- * @version : v1.0_Cube
- * @brief : Memory management layer.
- ******************************************************************************
- * @attention
- *
- * <h2><center>© Copyright (c) 2020 STMicroelectronics.
- * All rights reserved.</center></h2>
- *
- * This software component is licensed by ST under Ultimate Liberty license
- * SLA0044, the "License"; You may not use this file except in compliance with
- * the License. You may obtain a copy of the License at:
- * www.st.com/SLA0044
- *
- ******************************************************************************
- */
- /* USER CODE END Header */
- /* Includes ------------------------------------------------------------------*/
- #include "usbd_storage_if.h"
- /* USER CODE BEGIN INCLUDE */
- /* USER CODE END INCLUDE */
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- /* Private macro -------------------------------------------------------------*/
- /* USER CODE BEGIN PV */
- /* Private variables ---------------------------------------------------------*/
- /* USER CODE END PV */
- /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
- * @brief Usb device.
- * @{
- */
- /** @defgroup USBD_STORAGE
- * @brief Usb mass storage device module
- * @{
- */
- /** @defgroup USBD_STORAGE_Private_TypesDefinitions
- * @brief Private types.
- * @{
- */
- /* USER CODE BEGIN PRIVATE_TYPES */
- /* USER CODE END PRIVATE_TYPES */
- /**
- * @}
- */
- /** @defgroup USBD_STORAGE_Private_Defines
- * @brief Private defines.
- * @{
- */
- #define STORAGE_LUN_NBR 1
- #define STORAGE_BLK_NBR 0x10000
- #define STORAGE_BLK_SIZ 0x200
- /* USER CODE BEGIN PRIVATE_DEFINES */
- /* USER CODE END PRIVATE_DEFINES */
- /**
- * @}
- */
- /** @defgroup USBD_STORAGE_Private_Macros
- * @brief Private macros.
- * @{
- */
- /* USER CODE BEGIN PRIVATE_MACRO */
- /* USER CODE END PRIVATE_MACRO */
- /**
- * @}
- */
- /** @defgroup USBD_STORAGE_Private_Variables
- * @brief Private variables.
- * @{
- */
- /* USER CODE BEGIN INQUIRY_DATA_FS */
- /** USB Mass storage Standard Inquiry Data. */
- 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 */
- };
- /* USER CODE END INQUIRY_DATA_FS */
- /* USER CODE BEGIN PRIVATE_VARIABLES */
- /* USER CODE END PRIVATE_VARIABLES */
- /**
- * @}
- */
- /** @defgroup USBD_STORAGE_Exported_Variables
- * @brief Public variables.
- * @{
- */
- extern USBD_HandleTypeDef hUsbDeviceFS;
- /* USER CODE BEGIN EXPORTED_VARIABLES */
- /* USER CODE END EXPORTED_VARIABLES */
- /**
- * @}
- */
- /** @defgroup USBD_STORAGE_Private_FunctionPrototypes
- * @brief Private functions declaration.
- * @{
- */
- static int8_t STORAGE_Init_FS(uint8_t lun);
- static int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
- static int8_t STORAGE_IsReady_FS(uint8_t lun);
- static int8_t STORAGE_IsWriteProtected_FS(uint8_t lun);
- static int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
- static int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
- static int8_t STORAGE_GetMaxLun_FS(void);
- /* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
- /* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
- /**
- * @}
- */
- USBD_StorageTypeDef USBD_Storage_Interface_fops_FS =
- {
- STORAGE_Init_FS,
- STORAGE_GetCapacity_FS,
- STORAGE_IsReady_FS,
- STORAGE_IsWriteProtected_FS,
- STORAGE_Read_FS,
- STORAGE_Write_FS,
- STORAGE_GetMaxLun_FS,
- (int8_t *)STORAGE_Inquirydata_FS
- };
- /* Private functions ---------------------------------------------------------*/
- /**
- * @brief Initializes over USB FS IP
- * [url=home.php?mod=space&uid=271674]@param[/url] lun:
- * @retval USBD_OK if all operations are OK else USBD_FAIL
- */
- int8_t STORAGE_Init_FS(uint8_t lun)
- {
- /* USER CODE BEGIN 2 */
- return (USBD_OK);
- /* USER CODE END 2 */
- }
- /**
- * @brief .
- * @param lun: .
- * @param block_num: .
- * @param block_size: .
- * @retval USBD_OK if all operations are OK else USBD_FAIL
- */
- int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
- {
- /* USER CODE BEGIN 3 */
- HAL_SD_CardInfoTypeDef info;
- int8_t ret = USBD_FAIL;
- if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
- {
- BSP_SD_GetCardInfo(&info);
- *block_size = 512;
- *block_num = ((uint64_t)info.LogBlockNbr*(uint64_t)info.LogBlockSize)/512;
- ret = USBD_OK;
- }
- return ret;
- /* USER CODE END 3 */
- }
- /**
- * @brief .
- * @param lun: .
- * @retval USBD_OK if all operations are OK else USBD_FAIL
- */
- int8_t STORAGE_IsReady_FS(uint8_t lun)
- {
- /* USER CODE BEGIN 4 */
- static int8_t prev_status = 0;
- int8_t ret = -1;
- if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
- {
- if(prev_status < 0)
- {
- BSP_SD_Init();
- prev_status = 0;
- }
- if(BSP_SD_GetCardState() == SD_TRANSFER_OK)
- {
- ret = USBD_OK;
- }
- }
- else if(prev_status == 0)
- {
- prev_status = -1;
- }
- return ret;
- /* USER CODE END 4 */
- }
- /**
- * @brief .
- * @param lun: .
- * @retval USBD_OK if all operations are OK else USBD_FAIL
- */
- int8_t STORAGE_IsWriteProtected_FS(uint8_t lun)
- {
- /* USER CODE BEGIN 5 */
- return (USBD_OK);
- /* USER CODE END 5 */
- }
- /**
- * @brief .
- * @param lun: .
- * @retval USBD_OK if all operations are OK else USBD_FAIL
- */
- int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
- {
- /* USER CODE BEGIN 6 */
- #ifdef SD_CARD_READ
- int8_t ret = -1;
- uint32_t timeout = 100000;
- BSP_SD_ReadBlocks((uint32_t *)buf, blk_addr, blk_len, SD_DATATIMEOUT);
- while(BSP_SD_GetCardState() != SD_TRANSFER_OK)
- {
- if (timeout-- == 0)
- {
- return ret;
- }
- }
- ret = USBD_OK;
- return ret;
- #endif
- #ifdef SD_CARD_READ_DMA
- int8_t ret = USBD_FAIL;
- if( HAL_SD_ReadBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
- {
- ret = USBD_OK;
- }
- if( USBD_OK == ret )
- {
- while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};
- while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
- }
- return ret;
- #endif
- //BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
- // 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 */
- #ifdef SD_CARD_WRITE
- int8_t ret = -1;
- uint32_t timeout = 100000;
- BSP_SD_WriteBlocks((uint32_t *)buf, blk_addr, blk_len, SD_DATATIMEOUT);
- while(BSP_SD_GetCardState() != SD_TRANSFER_OK)
- {
- if (timeout-- == 0)
- {
- return ret;
- }
- }
- ret = USBD_OK;
- return ret;
- #endif
- #ifdef SD_CARD_WRITE_DMA
- int8_t ret = USBD_FAIL;
- if( HAL_SD_WriteBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
- {
- ret = USBD_OK;
- }
- if( USBD_OK == ret )
- {
- while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};
- while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
- }
- return ret;
- #endif
- /* USER CODE END 7 */
- }
- /**
- * @brief .
- * @param None
- * @retval .
- */
- int8_t STORAGE_GetMaxLun_FS(void)
- {
- /* USER CODE BEGIN 8 */
- return (STORAGE_LUN_NBR - 1);
- /* USER CODE END 8 */
- }
- /* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
- /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
- /**
- * @}
- */
- /**
- * @}
- */
- /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
头文件 usbd_storage_if.h
我这里没有使用高速USB,只是普通的USB,速度最高只能达到 355KB/秒,而且很稳定,但是没有达到预期的1MKB/秒,测试发现与SDIO时钟分频有关,但是无法提速上去,贴友有没有办法提速上去???
|
|