一、硬件组成及连接
自己画的一块板子,准备玩玩LVGL的,硬件连接图如下:
SD卡座忘记接地了!!!所以后面新增该版将SD卡座接地,因为TF卡插入时SDIO_DETECT应该是低电平,我的板子SD卡槽外壳没接地,无论TF卡有没有插入都是高电平,后面配置中我会把SD_DETECT设置为输入下拉
二、STM32CubeMX配置,版本v6.8 F4库版本:v1.27.1
1、先配置系统时钟,板子上使用的外部8M晶振,打开下载口
2、SDIO配置,4线模式,时钟2分频,打开硬件流控制,配置SDIO发送与接收DMA
时钟我设置的2分频,如果不分频会出现文件能够拷贝进TF卡,复位单片机后再通过电脑打开TF卡就没有之前拷贝的文件
使用SDIO的发送与接收DMA
将PA15作为TF插入检测引脚,因为我的板子SD卡槽外壳没有接地,所以先设置为输入下拉模式
3、Fatfs配置
4、USB配置
5、中断配置 优先级:SDIO>SDIO_DMA>USB
三、生成代码
堆栈开大一些
我比较喜欢LL与HAL库混用
四、代码改动
1、主函数如下:
2、改魔术棒配置
3、代码改动部分
打开CubeMX的器件库官方例程,看看官方怎么实现的
仿照官方例程的usbd_storage.c完善我们工程的usbd_storage_if.c
我们工程完善后的函数如下:
先包含头文件
完善代码
int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
/* USER CODE BEGIN 3 */
// UNUSED(lun);
// *block_num = STORAGE_BLK_NBR;
// *block_size = STORAGE_BLK_SIZ;
// return (USBD_OK);
HAL_SD_CardInfoTypeDef info;
int8_t ret = USBD_FAIL;
if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_GetCardInfo(&info);
*block_num = info.LogBlockNbr - 1;
*block_size = info.LogBlockSize;
ret = USBD_OK;
}
return ret;
/* USER CODE END 3 */
}
int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
/* USER CODE BEGIN 6 */
// UNUSED(lun);
// UNUSED(buf);
// UNUSED(blk_addr);
// UNUSED(blk_len);
// return (USBD_OK);
int8_t ret = USBD_FAIL;
if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_ReadBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
/* Wait until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
{
}
ret = USBD_OK;
}
return ret;
/* 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 */
// UNUSED(lun);
// UNUSED(buf);
// UNUSED(blk_addr);
// UNUSED(blk_len);
// return (USBD_OK);
int8_t ret = USBD_FAIL;
if(BSP_SD_IsDetected() != SD_NOT_PRESENT)
{
BSP_SD_WriteBlocks_DMA((uint32_t *)buf, blk_addr, blk_len);
/* Wait until SD card is ready to use for new operation */
while (BSP_SD_GetCardState() != SD_TRANSFER_OK)
{
}
ret = USBD_OK;
}
return ret;
/* USER CODE END 7 */
}
在这个文件里包含头文件
sdio文件添加以下内容
五、编译下载,运行结果查看
TF插入卡槽,USB插入电脑,正常情况下打开我的电脑会显示U盘
再任意拷贝一个文件至U盘,速度会比较慢
想要拷贝快,以下参数可以提升速度,MSC_MEDIA_PACKET以及堆栈空间
注意!!!
1、程序里面在执行读写TF文件操作时,电脑就不要去操作U盘,同理,电脑操作TF内文件时,程序也不要去操作TF内文件;
思路:程序在读写TF文件时,直接关闭TF卡的USB挂载;电脑操作TF内容时,不挂在TF文件系统;也就是程序里面设置一个U盘模式,U盘模式和正常TF挂载读写互斥即可