本文测试源码工程下载:USB-RAM.zip_STORAGE_LUN_NBR-其它代码类资源-CSDN下载
一、STM32CubeMX配置
Heap大小参照我们自己配置MSC_MEDIA_PACKET,一般比MSC_MEDIA_PACKET大0x200(512byte)就行了。
具体要分配多少,参考生成的源码 ,搜索一下。
#define USBD_malloc malloc
pdev->pClassData = USBD_malloc(sizeof (USBD_MSC_BOT_HandleTypeDef));
if(pdev->pClassData == NULL)
{
return USBD_FAIL;
}
如果pdev->pClassData = NULL 电脑的设备管理器会出现黄色感叹号。
而且pdev->pClassData = NULL的话,MX_USB_DEVICE_Init函数内的初始化不会发生Error_Handler();
二、代码
我使用52kB的内存作为虚拟U盘的空间。
unsigned char temp[52 * 1024] = {0}; //52kB
#define STORAGE_LUN_NBR 1 //1个分区
#define STORAGE_BLK_NBR (52 * 1024 / 512) //块数量
#define STORAGE_BLK_SIZ 0x200 //块大小
usbd_storage_if.c
/* Private functions ---------------------------------------------------------*/
/**
* @brief Initializes over USB FS IP
* @param 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 */
*block_num = STORAGE_BLK_NBR;
*block_size = STORAGE_BLK_SIZ;
return (USBD_OK);
/* 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 */
return (USBD_OK);
/* 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 */
memcpy(buf, temp + (blk_addr * STORAGE_BLK_SIZ), blk_len * STORAGE_BLK_SIZ);
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 */
memcpy(temp + (blk_addr * STORAGE_BLK_SIZ), buf, blk_len * STORAGE_BLK_SIZ);
return (USBD_OK);
/* USER CODE END 7 */
}
在main.c
#include <stdio.h>
//复位一下USB引脚,确保程序烧录复位启动后,USB枚举更新
static void USB_GPIO_Reset(void);
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
USB_GPIO_Reset();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USB_DEVICE_Init();
/* USER CODE BEGIN 2 */
printf("sudaroot msc test\r\n");
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
int fputc(int ch, FILE *FILE)
{
HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
static void USB_GPIO_Reset(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11 | GPIO_PIN_12, GPIO_PIN_RESET);
/*Configure GPIO pin : GPIO_PIN_11 | GPIO_PIN_12*/
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(3);
}
三、效果
烧录程序到板子,接入USB,格式化一下U盘。
格式化完成后,52KB变成30.5KB可用空间+保留空间共32KB。
四、写入读取测试
新建一个文本,编辑写入,保存退出。(千万不可断电)
拔出USB,重新插上。打开U盘,打开文档,内容与写入一致,实验成功。(千万不可断电)
五、注意
因为数据是保存在RAM中的,断电即数据消失。
全篇完。
本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!