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

【STM32小技巧】STM32移植FAFTS文件系统遍历创建文件夹

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47

+ s0 P' m) b2 R. n. y3 J分享一个STM32移植FAFTS文件系统遍历创建文件夹
' ]9 Q. z% ~, ?
  1. FRESULT folder_create(char* path)0 y) W' J0 ^# w4 G0 x# G
  2. {
    3 A- `* e8 `# D* i0 s
  3.     FRESULT res;+ V5 I  a3 c* I& }
  4.     DIR dir;
    0 C. i+ W7 J  [( L; ^3 C  Z
  5.         char *str = path;
    ; ?$ T* K6 |, I
  6.         char *pbuf;
    9 T" D, L/ `5 t. C7 I9 |# m. z
  7.         u16 cnt=0;$ K" [& G  a' P0 z/ b
  8.        
    ( g) r" v8 S( H; X9 G5 q
  9.     res = f_opendir(&dir, path);    8 w4 a9 i% c$ C
  10.         if (res == FR_OK) ) v3 M. O# }7 C4 y' l
  11.         {
    : Q# H; O" R6 t6 f! T& J7 ], R
  12.                 f_closedir(&dir);3 i: X  u3 y- \& C; V) Z1 y7 W5 ^" \
  13.                 return FR_OK;3 K! R% h5 K9 \! v0 s* C' z3 a
  14.         }$ N* ]( c! w& C5 D* j& `* C
  15.         else3 Y: c: N( Q9 i6 |' l+ S7 @
  16.         {
    5 j. U+ H3 Y/ z* w
  17.                 pbuf=mymalloc(SRAMIN,200);
    1 B4 }  C0 x& Y
  18.                 if(pbuf==NULL)
    * o: M  a; K1 M  b& L
  19.                         return FR_NOT_ENOUGH_CORE;               
    5 Y8 f0 O4 O6 ]
  20.                 while(*str !=0)3 f! q5 W' H) M4 s4 a
  21.                 {
    4 o2 ~) |5 }$ G) E8 w" l1 Y
  22.                         if(*str=='/')2 u  \, N$ \4 |- N* _7 b3 C
  23.                         {" Q1 o/ x( J0 x4 S4 O7 F
  24.                                 memset(pbuf,0x00,200);
    5 s; [( B# n* l9 j! W
  25.                                 memcpy(pbuf,path,cnt);: Y3 R" k' _+ `' Z  V- a
  26.                                 printf("%s\r\n",pbuf);* }8 H8 m: `: h4 p/ N

  27. " n' I% L7 ?: r4 ^8 R
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH). Y% G' U5 Z. j
  29.                                         f_mkdir(pbuf);8 |2 q; O* Y7 }  Z) n) g
  30.                                 else
    $ P. a# Q& L, H# H
  31.                                         f_closedir(&dir);        . _/ j; E8 `" w& d3 ?
  32.                         }
    7 h: i. ]6 i" t1 S! a
  33.                         9 o+ Z: a2 Z8 q! }% R. r6 a
  34.                         cnt++;9 |' \  g+ |* j" q
  35.                         7 @. @0 X# w& L3 F
  36.                         str++;$ k$ _* T" S6 K* f+ {8 K  D& N
  37.                 }
    2 a; r7 B7 b7 L' i: n& p
  38.                 myfree(SRAMIN,pbuf); 2 k* t, Q+ t1 l1 s1 l# b
  39.                 res = f_mkdir(path);//创建最后一级目录
    5 U7 ?) x9 k8 _$ }
  40.                
    - ]1 ~$ k  B1 z9 Y1 x
  41.         }& X& H% d+ C# N" \& Z
  42.         return res;) P) S0 I3 e! I. C+ u& c  _+ f' u
  43. }- Q0 p( ?+ o7 T  N5 \7 a  c# ?0 l: k
复制代码
调用方法:+ J8 r% l: O1 u1 `1 m/ j% z
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
    / ]5 b, b1 x$ |
复制代码

; `; H0 c* p2 a3 ?( D/ ~" a- u  N. X
- y5 ?* v- F- t4 B0 J0 l) m( ]& {. q# R5 a# a- L7 O
5 `$ t/ c7 U- e4 U, L# c
赞 收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】  ]! Z' W# }8 `, }& }: s$ ~
#include <stdlib.h>$ A$ x# I" I# \3 \
#define LRC_TABLE_MAX 100                          
3 U) f, y  g. a/ h: jstatic uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间. ~9 s$ @7 t* ^& X
static char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本
4 y2 p1 _$ r# \  P* l, }static uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值
3 ?3 N. m; Z4 m/*****************************************************************************\7 _& @3 h# M+ |6 ]2 V
函数功能:歌词解析
/ Y, e/ L" G* |4 a! M- X) K! T 形参说明:_cpLrcPath 歌词路径
% f5 Z5 k' N4 f0 F- @+ a 返 回 值:0 - 成功 / 1 - 失败
( q) C: a" V- Q/ ^  z\*****************************************************************************/
4 u$ {1 ?/ o6 K$ X0 l$ Hu8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
+ `1 l  Y9 h3 j. {" G8 S& P% y# g{2 ], L; O+ x9 d2 {2 O. P
    //变量定义3 L. K9 b6 i: d7 ?  v0 b8 J
    FIL fp;          //文件指针8 V* w8 }9 P. i) r
    FRESULT res;     //文件系统返回值
/ z+ M! d$ S# }    UINT br;         //成功读取的字节数1 `1 \2 x' _% [8 c! F/ z
4 r! V' W& c6 D3 Z" }$ M# S7 y
    uint16_t usTime = 0;    //用于临时存放转换计算后的时间$ F7 E  I! W. w
    uint32_t ulFileSize;    //歌词文件总大小8 I" i% S5 ~1 q
    uint32_t i = 0, j = 0;  //临时变量
5 h; G  |) `. c$ `: p" c; x, H    char *ptmp = NULL;      //歌词内容指针! |  c1 w1 R% d$ ?) x4 a
    char *pbuff = NULL;     //用于存放所有歌词内容5 S' P& q& b' `: h

