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

KEIL&Stm32 FATFS配置

[复制链接]
STMCU小助手 发布时间:2022-8-27 18:38
1. 移植前期准备5 K6 G4 a+ Z# J
        上一部分我们已经成功移植搭建完成LVGL的关于visual studio2022的PC模拟器,所有的LVGL的驱动源码啥的都在Simulator文件内,这个文件是我们移植到stm32F103所必须的。& K% I1 V6 r8 ^" k6 h6 e; U

3 {5 ^9 X' d7 m. c6 {, z        我们需要准备一个KEIL的工程,里面需要包含屏幕的驱动,SD卡的驱动以及其他的底层驱动,这个根据自己的需要去添加,其他的关于Stm32的教程有很多,这里不在过多啰嗦。
; r8 @* {" g* S% k0 P2 S# v' q$ s5 l% Z7 q4 M# u" V, P
        FATSF文件系统的移植主要是在未来创建项目时将界面所需的图片字库等大文件存放到内存卡中,减小Stm32的内存占用率,所以我们在移植LVGL文件之前把FATFS文件系统移植到项目中。
1 n3 L4 p7 T4 H; Y- y, p; x7 S7 r' m( N3 ]" C4 ]0 U/ Y
    注意:以后的keil工程的配置以及像源码移植的头文件包含到keil工程中的操作,如果没有特别需要注意的,后续不再提及,大家自己配置一下就好了。
  i0 `( [0 R2 I0 f5 o6 j
4 A3 O+ w; }. V) |2. keil配置) E- p$ ^" g" s2 k7 e% S% Q
        下面是关于KEIL工程的建立的几个文件。
" m( O0 U! @+ a+ _1 k# F7 [3 j9 X* y  k, S' d; Z( e6 [; b
Libraries--Stm32的固件库
& q+ h" }2 M/ o/ W" u# x, J0 [. M) `8 M3 o+ }. A: u
Project----KEIL工程项目
9 v' D: F# k3 f4 m0 M9 J# C' Y. e, y% N# u3 |; }( F( E+ ~
Simulator--上一期建立的Visual studio2022的模拟器文件- ]/ k3 J1 G" h! N

