使用软件: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
使用软件: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
举报