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

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

[复制链接]
kkhkbb 发布时间:2018-5-3 21:22
本帖最后由 kkhkbb 于 2018-5-4 18:59 编辑
; z% Q" j6 o, F8 A1 j
0 g- K6 h! d9 u1 O+ x
一、 概述
1、 文件系统简介:
(1)文件系统:管理和存储文件信息的软件机构。
(2)常用的文件系统:
  •      FAT/FATFS
  •      NTFS(基于安全性的文件系统,是Wundow NT采用的独特的文件系统结构。
  •      CDFS:CDFS是大部分光盘的文件系统
    : q& ]$ n+ w' l1 C' O' X) O
2、 FATFS文件系统简介:
      FATFS是一个完全免费开源的FAT文件系统模块,专门为小型的嵌入式系统而设计,完全用标准C语言编写,具有良好的硬件平台独立性,可移植到8051、PIC、ARM等系列单片机上而只需做简单的修改。它支持FAT12、FAT16、FATI32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8位单片机和16位单片机做了优化。
3、 FATFS文件系统特点:
  •      Window兼容的FAT文件系统(支持FAT12/FAT16/FAT32)。
  •      代码量少、效率高。
  •      与平台无关、移植简单,全部通过C语言编写。
  •      多种配置选项:支持多卷(物理驱动器或分区,最多10个卷)、多个ANSI/OEM代码页、支持长文件名、支持RTOS、支持多种扇区大小等。! f" h2 `5 |; P! ]4 @: V4 ~1 y

    5 d  S2 z1 [8 z+ I
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. /*" J8 _( k' u* B) R8 M: T7 V
  2. * --------------------4 z8 L" V5 r/ E/ E/ \" L
  3. * Company             : LUOYANG GINGKO TECHNOLOGY CO.,LTD.
    , G9 C9 x% C8 w& a
  4.                                : 洛阳银杏科技有限公司3 H8 G, L& Z% x
  5. * --------------------
      h( `) T# v1 j, v2 ?0 _3 \
  6. * Project Name        : iCore3 fatfs_sd
    & t+ b0 A  t+ i$ c( ]: Q6 U9 O
  7. * Description            : iCore3 fatfs_sd, B! b( ]9 L# v$ {) L# m
  8. * --------------------
    * [; j* y  c2 f
  9. * Tool Versions        : uVision V5.17.0.0
    9 f8 e  C. \8 G' y" H6 J' R* }
  10. * Target Device       : STM32F407IGT6; w6 i+ b6 U4 n1 F! ^
  11. * --------------------
    6 @. E0 k- d, Y. G% F1 R
  12. * Engineer            : ysloveivy.
    3 G: R+ d  [5 l' J$ Z
  13. * Revision            : 0.01
    % k# L2 h( y% e3 G* m
  14. * Created Date        : 2015.12.02
    & A2 K* L8 {: K! |1 Z% n, c/ a
  15. * --------------------
    ! o9 O# V% M! j1 u3 ~
  16. * Engineer            :
    " R7 I- x( r% b$ S, R( W+ j
  17. * Revision            :5 E% `3 \2 W; y& z6 {
  18. * Modified Date       :6 U# T/ _: i3 p' `# ?
  19. * --------------------( s/ Z- N' _8 c
  20. * Additional Comments :
    * C% T, L. v$ g5 s, g( m
  21. *: ~- G, n) s6 _- P3 u5 V
  22. * --------------------3 n: m# M" @" e9 S  ]5 C/ V  m
  23. */. `6 o! O3 |0 [% @* c2 ~, p
  24. //--------------------------- Include ---------------------------//  C; e( A; r4 d+ m/ a0 S
  25. #include "..\include\led.h"! V+ q' s# P' U$ v( v# M& D* H; ~
  26. #include "..\include\main.h"% q0 o6 m6 A" a
  27. #include "..\include\usart.h"
      a$ C* B7 k$ o0 s; Z8 W3 b  w( E
  28. #include "..\fatfs\ff.h"0 O0 _' G( y: n/ c% k7 a/ T
  29. #include "..\fatfs\diskio.h") {. q3 `/ L3 Y
  30. #include "..\include\stm324xg_eval_sdio_sd.h"
    % f' E4 G+ l0 h5 g+ t& e( ~& ?, Z3 c2 ^
  31. #include "..\fwlib\inc\stm32f4xx_gpio.h"
    ; ^. t' ~1 d% n
  32. * j6 n1 {2 |7 y5 j' h! N
  33. #include <ctype.h>
    / H3 ~2 u) t2 u1 a; A' R
  34. #include <string.h>
    6 ^: b8 F. x# K! \& O
  35. #include <stdlib.h>
    $ \6 N) m/ e" U
  36. #include <stdio.h>
    9 n7 \6 d* d" w" |
  37. # J& e$ O  C; a' m
  38. //---------------------------- Define ---------------------------//6 k, L/ P) p" D; }1 ?1 y
  39. ! M9 e" e+ J# k+ ]4 ~! O: U* K9 W# v
  40. //-------------------------- Variable ---------------------------//: W: {% ?& T" ]; i2 @

  41. ; v) F; x: Q4 `) V- c' A
  42. //--------------------- Function Prototype ----------------------//
    0 s2 m. o) `0 G- L. L3 C4 ]# {% q
  43. : v+ U4 j: J$ c, F4 e  P6 C7 w+ y
  44. //--------------------------- Function --------------------------//! a3 X" Q' i# H9 ~  O
  45. /*, J, |. s* N% N& A+ N
  46. * Name                                        : main( h7 D, a, N1 S0 l+ M+ ~3 ?
  47. * Description        : ---
    - C7 {3 j3 X; m
  48. * Author                                : ysloveivy.2 S6 l4 p; c! b3 z4 c4 F
  49. *
    5 p6 ^8 b7 O: J: U( T8 O
  50. * History1 |; p" l0 X0 t( H" o5 u
  51. * --------------------  }5 U2 [% J% p
  52. * Rev                                        : 0.00
      C8 O% h7 x; ?+ S5 o' o2 O
  53. * Date                                        : 12/02/2015
    ) o1 c+ D" [! F' z9 x1 a
  54. *
    - B/ X. i- ]$ x
  55. * create.
    ' x4 e+ R; D8 M4 G) V- N
  56. * --------------------( y2 w5 S( i$ D( x
  57. */6 h8 h, p- X& G
  58. int main(void)
    1 _* a* `; @! y3 N. y7 f: C2 E
  59. {2 O0 r3 r; E" H- Z. }- }9 n# M& d" l
  60.         int i,j;# H2 y. D/ y, x  n! g- C* ~
  61.         FIL file;                                           //文件对象
    7 m. G. C2 P1 ?% p  u
  62.         FATFS fatfs;                                   //逻辑驱动器的工作区  t& {: d9 I6 C
  63.         static FRESULT res;                             //FRESULT函数公共结果代码3 y; {- c9 r2 `9 X( D% {
  64.         unsigned char write_buffer[512];                 //写文件缓冲区
    & N* p- l. j1 S1 {/ I
  65.         unsigned char read_buffer[512];                  //读文件缓冲区( ?4 L+ a4 @- u$ h7 n* J
  66.         unsigned int counter;" t, ?0 P% Y8 A2 V4 p

  67. ; P8 _( g5 [. M2 M: A- {
  68.         led.initialize();; i4 L! W4 s$ F1 i: m; @
  69.         usart4.initialize(115200);
    8 c$ e$ |2 e2 {. h* u

  70. ) L* l1 y# d! g! R1 |
  71.         usart4.printf("\x0c");                                 
    # U, X9 g3 r* q# w
  72.         usart4.printf("\033[1;32;40m");                          
    4 P0 m* O, x4 c5 {5 ]
  73.         usart4.printf("\r\n\r\nhello! I am iCore3!\r\n\r\n\r\n");" n( M" l  ]# d3 K; \3 v" Q

  74. # }3 y8 `1 @5 T: }9 K) Q
  75. & i$ a4 V4 v& N: g. c! y# z
  76.         //判断SD卡是否初始化' b1 K' _% y8 F0 L1 o# d0 G) h
  77.         if(SD_Init() != 0){
    * Q/ _7 h( t; d2 a
  78.                 usart4.printf("SD ERROR!\r\n");9 R3 I! y& G2 @9 B* \- P0 m
  79.                 while(1){
    , e. K. N8 |7 C8 J5 V6 @
  80.                         for(i = 0;i < 10000000;i++);( R* H+ T8 M( M1 o
  81.                         LED_RED_ON;7 n4 I4 {9 i3 j
  82.                         for(i = 0;i < 10000000;i++);
    ) n+ d# `- h+ k! F3 S
  83.                         LED_RED_OFF;# t3 G4 q, I! k8 j& {1 x3 E
  84.                 }( `2 T7 m3 [, c/ R, i+ q
  85.         }else{
    - p  R- q6 n! L0 s) y. e/ n" D
  86.                 usart4.printf("SD Initialize successful!\r\n");
    4 G( }" g- J. o7 j) ^& Y$ b4 y6 @8 ^9 {7 r
  87.         }
    , H1 P# |1 S; \8 R+ ~$ _! Q

  88. ( u7 J3 U; `* \  ^: F$ C9 [7 s7 H$ ^
  89.         for(i = 0;i < 1000000;i++);
    % @  k; R/ j& v! @) s; X
  90.         res = f_mount(&fatfs,"0:",1);                                   //挂载SD卡
    " c8 W6 }' n6 a+ C. O
  91.         if(res != RES_OK){+ Q3 I9 u  j5 {
  92.                 usart4.printf("f_mount error!\r\n");
    4 c) I- p7 L2 n4 b- F9 r) p- l
  93.                 while(1){* Y6 Y6 C6 W8 A% v+ H
  94.                         for(i = 0;i < 10000000;i++);# s2 g9 R  [, L- q0 }
  95.                         LED_RED_ON;# w9 Y" I; l& w  _! H
  96.                         for(i = 0;i < 10000000;i++);
    - \& ~% K" u% x- `$ g" H% ^
  97.                         LED_RED_OFF;
    6 p. h' n/ {$ y1 `" t
  98.                 }
    7 B  N1 W3 a& `2 H" u5 _2 G
  99.         }else{5 r1 `9 X  R: \7 P  j# s
  100.                 usart4.printf("f_mount successful!\r\n");0 d5 B- o1 _( g  A( E, h
  101.         }4 q4 z4 B, }0 M. G
  102.         res = f_open(&file,"0:/test.txt",FA_READ | FA_WRITE | FA_OPEN_ALWAYS);   
    & s' v- m* O* O, I+ k" ~  l
  103. //打开驱动器0上的源文件/ B: N) X4 w4 L0 G! L( d

  104.   {, L3 a5 m9 K6 T3 W9 s& x  |
  105.         if(res != RES_OK){/ v3 D$ V- q, N8 j- }. P4 ?0 O1 d
  106.                 usart4.printf("f_open error!\r\n");: W) n) v2 L% K. G+ p; ~
  107.                 while(1){
    : O) Y3 G1 \8 O: T
  108.                         for(i = 0;i < 10000000;i++);
    : Z- S. t2 L2 Q* K
  109.                         LED_RED_ON;
    9 e; b0 J: f! @
  110.                         for(i = 0;i < 10000000;i++);, l# ?- F: S$ `8 X: I  t& _
  111.                         LED_RED_OFF;
    ' ]4 r  A: {7 t# N' _* N+ @8 p
  112.                 }/ E; j: C% D% u8 l0 ~! l5 Y5 o
  113.         }else{* Q% {4 F8 M% c7 M+ v
  114.                 usart4.printf("f_open successful!\r\n");
    " m/ p% _6 H8 r" s
  115.         }
    % a5 L5 n3 A2 H" N+ b" i

  116. , z; P5 G% i( ]3 u
  117.         res = f_lseek(&file,0);                                 //移动写指针到文件首* O7 N' Z$ T* v
  118.         if(res != RES_OK){; y4 y% K( e) [5 N4 o4 C
  119.                 usart4.printf("f_lseek error!\r\n");
    $ U/ c  }3 n) I2 i, I8 D
  120.                 while(1){
    6 M$ Q) v7 A7 X% q- G
  121.                         for(i = 0;i < 10000000;i++);
    , g+ p1 D/ d: U+ I. u2 W
  122.                         LED_RED_ON;
    # ^& a& Q. w$ q
  123.                         for(i = 0;i < 10000000;i++);
    - L: @5 S" j7 I3 O- L% c! p# I
  124.                         LED_RED_OFF;
    + Z' s4 \/ @* H( [; q2 A8 h9 S1 {
  125.                 }
    & u3 K/ W' L  J: `
  126.         }else{
    6 i0 A" ^4 O( I  b: N
  127.                 usart4.printf("f_lseek successful!\r\n");& b' _/ X) w3 K- g
  128.         }3 s+ S9 F& K% z- F" ]' b

  129. + g9 s* y  e5 b
  130.         for(i = 0;i < 512;i++){8 i" s& F9 p2 N# c# Q, S2 J
  131.                 write_buffer[i] = i % 256;; S; Y+ D$ y: \' D
  132.         }, N) H" C. v$ U% [( |. Y+ k
  133.         res = f_write(&file,write_buffer,512,&counter);     //将缓冲器中的内容写入源文件
    6 S6 y; Z; l; y: k3 e/ u
  134.         if(res != RES_OK || counter != 512){  B5 S. |! G; J2 Q8 I* ^$ K
  135.                 usart4.printf("f_write error!\r\n");9 a7 N+ E  }* ]4 }% `. H: r
  136.                 while(1){
    , ], m6 u- m& M3 \' [
  137.                         for(i = 0;i < 10000000;i++);
    % P9 I6 k' m: b% y- H$ \4 S) B1 n
  138.                         LED_RED_ON;
    5 x6 m. t# F) E4 Q9 R$ _2 Z' u
  139.                         for(i = 0;i < 10000000;i++);
    % h/ V# y, E' o5 D% \! s: z
  140.                         LED_RED_OFF;
    ; m4 c0 O5 [5 g; b; b" i
  141.                 }
    - R9 S; y$ f2 B& i; a! L/ @! I0 w
  142.         }else{
    / `0 @& A" B" c# U3 P; U2 V# s
  143.                 usart4.printf("f_write successful!\r\n");% P) W' v0 S/ u
  144.         }
    9 M6 V- Z. b6 [! |

  145. / E, z1 ]# ^, m7 B. F2 A" Y
  146.         res = f_lseek(&file,0);                              //移动读指针到文件首5 _1 M; V- k- V# e/ h* o  z8 G) v
  147.         if(res != RES_OK){/ s3 \% _+ i4 v
  148.                 usart4.printf("f_lseek error!\r\n");
    ) K1 h0 f  O4 I3 o; l: n
  149.                 while(1){& q+ q7 {1 P3 U5 N
  150.                         for(i = 0;i < 10000000;i++);5 Z$ }& V% k5 `+ G
  151.                         LED_RED_ON;
    5 w4 r% c1 t" ?
  152.                         for(i = 0;i < 10000000;i++);1 S  l0 p* l# w( _
  153.                         LED_RED_OFF;/ u5 {8 U! b+ r$ R- e, }5 o
  154.                 }+ I4 I' s5 f/ L# d/ }% Z& |
  155.         }else{6 }7 S# s' I  M' @( j
  156.                 usart4.printf("f_lseek successful!\r\n");
      l. j1 K/ N/ j& j& d1 x! }
  157.         }
    / {- \. Y' d6 Y4 l# X( b

  158. ) |' W1 f$ c1 D7 d
  159.         res = f_read(&file,read_buffer,512,&counter);' o1 q5 R0 L3 @8 s
  160.         if(res != RES_OK || counter != 512){# w7 P% G+ _2 s9 W; I
  161.                 usart4.printf("f_read error!\r\n");
    6 g: S. N& [# i! |, c
  162.                 while(1){
    ( E9 {' f, ]3 n4 }; d
  163.                         for(i = 0;i < 10000000;i++);
    7 O, Q# Y1 a- Q" m" P9 L
  164.                         LED_RED_ON;/ l- ]- Z* y8 p: y- ^' m; f& Q
  165.                         for(i = 0;i < 10000000;i++);  X' p: c$ [* g' D/ z8 q! M
  166.                         LED_RED_OFF;
    2 ?  o4 e: {% n* `  b
  167.                 }
    & p- f. N7 o  V3 [; D) ^, f' V
  168.         }else{8 W$ a0 G9 @# }; w0 ]
  169.                 usart4.printf("f_read successful!\r\n");
    1 k6 n' C1 i* M. j$ [
  170.         }- v+ X6 l& K6 y
  171.         f_close(&file);                                  //关闭源文件+ B! M  X# C, W$ j9 ]

  172. ; C+ ~1 h0 [0 T- X8 ~. z! X
  173.         usart4.printf("read data:\r\n");- Q7 S" A. ~- S( P( [8 E7 K* ^+ B8 Y
  174.         for(i = 0;i < 32;i++){
    & E7 A0 _. ^3 P
  175.                 for(j = 0; j < 16; j ++)
    ' C3 W$ S4 n: u5 N
  176.                         usart4.printf(" %02X",read_buffer[i*16+j]);
    , z, \9 X$ f) Q( J& K  n6 h
  177.                         usart4.printf("\r\n");
    4 r4 @. N( p; N
  178.         }
    3 T$ y+ Z- E9 M( z, U5 u
  179. 5 x' H9 H* U; t1 a/ U0 L2 ]
  180. ; p2 `3 z9 g( Q4 l: g; @6 }! I
  181.         while(1){
    $ q, J& U' w( ?; j
  182.                         for(i = 0;i < 10000000;i++);, c7 m+ _# d; t7 s* @: U% _0 ~& S6 d; A& C
  183.                         LED_GREEN_ON;# S2 _% |( {7 M2 v3 G5 H' U
  184.                         for(i = 0;i < 10000000;i++);8 E9 v& [/ v+ D) t( e
  185.                         LED_GREEN_OFF;
    2 r* a# d+ l4 M! h* G
  186.         }
复制代码
五、 实验步骤
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、此时就可以烧写程序进行验证了。
% `5 _0 q* r; H  A6 l$ g
3 ^5 o3 G; g. ]9 y8 X$ J9 J
9 N5 p# u* A4 |! B" x0 n
赞 收藏 1 评论4 发布时间:2018-5-3 21:22

举报

4个回答
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
同上
bobby_2020 回答时间:2022-4-18 14:33:49

怎么让它支持热拨,程序应该如何做?请高手指点一下,谢谢

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版