SDIO+DMA+FATFS+USB MASS Storage的实现

SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

二维码是我创建的QQ群,欢迎新朋友加入。
源码加群找群文件
之前做GUI库,想实现对图片文件的直接解码,折腾了一下,发现CUBE无法直接创建一个现成的工程,这里记录一下自己的创建方式
首先是外设的配置
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

配置USB外设
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

然后配置FATFS和USB
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

突然发现有LIBJPEG的库,后面做GUI的时候可以用用
时钟树的配置
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

配置SDIO
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

配置DMA
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

配置中断
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

可以生成代码了记得修改堆栈空间
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

不过现在生成的代码,U盘是打不开的
先不着急,先测试FATFS是不是正常,顺便验证SD卡的读写正常
main函数申明全局变量

FATFS SDFatFs; /* File system object for SD card logical drive */ FIL MyFile; /* File object */

main函数内
int main(void) { FRESULT res; /* FatFs function common result code */ uint32_t byteswritten, bytesread; /* File write/read counts */ uint8_t wtext[] = "This is STM32 working with FatFs"; /* File write buffer */ uint8_t rtext[100]; /* File read buffer *//* MCU Configuration----------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_DMA_Init(); MX_SDIO_SD_Init(); MX_USB_DEVICE_Init(); MX_FATFS_Init(); /* USER CODE BEGIN 2 *//*##-2- Register the file system object to the FatFs module ##############*/ if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK) { /* FatFs Initialization Error */ Error_Handler(); } else { /*##-4- Create and Open a new text file object with write access #####*/ if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) { /* 'STM32.TXT' file Open for write Error */ Error_Handler(); } else { /*##-5- Write data to the text file ################################*/ res = f_write(&MyFile, wtext, sizeof(wtext), (void *)&byteswritten); if((byteswritten == 0) || (res != FR_OK)) { /* 'STM32.TXT' file Write or EOF Error */ Error_Handler(); } else { /*##-6- Close the open text file #################################*/ f_close(&MyFile); /*##-7- Open the text file object with read access ###############*/ if(f_open(&MyFile, "STM32.TXT", FA_READ) != FR_OK) { /* 'STM32.TXT' file Open for read Error */ Error_Handler(); } else { /*##-8- Read data from the text file ###########################*/ res = f_read(&MyFile, rtext, sizeof(rtext), (UINT*)&bytesread); if((bytesread == 0) || (res != FR_OK)) { /* 'STM32.TXT' file Read or EOF Error */ Error_Handler(); } else { /*##-9- Close the open text file #############################*/ f_close(&MyFile); /*##-10- Compare read data with the expected data ############*/ if((bytesread != byteswritten)) { /* Read data is different from the expected data */ Error_Handler(); } else { } } } } } } /* USER CODE BEGIN WHILE */ while (1) {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */} /* USER CODE END 3 */}

接上仿真器,能跑通就行
然后修改USB内容
/** ****************************************************************************** * @file: usbd_storage_if.c * @version: v1.0_Cube * @brief: Memory management layer. ****************************************************************************** * This notice applies to any and all portions of this file * that are not between comment pairs USER CODE BEGIN and * USER CODE END. Other portions of this file, whether * inserted by the user or by software development tools * are owned by their respective copyright owners. * * Copyright (c) 2018 STMicroelectronics International N.V. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted, provided that the following conditions are met: * * 1. Redistribution of source code must retain the above copyright notice, *this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, *this list of conditions and the following disclaimer in the documentation *and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of other *contributors to this software may be used to endorse or promote products *derived from this software without specific written permission. * 4. This software, including modifications and/or derivative works of this *software, must execute solely and exclusively on microcontroller or *microprocessor devices manufactured by or for STMicroelectronics. * 5. Redistribution and use of this software other than as permitted under *this license is void and will automatically terminate your rights under *this license. * * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** *//* Includes ------------------------------------------------------------------*/ #include "usbd_storage_if.h" #include "bsp_driver_sd.h" #include "sd_diskio.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_NBR1 #define STORAGE_BLK_NBR0x10000 #define STORAGE_BLK_SIZ0x200/* 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 ---------------------------------------------------------*/ /** * @briefInitializes over USB FS IP * @paramlun: * @retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_Init_FS(uint8_t lun) { BSP_SD_Init(); return 0; }/** * @brief. * @paramlun: . * @paramblock_num: . * @paramblock_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) { HAL_SD_CardInfoTypeDef info; int8_t ret = -1; if(BSP_SD_IsDetected() != SD_NOT_PRESENT) { BSP_SD_GetCardInfo(&info); *block_num =info.LogBlockNbr- 1; *block_size = info.LogBlockSize; ret = 0; } return ret; }/** * @brief. * @paramlun: . * @retval USBD_OK if all operations are OK else USBD_FAIL */ int8_t STORAGE_IsReady_FS(uint8_t lun) { 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 = 0; } } else if(prev_status == 0) { prev_status = -1; } return ret; }/** * @brief. * @paramlun: . * @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. * @paramlun: . * @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) { int8_t ret = -1; if(BSP_SD_IsDetected() != SD_NOT_PRESENT) { BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len); /* Wait for Rx Transfer completion */ while (sdReadStatus == 0){} sdReadStatus = 0; /* Wait until SD card is ready to use for new operation */ while (BSP_SD_GetCardState() != SD_TRANSFER_OK){} ret = 0; } return ret; }/** * @brief. * @paramlun: . * @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) { int8_t ret = -1; if(BSP_SD_IsDetected() != SD_NOT_PRESENT) { BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len); /* Wait for Tx Transfer completion */ while (sdWriteStatus == 0){} sdWriteStatus = 0; /* Wait until SD card is ready to use for new operation */ while (BSP_SD_GetCardState() != SD_TRANSFER_OK){} ret = 0; } return ret; }/** * @brief. * @paramNone * @retval . */ int8_t STORAGE_GetMaxLun_FS(void) { /* USER CODE BEGIN 8 */ return (STORAGE_LUN_NBR - 1); /* USER CODE END 8 */ }/** * @brief BSP Tx Transfer completed callbacks * @param None * @retval None */ //void BSP_SD_WriteCpltCallback(void) //{ //writestatus = 1; //}/** * @brief BSP Rx Transfer completed callbacks * @param None * @retval None */ //void BSP_SD_ReadCpltCallback(void) //{ //readstatus = 1; //} /** * @} *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

看看实际效果
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

创建了一个4G的U盘
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

通过MAIN函数写了一个文件进去
改个名字,
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

换个中文名字
SDIO+DMA+FATFS+USB MASS Storage的实现
文章图片

【SDIO+DMA+FATFS+USB MASS Storage的实现】

    推荐阅读