5 s* E- H- [9 A: S( Q    //打开文件# P0 M" p, ~: V
    res = f_open(&fp, _cpLrcPath, FA_READ);7 F5 h5 y+ {( k3 b+ d/ C
    if (res == FR_OK)0 o. ~  b5 A+ g7 P! J. D
    {/ J+ f# l! L8 r- U
        //计算文件大小% Q' o6 w6 m$ q  v
        ulFileSize = f_size(&fp);
: y7 o2 `  _+ S. }% D) {- F, k        //申请空间
0 G1 h- d) D" R* c# o( G        pbuff = malloc(ulFileSize);
4 o  j, F3 K' [# ^. U& e0 j        if (pbuff != NULL)- f2 N5 S% P3 C2 F" J  g
        {
/ |% d/ Z# [" ?/ n; w) t) c4 v            //一次性将总缓冲区读满
, }8 L0 F+ Y0 c$ ]1 Q            res = f_read(&fp, pbuff, ulFileSize, &br);# R! c0 _; I" [; i& x
            if (res == FR_OK && br == ulFileSize)
, J9 U8 z: I" M8 w& I; R' n1 H            {7 f. U2 b/ ~  B0 W; s8 G* c7 v: E
                //找到歌词的起始位置: x' A2 t5 p: L, A9 ^+ @
                i = 0;
3 I* G1 D, G; @# w                ptmp = strstr(pbuff, "[");  / ^) }+ H* F, j
                while (ptmp[i] != '\0')     //遍历缓冲区中的信息3 ^; f% \2 B+ w# H
                {
& z/ c) k2 I( |# C  H+ b                    /**********************解析时间**********************/
/ z! {0 Z! b8 C7 I                    //[00:40.452]1 X% F& s9 w) P* B+ K% _
                    //[分:秒.毫秒]
& e+ k. ~( |& Y* B  l                    usTime = 0;
2 O$ v0 c* _3 i8 ~" r3 `                    //计算该行歌词播放时间(秒),毫秒部分四舍五入
# M# \( u6 H! A( J3 r5 a                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)9 X6 q* E; j  B% q, K; ]' z* ?
                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)
% t! f# n$ D$ E2 w( N3 u( o                    i++;    // ':'
1 M9 M1 ~9 |% t$ V! Z                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)
2 a* H% R1 z- ]7 M' M# a                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)7 x. u  _9 |) d8 F. f/ B, b
                    i++;    // '.'
$ c1 [8 P! c9 j; N' j( s0 {                    if (ptmp[i++] >= 5)  usTime++;  F" E# D! A' z
                    //手动调整时间误差6 d3 E9 l( {3 `7 ^
                    if (usTime > 5) usTime -= (usTime / 10 + 1);) T$ D- B0 f3 D: f- O0 P
                    //保存时间) x1 e- P% [6 J& g
                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
0 @! ^4 ~2 t0 M/ c* ]                    printf("%02d:%02d ", usTime/60, usTime%60);( c1 F3 O4 @5 G+ l& R2 d9 F
' v" r, o6 F7 Y2 }+ h' ~
                    /**********************拷贝歌词**********************/8 k2 H" [8 [& P; W/ V1 d
                    j = 0;
! H2 T. k! c& I4 l. l: S* N                    //让指针偏移到歌词文本部分
  W; _- y+ Y! x% F7 c  v                    while (ptmp[i++] != ']');
/ T, S3 H  I" [- [) ^                    //拷贝歌词内容
$ F! J0 [9 E  m- H                    while (ptmp[i] != '\0' && ptmp[i] != '[')  ! B9 }% R6 {. ^! |6 J$ |
                    {
) b( l, c9 L, u                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];   
# @' ^9 n- r& H, n4 p                    }   
! x5 R) r# [  M; Z7 h  V; X1 Q                    //制作成字符串+ p6 M+ C) {! y, _: A5 n
                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
; ~: J( p; b! ]9 n" u5 j! u                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
2 f' D/ L  ?+ M9 V' G                    g_ucLrcTableIndex++;3 Q" p4 }9 }. U8 x4 T
                }* A5 r6 |+ G  H
            }2 ?! s  w& j. s; [4 s9 }
            free(pbuff);. m- h$ c8 Y) b3 D. |( @
        }    , c/ Q3 M+ k5 \( [. L
        f_close(&fp);
  n4 y5 n0 }" w& |  ]! s    }
) Z0 ~  X. s6 V    if (i != 0) return 0;( D5 P; ?+ Y; ]: g8 o# {
    else return 1;! s2 P) f! H+ Y) c
}/ A! |" X0 H9 N
% Q+ w  _7 X3 ~# F
sealoong 回答时间:2022-9-30 14:28:25
我爱你们
& V1 R5 ]" i% o( o8 F: V

所属标签

相似技术帖

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