上一篇文章介绍了文件系统和SD卡的读写,本篇文章介绍U盘的读写。STM32F4系列的USB接口有主机的功能,可以对U盘进行读写。



  

    硬件环境:STM32F429IGT6

    软件环境:STM32CubeMX v5.5.0

    HAL库版本:STM32CubeF4 Firmware Package V1.24.0 


    

01


STM32CubeMX配置


    时钟等基础配置参考之前的文章,配置USB部分如下:

STM32CubeMX之FatFS读写U盘_加载

   该单片机有两个USB接口,一个支持USB2.0全速(12M),另一个支持USB2.0高速(480M),但高速接口需要外部PHY芯片的支持。选择一个USB,用内部PHY全速接口,模式选择为主机模式Host Only,速度为全速12M(Host Full Speed 12MBit/s)。

    使能USB中断:

STM32CubeMX之FatFS读写U盘_加载_02

    选择USB的工作模式为大容量存储主机类,配置为默认即可。

STM32CubeMX之FatFS读写U盘_u盘_03

    FATFS配置选择USB Disk,可根据自己需要进行功能删减。

STM32CubeMX之FatFS读写U盘_加载_04

    这里使能了RTC作为文件系统的时钟。

STM32CubeMX之FatFS读写U盘_u盘_05


02

代码编写

    

    生成代码之后,可以看到,主循环中已经自动添加了一个函数:

STM32CubeMX之FatFS读写U盘_u盘_06

    打开函数定义,发现这是一个判断U盘连接状态的函数,用户可以在该函数内添加自定义的功能,也可以在函数外编写其它函数实现功能。

STM32CubeMX之FatFS读写U盘_u盘_07

    在主循环中添加以下代码对U盘读写功能进行测试:

    f(Appli_state == APPLICATION_READY)//U盘已经加载完成​​​​{​​​​if(status == 0)//U盘加载后只运行一次​​​​  {​​​​1;​​​​const*)USBHPath, 1);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"挂载U盘成功!\r\n",14,100);​​​​    }​​​​//写入文件测试​​​​uint8_t*)"写入文件测试!\r\n",15,100);​​​​const char*)"测试.txt",FA_CREATE_ALWAYS|FA_WRITE);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"打开文件\"测试.txt\"成功!\r\n",25,100);​​​​    }​​​​17,&bw);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"写入文件成功!\r\n",15,100);​​​​    }​​​​    retUSBH = f_close(&USBHFile);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"关闭文件成功!\r\n\r\n",17,100);​​​​    }​​​​//读取文件测试​​​​uint8_t*)"读取文件测试!\r\n",15,100);​​​​const char*)"测试.txt",FA_OPEN_EXISTING|FA_READ);//打开文件​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"打开文件\"测试.txt\"成功!\r\n",25,100);​​​​    }​​​​17,&bw);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"读取文件成功!文件内容:",23,100);​​​​100);​​​​    }​​​​    retUSBH = f_close(&USBHFile);​​​​if(retUSBH==FR_OK)​​​​    {​​​​uint8_t*)"关闭文件成功!\r\n",15,100);​​​​    }​​​​  }​​​​}​​

        观察串口打印的信息,把U盘插入电脑查看文件内容,U盘读写测试成功:

    STM32CubeMX之FatFS读写U盘_读取文件_08

    STM32CubeMX之FatFS读写U盘_加载_09

        同时这里会发现,文件的修改时间是空的,这是因为FatFS文件系统中没有移植时钟的函数,这里需要用户自己编写。

    FatFs中的时间格式用一个32位数据表示年月日时分秒,其中:

    • bit31:25:表示年,这里的年是指文件最近一次修改的年份与1980年的差值。
    • bit24:21:表示月(1~12)。
    • bit20:16:表示日(1~31)。
    • bit15:11:表示时 (0~23)。
    • bit10:5:表示分(0~59)。
    • bit4:0:表示 秒/ 2 的值 (0~29)。

        在fatfs.c文件中找到DWORD get_fattime(void)函数,添加以下程序:


    ​​DWORD get_fattime(void)​​​​{​​​​/* USER CODE BEGIN get_fattime */​​​​0;​​​​0};​​​​0};​​​​//获取当前日期时间​​​​  HAL_RTC_GetTime(&hrtc, &fTime, RTC_FORMAT_BIN);​​​​  HAL_RTC_GetDate(&hrtc, &fDate, RTC_FORMAT_BIN);​​​​//按照FatFs的时间格式组合​​​​2000 - 1980)<<25); //年​​​​21); //月​​​​16); //日​​​
    ​​​11); //时 ​​​​5); //分​​​​2); //秒​​​​return​​​​//return 0;​​​​/* USER CODE END get_fattime */​​​​}​​

        重新编译程序进行测试,发现有了文件修改时间:

    STM32CubeMX之FatFS读写U盘_读取文件_10


    03

    总结


        这里测试了3个U盘,分别是金士顿4G、金士顿8G和三星32G的(其中8G的为金士8SD卡+读卡器),均能正常读写,不过32G的U盘加载速度要慢一些,其它U盘的兼容性待测试。


    欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

    STM32CubeMX之FatFS读写U盘_加载_11