OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4477|回复: 2

STM32CubeMX之FatFS读写U盘

[复制链接]

17

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
394
金钱
394
注册时间
2015-1-7
在线时间
101 小时
发表于 2021-1-10 16:57:05 | 显示全部楼层 |阅读模式
本帖最后由 zhang062061 于 2021-1-10 17:04 编辑

    硬件环境:STM32F429IGT6
    软件环境:STM32CubeMX v5.5.0
    HAL库版本:STM32CubeF4 Firmware Package V1.24.0
    01 STM32CubeMX配置
    时钟等基础配置参考之前的文章,配置USB部分如下:

1.png


   该单片机有两个USB接口,一个支持USB2.0全速(12M),另一个支持USB2.0高速(480M),但高速接口需要外部PHY芯片的支持。选择一个USB,用内部PHY全速接口,模式选择为主机模式Host Only,速度为全速12M(Host Full Speed 12MBit/s)。    使能USB中断:
2.png    
选择USB的工作模式为大容量存储主机类,配置为默认即可。

3.png

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

4.png

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

5.png



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

6.png

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

7.png

    在主循环中添加以下代码对U盘读写功能进行测试:
  1. if(Appli_state == APPLICATION_READY)//U盘已经加载完成
  2. {
  3.   if(status == 0)//U盘加载后只运行一次
  4.   {
  5.     status = 1;
  6.     retUSBH=f_mount(&USBHFatFS, (TCHAR const*)USBHPath, 1);
  7.     if(retUSBH==FR_OK)
  8.     {
  9.       HAL_UART_Transmit(&huart2,(uint8_t*)"挂载U盘成功!\r\n",14,100);
  10.     }
  11.     //写入文件测试
  12.     HAL_UART_Transmit(&huart2,(uint8_t*)"写入文件测试!\r\n",15,100);
  13.     retUSBH = f_open(&USBHFile,(const char*)"测试.txt",FA_CREATE_ALWAYS|FA_WRITE);
  14.     if(retUSBH==FR_OK)
  15.     {
  16.       HAL_UART_Transmit(&huart2,(uint8_t*)"打开文件"测试.txt"成功!\r\n",25,100);
  17.     }
  18.     retUSBH = f_write(&USBHFile,FileBuf,17,&bw);
  19.     if(retUSBH==FR_OK)
  20.     {
  21.       HAL_UART_Transmit(&huart2,(uint8_t*)"写入文件成功!\r\n",15,100);
  22.     }
  23.     retUSBH = f_close(&USBHFile);
  24.     if(retUSBH==FR_OK)
  25.     {
  26.       HAL_UART_Transmit(&huart2,(uint8_t*)"关闭文件成功!\r\n\r\n",17,100);
  27.     }
  28.     //读取文件测试
  29.     HAL_UART_Transmit(&huart2,(uint8_t*)"读取文件测试!\r\n",15,100);
  30.     retUSBH = f_open(&USBHFile,(const char*)"测试.txt",FA_OPEN_EXISTING|FA_READ);//打开文件
  31.     if(retUSBH==FR_OK)
  32.     {
  33.       HAL_UART_Transmit(&huart2,(uint8_t*)"打开文件"测试.txt"成功!\r\n",25,100);
  34.     }
  35.     retUSBH = f_read(&USBHFile,FileBuf,17,&bw);
  36.     if(retUSBH==FR_OK)
  37.     {
  38.       HAL_UART_Transmit(&huart2,(uint8_t*)"读取文件成功!文件内容:",23,100);
  39.       HAL_UART_Transmit(&huart2,FileBuf,bw,100);
  40.     }
  41.     retUSBH = f_close(&USBHFile);
  42.     if(retUSBH==FR_OK)
  43.     {
  44.       HAL_UART_Transmit(&huart2,(uint8_t*)"关闭文件成功!\r\n",15,100);
  45.     }
  46.   }
  47. }
复制代码


观察串口打印的信息,把U盘插入电脑查看文件内容,U盘读写测试成功:
8.png
9.png    
同时这里会发现,文件的修改时间是空的,这是因为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)函数,添加以下程序:
  1. DWORD get_fattime(void)
  2. {
  3.   /* USER CODE BEGIN get_fattime */
  4.   DWORD time_buff=0;
  5.   RTC_TimeTypeDef fTime = {0};
  6.   RTC_DateTypeDef fDate = {0};
  7.   //获取当前日期时间
  8.   HAL_RTC_GetTime(&hrtc, &fTime, RTC_FORMAT_BIN);
  9.   HAL_RTC_GetDate(&hrtc, &fDate, RTC_FORMAT_BIN);
  10.   
  11.   //按照FatFs的时间格式组合
  12.   time_buff |= ((fDate.Year + 2000 - 1980)<<25); //年
  13.   time_buff |= (fDate.Month<<21); //月
  14.   time_buff |= (fDate.Date<<16); //日
  15. &#8203;
  16.   time_buff |= (fTime.Hours<<11); //时
  17.   time_buff |= (fTime.Minutes<<5); //分
  18.   time_buff |= (fTime.Seconds/2); //秒
  19.   return time_buff;
  20.    //return 0;
  21.   /* USER CODE END get_fattime */  
  22. }
复制代码

   重新编译程序进行测试,发现有了文件修改时间:
10.png
03  总结
    这里测试了3个U盘,分别是金士顿4G、金士顿8G和三星32G的(其中8G的为金士顿8G SD卡+读卡器),均能正常读写,不过32G的U盘加载速度要慢一些,其它U盘的兼容性待测试。
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。
11.jpg












https://shop72315368.taobao.com
承接软硬件项目开发
微信搜索 “嵌入式技术开发”,关注我的公众号
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14367
金钱
14367
注册时间
2018-8-3
在线时间
1155 小时
发表于 2021-1-10 17:05:18 | 显示全部楼层
回复 支持 反对

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7462
金钱
7462
注册时间
2015-1-15
在线时间
1367 小时
发表于 2021-1-10 21:38:34 | 显示全部楼层
感谢楼主分享
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-3-1 02:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表