你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【零基础学习STM32】第十四讲:FATFS实验——文件操作

[复制链接]
kkhkbb 发布时间:2018-5-3 21:22
本帖最后由 kkhkbb 于 2018-5-4 18:59 编辑

一、 概述
1、 文件系统简介:
(1)文件系统:管理和存储文件信息的软件机构。
(2)常用的文件系统:
  •      FAT/FATFS
  •      NTFS基于安全性的文件系统,是Wundow NT采用的独特的文件系统结构
  •      CDFSCDFS是大部分光盘的文件系统
2、 FATFS文件系统简介:
      FATFS是一个完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计,完全用标准C语言编写,具有良好的硬件平台独立性,可移植到8051、PIC、ARM等系列单片机上而只需做简单的修改。它支持FAT12、FAT16、FATI32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。
3、 FATFS文件系统特点:
  •      WindowFAT文件系统(支持FAT12/FAT16/FAT32
  •      代码量少、效率高。
  •      与平台无关、移植简单全部通过C语言编写。
  •      多配置项:支持多卷(物理驱动器或区,最10卷)、多个ANSI/OEM代码页、支持长文件名、支持RTOS、支持多种区大小等。

4、 文件系统主要文件介绍:
文件名
功能
说明
ffconf.h
FATFS模块配置文件
需要根据需求来配置参数
ff.h
FATFS和应用模块公用的包含文件
不需要修改
ff.c
FATFS模块源码
不需要修改
diskio.h
FATFS和disk I/O模块公用的包含文件
不需要修改
diskio.c
FATFS和disk I/O模块接口层文件
与平台相关的代码,需要用户根据存储介质来编写函数
interger.h
数据类型定义
与编译器有关

二、 硬件电路

图14_0 原理图芯片引角连接.png

          图14_0 原理图芯片引角连接

图14_1 原理图TF卡座引角连接.png

           图14_1 原理图TF卡座引角连接

三、 实验原理
       STM32F407上带有SDIO控制器,iCore3核心板上将SDIO连接到TF卡座上。本实验将Micro SD卡插入TF卡座上即可。通过FATFS创建test.txt文件,并且写入数据0-511,然后读出并打印到终端上。硬件连接示意图如下:
图14_2 工作原理示意图.png
             图14_2 工作原理示意图

四、 源代码

主函数

  1. /*
  2. * --------------------
  3. * Company             : LUOYANG GINGKO TECHNOLOGY CO.,LTD.
  4.                                : 洛阳银杏科技有限公司
  5. * --------------------
  6. * Project Name        : iCore3 fatfs_sd
  7. * Description            : iCore3 fatfs_sd
  8. * --------------------
  9. * Tool Versions        : uVision V5.17.0.0
  10. * Target Device       : STM32F407IGT6
  11. * --------------------
  12. * Engineer            : ysloveivy.
  13. * Revision            : 0.01
  14. * Created Date        : 2015.12.02
  15. * --------------------
  16. * Engineer            :
  17. * Revision            :
  18. * Modified Date       :
  19. * --------------------
  20. * Additional Comments :
  21. *
  22. * --------------------
  23. */
  24. //--------------------------- Include ---------------------------//
  25. #include "..\include\led.h"
  26. #include "..\include\main.h"
  27. #include "..\include\usart.h"
  28. #include "..\fatfs\ff.h"
  29. #include "..\fatfs\diskio.h"
  30. #include "..\include\stm324xg_eval_sdio_sd.h"
  31. #include "..\fwlib\inc\stm32f4xx_gpio.h"

  32. #include <ctype.h>
  33. #include <string.h>
  34. #include <stdlib.h>
  35. #include <stdio.h>

  36. //---------------------------- Define ---------------------------//

  37. //-------------------------- Variable ---------------------------//

  38. //--------------------- Function Prototype ----------------------//

  39. //--------------------------- Function --------------------------//
  40. /*
  41. * Name                                        : main
  42. * Description        : ---
  43. * Author                                : ysloveivy.
  44. *
  45. * History
  46. * --------------------
  47. * Rev                                        : 0.00
  48. * Date                                        : 12/02/2015
  49. *
  50. * create.
  51. * --------------------
  52. */
  53. int main(void)
  54. {
  55.         int i,j;
  56.         FIL file;                                           //文件对象
  57.         FATFS fatfs;                                   //逻辑驱动器的工作区
  58.         static FRESULT res;                             //FRESULT函数公共结果代码
  59.         unsigned char write_buffer[512];                 //写文件缓冲区
  60.         unsigned char read_buffer[512];                  //读文件缓冲区
  61.         unsigned int counter;

  62.         led.initialize();
  63.         usart4.initialize(115200);

  64.         usart4.printf("\x0c");                                 
  65.         usart4.printf("\033[1;32;40m");                          
  66.         usart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n");


  67.         //判断SD卡是否初始化
  68.         if(SD_Init() != 0){
  69.                 usart4.printf("SD ERROR!\r\n");
  70.                 while(1){
  71.                         for(i = 0;i < 10000000;i++);
  72.                         LED_RED_ON;
  73.                         for(i = 0;i < 10000000;i++);
  74.                         LED_RED_OFF;
  75.                 }
  76.         }else{
  77.                 usart4.printf("SD Initialize successful!\r\n");
  78.         }

  79.         for(i = 0;i < 1000000;i++);
  80.         res = f_mount(&fatfs,"0:",1);                                   //挂载SD卡
  81.         if(res != RES_OK){
  82.                 usart4.printf("f_mount error!\r\n");
  83.                 while(1){
  84.                         for(i = 0;i < 10000000;i++);
  85.                         LED_RED_ON;
  86.                         for(i = 0;i < 10000000;i++);
  87.                         LED_RED_OFF;
  88.                 }
  89.         }else{
  90.                 usart4.printf("f_mount successful!\r\n");
  91.         }
  92.         res = f_open(&file,"0:/test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS);   
  93. //打开驱动器0上的源文件

  94.         if(res != RES_OK){
  95.                 usart4.printf("f_open error!\r\n");
  96.                 while(1){
  97.                         for(i = 0;i < 10000000;i++);
  98.                         LED_RED_ON;
  99.                         for(i = 0;i < 10000000;i++);
  100.                         LED_RED_OFF;
  101.                 }
  102.         }else{
  103.                 usart4.printf("f_open successful!\r\n");
  104.         }

  105.         res = f_lseek(&file,0);                                 //移动写指针到文件首
  106.         if(res != RES_OK){
  107.                 usart4.printf("f_lseek error!\r\n");
  108.                 while(1){
  109.                         for(i = 0;i < 10000000;i++);
  110.                         LED_RED_ON;
  111.                         for(i = 0;i < 10000000;i++);
  112.                         LED_RED_OFF;
  113.                 }
  114.         }else{
  115.                 usart4.printf("f_lseek successful!\r\n");
  116.         }

  117.         for(i = 0;i < 512;i++){
  118.                 write_buffer[i] = i % 256;
  119.         }
  120.         res = f_write(&file,write_buffer,512,&counter);     //将缓冲器中的内容写入源文件
  121.         if(res != RES_OK || counter != 512){
  122.                 usart4.printf("f_write error!\r\n");
  123.                 while(1){
  124.                         for(i = 0;i < 10000000;i++);
  125.                         LED_RED_ON;
  126.                         for(i = 0;i < 10000000;i++);
  127.                         LED_RED_OFF;
  128.                 }
  129.         }else{
  130.                 usart4.printf("f_write successful!\r\n");
  131.         }

  132.         res = f_lseek(&file,0);                              //移动读指针到文件首
  133.         if(res != RES_OK){
  134.                 usart4.printf("f_lseek error!\r\n");
  135.                 while(1){
  136.                         for(i = 0;i < 10000000;i++);
  137.                         LED_RED_ON;
  138.                         for(i = 0;i < 10000000;i++);
  139.                         LED_RED_OFF;
  140.                 }
  141.         }else{
  142.                 usart4.printf("f_lseek successful!\r\n");
  143.         }

  144.         res = f_read(&file,read_buffer,512,&counter);
  145.         if(res != RES_OK || counter != 512){
  146.                 usart4.printf("f_read error!\r\n");
  147.                 while(1){
  148.                         for(i = 0;i < 10000000;i++);
  149.                         LED_RED_ON;
  150.                         for(i = 0;i < 10000000;i++);
  151.                         LED_RED_OFF;
  152.                 }
  153.         }else{
  154.                 usart4.printf("f_read successful!\r\n");
  155.         }
  156.         f_close(&file);                                  //关闭源文件

  157.         usart4.printf("read data:\r\n");
  158.         for(i = 0;i < 32;i++){
  159.                 for(j = 0; j < 16; j ++)
  160.                         usart4.printf(" %02X",read_buffer[i*16+j]);
  161.                         usart4.printf("\r\n");
  162.         }


  163.         while(1){
  164.                         for(i = 0;i < 10000000;i++);
  165.                         LED_GREEN_ON;
  166.                         for(i = 0;i < 10000000;i++);
  167.                         LED_GREEN_OFF;
  168.         }
复制代码
五、 实验步骤
1. 把仿真器与iCore3的SWD调试口相连(直接相连或者通过转接器相连);
2. 把iCore3通过Micro USB线与计算机相连,为iCore3供电;
3. 打开PuTTY串口终端(注PuTTY使用方法见附录);
4. 打开Keil MDK开发环境,并打开本实验工程;
5. 烧写程序到iCore3上;
6. 也可以进入Debug模式,单步运行或设置断点验证程序逻辑。
六、 实验现象
在终端显示屏上可以看到FATFS操作的信息,如下图:
图14_3  实验现象图.png
              图14_3  实验现象图
七、 资料及代码包下载
链接:https://pan.baidu.com/s/1eRHeR9S 密码:go0n
附录:
1、iCore3供电后,打开计算机----属性----设备管理器----端口。
图14_4  COM口查看示意图.png
         图14_4  COM口查看示意图
2、打开PuTTY。
图14_5  PuTTY软件设置示意图 .png
        图14_5 PuTTY软件设置示意图
3、此时就可以烧写程序进行验证了。



收藏 1 评论3 发布时间:2018-5-3 21:22

举报

3个回答
MrJiu 回答时间:2018-5-4 09:56:54
支持一个!!!
hhhhhhhaa 回答时间:2018-10-18 09:51:28
求助一个STM32F103VCT6与AT45DB081芯片通讯添加文件管理系统FATFS,SPI2的接口的示例
czhstm 回答时间:2020-1-7 22:42:46
同上

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版