STM32
直播中

木頭瓶子

11年用户 560经验值
擅长:353304
私信 关注
[问答]

如何利用stm32cubemx实现串行flash模拟u盘?

如何利用STM32cubemx实现串行flash模拟u盘?

回帖(1)

任斌

2021-12-15 11:01:16
使用软件:stm32cubemx
开发板:野火指南者stm32f103vet6
HAL库;STM32Cube FW_F1 V1.8.0
实现功能:串行flash模拟u盘
一系列的模仿U盘 都用到了USB-Device
USB-Device想要使用要把PD6配置为低电平(就我的板子做例子----野火指南者)





我的HAL库是STM32Cube FW_F1 V1.8.0,你如果用的是老版本的话,可能会出错





用stm32CubeMX生成程序

1.PD6配置低电平
2.RCC
3.SYS
4.SDIO(中断)
5.USB
6.USB_DEVICE
1.先设置PD6引脚,省得一会忘了






2.必不可少的配RCC和SYS









3.sd卡





时钟设置4分频




打开sd中断





4.打开USB






5.USB_DEVICE






6.时钟配置





7.生成程序






-0






插入 代码 extern SD_HandleTypeDef hsd;
最好放在BEGIN和END之间


extern SD_HandleTypeDef    hsd;
1
需要改四个函数


int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
  *block_num  = hsd.SdCard.BlockNbr ;
   *block_size = hsd.SdCard.BlockSize ;
  return (USBD_OK);
  /* USER CODE END 3 */
}


int8_t STORAGE_IsReady_FS(uint8_t lun)
{
  /* USER CODE BEGIN 4 */
        uint8_t state = 0;
    state = HAL_SD_GetState(&hsd) ;
    if(HAL_SD_STATE_READY != state)
        return USBD_FAIL ;
    return (USBD_OK);
  /* USER CODE END 4 */
}


nt8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
        if(HAL_OK != HAL_SD_ReadBlocks(&hsd,(uint8_t *)buf, blk_addr , blk_len, 1000))
         return USBD_FAIL ;
  return (USBD_OK);
  /* USER CODE END 6 */
}


int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
                if(HAL_OK != HAL_SD_WriteBlocks(&hsd, (uint8_t *)buf, blk_addr , blk_len, 1000))
        return USBD_FAIL ;
    return (USBD_OK);
  /* USER CODE END 7 */
}





运行,烧录










可以和读写sd卡一起使用,当USB DEVICE与电脑连接时,停止向sd卡写数据。
挂载文件系统SD卡读写
模拟U盘和FATFS冲突问题
学习时通过这位大佬的博客学会的(讲解更详细):https://blog.csdn.net/morixinguan/article/details/104379971
举报

更多回帖

发帖
×
20
完善资料,
赚取积分