300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 使用STM32CubeMX创建USB MSC工程

使用STM32CubeMX创建USB MSC工程

时间:2024-01-25 13:50:48

相关推荐

使用STM32CubeMX创建USB MSC工程

文章目录

前言实验步骤1、打开STM32CubeMX工具,选择你的MCU型号2、配置系统参数,USB参数等3、修改工程代码并编译下载验证注意

前言

由于项目需要,要实现USB组合设备(Custom HID + MSC)功能。

前面已经使用STM32CubeMX工具实现了 Custom HID功能,这篇实现大容量存储设备MSC

笔者虽然使用的STM32H7的MCU但是其他MCU型号也有参考意义。

实验步骤

1、打开STM32CubeMX工具,选择你的MCU型号

笔者这里使用的是STM32H7的MCU,你们选择自己的MCU型号即可(比如,F103C8T6,F407ZGT6等)

2、配置系统参数,USB参数等

笔者的这颗MCU使用的是外部8M的晶振,主频倍频到了 550M,其他MCU根据实际情况配置主频即可,但是USB的时钟一定要设置为48M

3、修改工程代码并编译

主要是修改usbd_storage_if.c的内容 添加设备的读出 和写入函数 还有表示存储容量的宏定义

笔者这里使用的芯片RAM空间很大,所以使用RAM存储数据。直接吧代码贴出来吧

/* USER CODE BEGIN Header *//********************************************************************************* @file : usbd_storage_if.c* @version : v1.0_Cube* @brief: Memory management layer.******************************************************************************* @attention** Copyright (c) STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* 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 */uint8_t usb_buffer[24 * 1024];//开辟一个24K的存储区/* USER CODE END PRIVATE_TYPES *//*** @}*//** @defgroup USBD_STORAGE_Private_Defines* @brief Private defines.* @{*/#define STORAGE_LUN_NBR 1#define STORAGE_BLK_NBR 24 //扇区个数#define STORAGE_BLK_SIZ 1024//FLASH_PAGE_SIZE//扇区大小#define FLASH_START_ADDR usb_buffer //(FLASH_BASE+(800*1024)) //U盘存储区的起始位置/* 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_HS *//** USB Mass storage Standard Inquiry Data. */const int8_t STORAGE_Inquirydata_HS[] = {/* 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_HS *//* USER CODE BEGIN PRIVATE_VARIABLES *//* USER CODE END PRIVATE_VARIABLES *//*** @}*//** @defgroup USBD_STORAGE_Exported_Variables* @brief Public variables.* @{*/extern USBD_HandleTypeDef hUsbDeviceHS;/* USER CODE BEGIN EXPORTED_VARIABLES *//* USER CODE END EXPORTED_VARIABLES *//*** @}*//** @defgroup USBD_STORAGE_Private_FunctionPrototypes* @brief Private functions declaration.* @{*/static int8_t STORAGE_Init_HS(uint8_t lun);static int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size);static int8_t STORAGE_IsReady_HS(uint8_t lun);static int8_t STORAGE_IsWriteProtected_HS(uint8_t lun);static int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);static int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);static int8_t STORAGE_GetMaxLun_HS(void);/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION *//* USER CODE END PRIVATE_FUNCTIONS_DECLARATION *//*** @}*/USBD_StorageTypeDef USBD_Storage_Interface_fops_HS ={STORAGE_Init_HS,STORAGE_GetCapacity_HS,STORAGE_IsReady_HS,STORAGE_IsWriteProtected_HS,STORAGE_Read_HS,STORAGE_Write_HS,STORAGE_GetMaxLun_HS,(int8_t *)STORAGE_Inquirydata_HS};/* Private functions ---------------------------------------------------------*//*** @brief Initializes the storage unit (medium).* @param lun: Logical unit number.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_Init_HS(uint8_t lun){/* USER CODE BEGIN 9 */UNUSED(lun);return (USBD_OK);/* USER CODE END 9 */}/*** @brief Returns the medium capacity.* @param lun: Logical unit number.* @param block_num: Number of total block number.* @param block_size: Block size.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size){/* USER CODE BEGIN 10 */UNUSED(lun);*block_num = STORAGE_BLK_NBR;*block_size = STORAGE_BLK_SIZ;return (USBD_OK);/* USER CODE END 10 */}/*** @brief Checks whether the medium is ready.* @param lun: Logical unit number.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_IsReady_HS(uint8_t lun){/* USER CODE BEGIN 11 */UNUSED(lun);return (USBD_OK);/* USER CODE END 11 */}/*** @brief Checks whether the medium is write protected.* @param lun: Logical unit number.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_IsWriteProtected_HS(uint8_t lun){/* USER CODE BEGIN 12 */return (USBD_OK);/* USER CODE END 12 */}/*** @brief Reads data from the medium.* @param lun: Logical unit number.* @param buf: data buffer.* @param blk_addr: Logical block address.* @param blk_len: Blocks number.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len){/* USER CODE BEGIN 13 */UNUSED(lun);UNUSED(buf);UNUSED(blk_addr);UNUSED(blk_len);//读U盘函数//将(FLASH_START_ADDR + blk_addr * FLASH_PAGE_SIZE)起始地址处的blk_len * FLASH_PAGE_SIZE大小的数据拷贝到buf里面memcpy(buf, (uint8_t*)(FLASH_START_ADDR + blk_addr * STORAGE_BLK_SIZ), blk_len * STORAGE_BLK_SIZ);return (USBD_OK);/* USER CODE END 13 */}/*** @brief Writes data into the medium.* @param lun: Logical unit number.* @param buf: data buffer.* @param blk_addr: Logical block address.* @param blk_len: Blocks number.* @retval USBD_OK if all operations are OK else USBD_FAIL*/int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len){/* USER CODE BEGIN 14 */UNUSED(lun);UNUSED(buf);UNUSED(blk_addr);UNUSED(blk_len);memcpy((uint8_t*)(FLASH_START_ADDR + blk_addr * STORAGE_BLK_SIZ), buf, blk_len * STORAGE_BLK_SIZ);return (USBD_OK);/* USER CODE END 14 */}/*** @brief Returns the Max Supported LUNs.* @param None* @retval Lun(s) number.*/int8_t STORAGE_GetMaxLun_HS(void){/* USER CODE BEGIN 15 */return (STORAGE_LUN_NBR - 1);/* USER CODE END 15 */}/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION *//* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION *//*** @}*//*** @}*/

下载验证

连接电脑之后会提示格式化U盘

注意

明明定义的是24K 为什么会显示只有4K?其实这就要说下FAT文件系统了,在存储数据区域之前还有DBR、FAT0,FAT1、ROOT、等分区占用了了很多一部分的空间。所以如果设置的空间低于24K可能会格式化不成功。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。