打印
[应用相关]

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

[复制链接]
1692|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kkhkbb|  楼主 | 2018-5-3 21:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 kkhkbb 于 2018-5-4 18:50 编辑

一、 概述
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 原理图芯片引角连接


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

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

四、 源代码

主函数

/*
* --------------------
* Company             : LUOYANG GINGKO TECHNOLOGY CO.,LTD.
                               : 洛阳银杏科技有限公司
* --------------------
* Project Name        : iCore3 fatfs_sd
* Description            : iCore3 fatfs_sd
* --------------------
* Tool Versions        : uVision V5.17.0.0
* Target Device       : STM32F407IGT6
* --------------------
* Engineer            : ysloveivy.
* Revision            : 0.01
* Created Date        : 2015.12.02
* --------------------
* Engineer            :
* Revision            :
* Modified Date       :
* --------------------
* Additional Comments :
*
* --------------------
*/
//--------------------------- Include ---------------------------//
#include "..\include\led.h"
#include "..\include\main.h"
#include "..\include\usart.h"
#include "..\fatfs\ff.h"
#include "..\fatfs\diskio.h"
#include "..\include\stm324xg_eval_sdio_sd.h"
#include "..\fwlib\inc\stm32f4xx_gpio.h"

#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

//---------------------------- Define ---------------------------//

//-------------------------- Variable ---------------------------//

//--------------------- Function Prototype ----------------------//

//--------------------------- Function --------------------------//
/*
* Name                                        : main
* Description        : ---
* Author                                : ysloveivy.
*
* History
* --------------------
* Rev                                        : 0.00
* Date                                        : 12/02/2015
*
* create.
* --------------------
*/
int main(void)
{
        int i,j;
        FIL file;                                           //文件对象
        FATFS fatfs;                                   //逻辑驱动器的工作区
        static FRESULT res;                             //FRESULT函数公共结果代码
        unsigned char write_buffer[512];                 //写文件缓冲区
        unsigned char read_buffer[512];                  //读文件缓冲区
        unsigned int counter;

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

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


        //判断SD卡是否初始化
        if(SD_Init() != 0){
                usart4.printf("SD ERROR!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("SD Initialize successful!\r\n");
        }

        for(i = 0;i < 1000000;i++);
        res = f_mount(&fatfs,"0:",1);                                   //挂载SD卡
        if(res != RES_OK){
                usart4.printf("f_mount error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_mount successful!\r\n");
        }
        res = f_open(&file,"0:/test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS);   
//打开驱动器0上的源文件

        if(res != RES_OK){
                usart4.printf("f_open error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_open successful!\r\n");
        }

        res = f_lseek(&file,0);                                 //移动写指针到文件首
        if(res != RES_OK){
                usart4.printf("f_lseek error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_lseek successful!\r\n");
        }

        for(i = 0;i < 512;i++){
                write_buffer[i] = i % 256;
        }
        res = f_write(&file,write_buffer,512,&counter);     //将缓冲器中的内容写入源文件
        if(res != RES_OK || counter != 512){
                usart4.printf("f_write error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_write successful!\r\n");
        }

        res = f_lseek(&file,0);                              //移动读指针到文件首
        if(res != RES_OK){
                usart4.printf("f_lseek error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_lseek successful!\r\n");
        }

        res = f_read(&file,read_buffer,512,&counter);
        if(res != RES_OK || counter != 512){
                usart4.printf("f_read error!\r\n");
                while(1){
                        for(i = 0;i < 10000000;i++);
                        LED_RED_ON;
                        for(i = 0;i < 10000000;i++);
                        LED_RED_OFF;
                }
        }else{
                usart4.printf("f_read successful!\r\n");
        }
        f_close(&file);                                  //关闭源文件

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


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

沙发
hwh132| | 2018-5-4 10:12 | 只看该作者
万分感谢楼主!

使用特权

评论回复
板凳
gyh974| | 2018-5-11 19:10 | 只看该作者
好贴,请问提取密码是多少?

使用特权

评论回复
地板
wangzxnet| | 2019-3-7 08:04 | 只看该作者
提取码没有啊!

使用特权

评论回复
5
zhaoxiaolong1| | 2019-4-25 14:42 | 只看该作者
请问提取密码是多少?

使用特权

评论回复
6
characteristic| | 2019-4-26 14:14 | 只看该作者
感谢楼主分享!看起来很好用的样子

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

13

帖子

7

粉丝