( X7 o% m+ P2 o+ E% h/ NUser--------外设驱动文件
# j& o5 y$ @6 {1 C7 \# x! g$ N, U6 ^* l1 q+ Y) P
LUYK`{CXT2RB9I10S@GR.png
( }; d6 e/ i: M2 ^2 N
8 J" r& t2 W) i! i        USER文件夹内创建几个外设驱动  ?6 l: \) X7 @9 N- e2 R( D, V

. T5 Y( p5 X5 bAPP---后期可以添加界面文件1 n! L/ |  x' W% C3 S
( [! r2 r  {! Y* p- X
BSP---LCD屏幕驱动、SD卡驱动、RTC配置* J- b# ^4 V  ^4 |( T6 R$ A3 S$ h
9 U9 w" t$ Z% n% u
LVGL-LVGL的屏幕驱动,输入驱动(触摸屏),SD卡驱动
, B! l& y  R, t5 R/ M" j  k' _/ D
FATFS--FATFS的文件系统源码用来管理SD卡文件
0 N7 W  Z/ A4 S  c8 o" E) U) h$ p: M! [5 \; b- q1 E

+ [! U/ @, c' N  P7 C- W; X1 Q7 F
" t# B* Q4 B) a8 ^    3.FAFS移植
; m; W% a; L; A+ M1 K FatFs是用于小型嵌入式系统的通用FAT/exFAT文件系统模块。FatFs模块按照ANSIC(C89)编写,并与磁盘输入/输出层完全分离。因此,它独立于平台。它可以整合到资源有限的小型微控制器中,如8051、PIC、AVR、ARM、Z80、RX等。此外,这里还提供了用于微型微控制器的Petit FatFs模块。
9 C! e) L" B. p+ ]. u% x7 N- `! N, ^( i0 M7 E4 y3 }1 ?7 D9 V
        FATFS有两个版本,一个大版本,一个小版本。小版本主要用于8位机(内存小)使用。我们这里使用大版本。
" u! ^0 x: q# G1 O3 u$ ?
6 u& I4 p' L, C5 d点击FatFs R0.14b进行下载。
. F$ ?# `8 E7 p3 h6 O6 T  k4 E7 E; J/ D
4Y0H[DW)~U0~0KL_WI}DF$F.png
0 i( O8 q8 T$ Y% x. R* o; H8 q; @; r5 P7 e1 [
    下载下来的FATFS源码的只有三个文件,这里我们只需要source文件夹下面的文件。
( s; @$ Q6 Y8 m( t6 |5 J$ C/ c) U0 k2 y0 _! s6 D( U7 X! j8 @
RUOO3PV~MTI)H@MD7T0YMY4.png $ b, \+ O7 p( F  \

. n5 L6 U& s: ?5 t        我们需要将source文件夹内的所有.c和.h文件全部复制到KEIL工程的USER/FATFS文件下面。
6 X+ C' r6 w) [- w5 f6 |& Z4 d2 `# l' e# x9 g2 P; ?
9EGT08EPSCT]W~D$(A1QG}I.png
  S& U0 u5 c! C5 h
, F+ h- R8 _  `- F2 n ff.c           FATFS模块,应用层源文件1 \6 T- P$ c( _- j7 h

8 {# I+ S" D" w2 w* t+ D4 T. t. w  ffconf.h       FatFs模块的配置文件,需要修改。& p" q2 v# e& i8 c. m+ X+ Q

! p! `! I: W! L7 e/ M0 [6 N  ff.h           FATF和应用程序模块的通用包含文件。
0 j; x, h  s. Z- e8 Y4 r
: t, G. z9 E: Y0 C* b  diskio.h       常见包括FATF和磁盘输入/输出模块的文件。
$ M' k$ {7 Q* @$ x9 P
) g. p6 A5 L  D# v) I: }3 B  diskio.c       将现有磁盘输入/输出模块连接到FATF的粘合功能示例,底层接口,需要修改。
6 a  o. z3 ^  [1 T2 B2 c' S, B* M6 t4 z- n7 W- d5 K# r5 [9 [
  ffunicode.c    可选Unicode实用程序函数。, L! ]- l( L3 e/ `1 K
, k: k5 n) [, L. x
  ffsystem.c     可选O/S相关函数的示例。
0 f  w$ g1 o  ^$ Z& s, [* D" N+ `4 n, B5 v
  此存档中不包括低级磁盘输入/输出模块,因为FATF模块只是一个通用文件系统层,它不依赖于任何特定的储设备。我们需要提供SD卡的写入的低级别磁盘输入/输出模块控制连接到SD卡设备。
  i. x. v3 ~; v+ k$ C$ ^
( S2 G1 p+ {$ [4 M% q    4.FATFS配置+ w( d5 X6 h  }# V" T
    将Fatfs文件夹内的文件添加到KEIL工程中。" E' [  w5 Q9 i- U* j

/ b1 Q# j. b1 P, }7 J KQU$TQ1F2N7IVZ[T@CEFS_C.png
; t1 Q0 e0 q; b: x9 m5 }" J$ l3 e9 b0 ]/ B2 k: T
我们只需要配置diskio.c, ffconf.h两个文件
  V+ F( i6 n6 k3 P" @+ w
# f$ I2 l3 k3 T. l4 k4.1 diskio.c文件修改( n7 u4 C5 h* P8 f' U6 c
    1) 添加SD卡驱动头文件2 L  p/ t- r, s4 I( s

( v$ x' i$ r7 x; e    2)注释掉不需要的RAM,MMC,USB宏定义,添加新的SD卡宏定义# k* L, n: N" i9 G/ v

9 ]8 k; i! o3 G OVW6C3YLBR61M6D_PVPF15S.png - J8 g5 u! ~1 B- @4 o* t( S( g

: [2 F9 U6 m! m1 e3 R$ |    3)}修改 disk_status函数,这个函数主要是获取SD卡状态,不使用是直接返回RES_OK
+ D" W  j6 f9 L$ S- u0 {
" M3 g2 W& J0 l. o* F* m) X+ _ VGE8}2LO%]AQYS8K)PN0VD6.png
. y$ s- r- U9 W8 q4 e" c3 a( l- X- X( I3 j

3 c' w! P- g7 @9 \- U    4)修改disk_initialize 函数初始化SD卡驱动 返回值: 0:成功。1:失败0 w$ u) i9 e7 N% K7 s) X
+ ?+ d6 x' C$ q% o& K7 I. t
WQFA_3Y~TGSR6%5YHZR]C]X.png
. N+ `. ?4 G. y% n. m
9 S! u7 y. P' B1 C- w        5)修改 disk_read 函数 SD卡读任意扇区的函数+ _, c' ^( D  k4 S

# K: s" C9 C/ O' S4 n6 M 1_~(GJE1BR7(B%[BT60Y{WU.png & X) ]4 c. U0 D# w+ j% \

2 `7 I& s# h  o1 N6 A8 p
& \3 C+ B" P% F& p1 P! N1 `: j* @        6)修改 disk_write 函数 SD卡写任意扇区的函数
3 {% r: s5 e( @8 q/ x3 ^' q# i/ b
[6N75%PU{(G5RCC_3B54CPD.png
+ B' s. I) p6 R) e% U- m; L% [5 U" |+ \- R, F# u
        7)修改  disk_ioctl 函数 填充ioctl命令功能。这些功能是标准的命令,在diskio.h有定义% i% y+ C( ^7 f; i+ G

! D5 [% J3 x- K% ~" ]8 P  I0 W G${MI]~~DKBU4BOSC]~_9[S.png
  ?& m- C- U% M# Q4 B  i
$ E2 |6 {. l8 i9 a    4.2  ffconf.h 文件修改, U! V, l2 J& W% g# J
        1)修改编码格式
. A4 a1 _$ p8 C9 s- \
$ R+ y: Z1 M  J, n            FATFS支持多种文件编码格式,支持中文和英文
* h8 @1 U. R$ d: f4 j2 h$ V% }- _3 f
    我们只需要修改#define FF_CODEPAGE 936宏就可以,源码里面有编码格式对应的定义& m6 l# t% L. K$ m( J
" J5 l0 \4 K$ h
        将这个宏定义为936编译后发现代码占用空间特别大,比较移植之前RO Size 多了一百K/ X0 A: o7 ?6 U7 D3 a9 {

$ ]. x! C7 _3 q; j: ~$ a" V' [; q5 q- d %M3${$}LL)1F7XP2]}OO}7P.png 0 N# u1 ]6 [9 G3 a+ I6 Y! V
$ C9 X, p: F6 e' R2 }
        而使用437后发现空间占用就比较小了,所以我们只需要将编码格式宏定义为437,SD卡内的文件夹和所有文件都命名为英文就可以了。
; v' p' j; n; o+ }" J  P0 Q& v; p0 d8 G2 |6 L, `( L6 ]+ T* L
A`UM0`][IPFAXO6M%MQD5NQ.png
5 d! k- _# o8 X* s" w" U5 L2 o) y! F
        2) 修改支持长文件名9 p5 C0 J: q8 {( K2 j, m; F. u

& A) S% E6 X3 G  u4 C% e$ K            这一步需要实现动态内存分配函数在ffsystem.c文件增加 #include <stdlib.h>头文件! J2 O: D8 n& W7 x6 ?& h$ {( z; v
2 E6 C. J5 x; N' P& s* I7 D
            #define FF_USE_LFN 3  // 3:使用堆上的动态工作缓冲区启用LFN
( I9 J; ^/ Y; W  S. x% [2 d
6 ~/ n( E& s) y3 a' [! j            #define FF_MAX_LFN 255
' [1 Z& Z% f* Y( y8 I0 R0 u+ V+ Z: ~$ ^: r& ^  L
        3)ff.h中添加时间获取函数
9 u4 J' [9 T" U. j8 u  _5 n/ }
/ |3 E+ A5 F5 m3 _" H1 D' b- i            DWORD为32位的变量- n6 u0 m' U( }9 ]% A' f9 m* ?

4 v7 |% [( Q, x31-25位:年/ t' t+ e1 @% S( ^0 ?1 u

0 e  o8 Z: ], K" p- V24-21位:月
! X  P  Y' ^8 C+ R% B" _8 ^0 @+ j8 G0 L' B* H. Q
20-16位:日
7 b- R2 K0 C9 p9 ?$ M
2 Z% u$ W% g& C1 @# j( ~0 y15-11位:时  1 @; J2 L* l& f  @" c( J
# \  C7 K6 K0 \) e: [+ |+ ?2 D6 a$ f
10-5位:分钟   
% C, E! o. L! B9 T( M8 P* k
2 o- t  H: U( ^4-0位:秒& z6 }* J* Y4 ]7 B5 f, S- Z

% ^$ N" G3 b( k. U! g  h; n
8 R$ Q8 o! @# M3 }2 u9 o7 W4 B                DWORD get_fattime(void)
9 H3 l" C6 C' \2 X: X4 T5 \& ~2 @. @, K% p
                {5 n/ [& a, s  h3 l7 f# n) I
- h- n4 t/ O/ R  t; ]
                    DWORD time = 0;6 f4 S' c# Q: c, A0 t8 F" s- k2 {! z

" x' Q5 y. @! W6 [                    RTC_Get();
1 x9 ^: Y, v8 U& X6 g) X1 f4 G) G. r" L! r3 x0 C
                    time = ( (7 F$ W/ @6 Q( i3 M# n
9 r% ]: Q# S& \8 N$ _0 ~, ?  R2 T
                     (calendar.w_year+20) << 25) |& Y+ f3 n' K/ G5 X! z( I9 H, b

0 F3 B0 q( Z4 N, c                     (calendar.w_month << 21 ) |  N' e+ @' ^$ {9 N) C5 I; w" O

) H# O3 A2 _! t" [+ s                     (calendar.w_date << 16 ) |
$ K0 i! k% O1 i( Q: M% T, r4 ?6 R& f4 h4 @$ a* j
                     (calendar.hour << 11 ) |
% s" ~  W. z* M# R$ D/ L( ?7 h" j7 ~. H2 t
                     (calendar.min << 5 ) |3 U6 `, g/ p* Z) s- T' G$ M+ @3 ]" W
9 ?3 _  t0 B3 D' I2 O' g+ m
                     (calendar.sec ));
3 G6 q8 g: D, D5 f1 S% a0 X6 U3 M! u
                        return time;- w- e9 L" T3 f; z' T' y4 J9 J  S

! b& c* b: S6 l                }
  E  c/ w+ |8 V0 V  ?% }) d2 H' d$ K
            4)修改堆栈空间
/ o4 I1 x( I! d+ Q% P: [8 g! y$ y, _' r9 d- u/ y" v
079SW5WNNJOCNDI[7RB9JUX.png   P6 O* Y: K+ l# e# ~- m* D
) o. w, g/ A5 f( v
到此FATFS文件系统全部移植完成 4 f. t7 z, B: y; f$ A
作者:鹰头猫咪喵喵鱼 8 ~. \2 X5 \; b5 J
  R' r* i% m+ f' \" Y( z2 E# Y

+ g% f* a" b# ~, j! d% l8 ^
赞 收藏 评论0 发布时间:2022-8-27 18:38

举报

0个回答

所属标签

相似技术帖

官网相关资源

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