概述
一、参考地址
- https://blog.csdn.net/zhang062061/article/details/113574236
- https://blog.csdn.net/borli/article/details/107883738
- 解决U盘和FAtfs冲突https://www.freesion.com/article/97801199225/
二、CUBE配置
-
SDIO的配置参考我的文章STM32F407+cubeMX+Freertos+SDIO+Fatfs使用SD卡
-
USB_OTG_FS
-
USB_DEVICE
-
最主要,时钟必须48M,我这里采用CUBE的自动设置,如果时钟不对,它会弹出是否自动设置时钟的选项
三、代码修改
-
usbd_storage_if.c
中的修改extern SD_HandleTypeDef hsd; 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 */ } int8_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 */ }
-
usbd_conf.c
的HAL_PCD_SOFCallback
可以知道是否插入了USB 或者可以参考上面的void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ { USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); ///>插入了USB 不进行操作了 }
最后
以上就是刻苦小蝴蝶为你收集整理的STM32F407模拟U盘的全部内容,希望文章能够帮你解决STM32F407模拟U盘所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复