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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47
) _# O' d6 d5 E4 X0 l1 w
分享一个STM32移植FAFTS文件系统遍历创建文件夹, d) K7 H7 u  B2 z5 h: _# a
  1. FRESULT folder_create(char* path)
    ) e; R; K( B" e2 K# o* M
  2. {% s- w0 Z9 F6 D& X1 j. j8 K$ v
  3.     FRESULT res;
    & s* S! x) O/ S: u
  4.     DIR dir;6 t/ w* h+ J) D* l$ G8 G6 A
  5.         char *str = path;8 A! Q. J1 S; i
  6.         char *pbuf;
    ' B' m+ o* R" x% c/ I
  7.         u16 cnt=0;' Q7 l5 ?( I8 g
  8.         9 _1 q# x* C9 I$ s+ U$ m4 x
  9.     res = f_opendir(&dir, path);    3 B" W! L) ~! t5 P) I0 o( J
  10.         if (res == FR_OK)
    4 t1 f6 G4 H) F* E8 R# Q
  11.         {
    : Q( w3 q4 \' I2 z; S  _# |; ]9 f
  12.                 f_closedir(&dir);6 B) @1 ~+ |: ]5 b( g& r3 f) v
  13.                 return FR_OK;7 i( Y8 q9 n6 |3 c# e* k
  14.         }8 N! B' Y6 l' ]4 l7 O3 C
  15.         else
    0 @* w7 Q6 A0 I  w
  16.         {; B6 A3 Z6 L  B6 R9 V  F, h2 P3 o
  17.                 pbuf=mymalloc(SRAMIN,200); , `; [* c4 f7 |
  18.                 if(pbuf==NULL)( j2 A+ {. w! X+ t5 ?% D
  19.                         return FR_NOT_ENOUGH_CORE;               
    9 l" M& Z' h1 o, J1 `9 E
  20.                 while(*str !=0)
    + e* O. ]0 w6 d5 X' Y4 k
  21.                 {
    * j3 {- o6 a) X6 s
  22.                         if(*str=='/')6 y% |; l5 j( b
  23.                         {6 l$ c. i* C1 Y9 e2 n) O
  24.                                 memset(pbuf,0x00,200);# t  u' H) W$ x9 U
  25.                                 memcpy(pbuf,path,cnt);6 ~1 b0 y. Y  P  Q) @! i/ k
  26.                                 printf("%s\r\n",pbuf);
    $ D0 Q* b7 I1 X3 D

  27. # A& l% y3 C( s3 O4 s* t
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)4 h3 U6 n  f7 f3 E3 \6 M( W, n+ c
  29.                                         f_mkdir(pbuf);
    % k; s6 J( n% L( A+ T1 s
  30.                                 else) ~& r5 m: n# U/ I: u
  31.                                         f_closedir(&dir);        8 t- v# j& b+ s, w
  32.                         }
    / \& e' m& T! A$ c( W0 X  f
  33.                        
    " a# ~# n- ?4 I4 g
  34.                         cnt++;- n$ w% ?) t. o8 Q3 |- U3 b5 R
  35.                        
    7 U2 ~9 C7 q( o5 Q) ^
  36.                         str++;
    . s4 Y9 ^. t; Q+ K0 k9 \+ I* ]
  37.                 }# h1 I4 i- v) D2 E  t! `4 \
  38.                 myfree(SRAMIN,pbuf);
    + w) [+ C. A  ~( H# p
  39.                 res = f_mkdir(path);//创建最后一级目录) y# ?/ }/ {( p) K
  40.                 9 M+ f/ Y/ ]. m& I! Z7 \! h
  41.         }
    & H- v$ X: Q0 U: z; @; t# v
  42.         return res;
    " S+ R3 j9 p7 Y0 c, Q8 {5 H
  43. }
    5 [; ?! V! B1 v; [
复制代码
调用方法:9 r6 X' l. Z: c# k
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
    + k* c7 p' S9 I5 K2 J" V% P- X
复制代码
& e3 @$ a# f9 p+ A; q
% l+ x: ?0 J/ H

1 d+ z* H2 n- t6 M* f" P: x+ U: x& b& U  O* c0 j+ U" ]2 X6 `$ R+ ?
赞 收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】
" F% z# K6 c  T8 q#include <stdlib.h>
  m& p( A5 d; ^6 V+ J- a6 P8 }; ~7 _#define LRC_TABLE_MAX 100                          
# {1 c( s, a7 kstatic uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间% C5 P+ m4 T* e
static char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本9 f; _* Q! p$ e. }3 i
static uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值& q/ u9 b" p$ }& j
/*****************************************************************************\
( }5 K' r4 M$ ~! k 函数功能:歌词解析
1 n, g8 V5 }7 j- B0 _# k/ d+ L. L 形参说明:_cpLrcPath 歌词路径1 G8 E7 U( L! L5 H( A8 L9 }7 s+ K
返 回 值:0 - 成功 / 1 - 失败3 o# E; Y# D! P' D: I* C& x8 O0 k
\*****************************************************************************/
6 H% y7 |* X! mu8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
1 O8 ]$ L6 w! |5 J; v8 E{
) L/ V% i/ [; H) w    //变量定义" z1 L3 O$ ?2 X9 z& I
    FIL fp;          //文件指针3 r2 s( }8 K6 j% d9 K/ H; F( i
    FRESULT res;     //文件系统返回值
8 v& K$ Q5 T& K( h    UINT br;         //成功读取的字节数
5 G+ p( a; ^  W. z$ \
+ \5 f& Y. q) D- f4 m    uint16_t usTime = 0;    //用于临时存放转换计算后的时间
9 h. G. [7 ~5 v* P+ Z    uint32_t ulFileSize;    //歌词文件总大小
' o% u* r; i7 w. G. p& `' t7 Y    uint32_t i = 0, j = 0;  //临时变量6 H+ M7 v* ]8 W5 A
    char *ptmp = NULL;      //歌词内容指针: w5 p/ K0 ?* S  p+ ?* C
    char *pbuff = NULL;     //用于存放所有歌词内容) d5 B. r8 U9 L) v# i! ^

# w, b; @8 x5 S, o2 I5 {% @    //打开文件& N9 X6 `( [8 j: t9 g3 W8 s
    res = f_open(&fp, _cpLrcPath, FA_READ);
8 b7 p8 `# q! ?0 P    if (res == FR_OK)
6 d. D: i  f; i+ y7 ~    {
, T7 s! l" ^6 k" Y+ G        //计算文件大小5 ]+ d' x: z' t0 r! A; Y
        ulFileSize = f_size(&fp);6 `' y, P: @$ f' h; Q
        //申请空间
# M5 h% |/ b* Y! ~, P7 [' W( V        pbuff = malloc(ulFileSize);* A# H  o0 X3 o. R/ ~
        if (pbuff != NULL)6 ^8 c) C0 l! ~5 X4 m2 I5 V7 j) O( Y6 G% V
        {( }2 E8 `8 R- E+ f8 e! \9 G
            //一次性将总缓冲区读满
9 L- k) b3 w9 j! T            res = f_read(&fp, pbuff, ulFileSize, &br);5 }5 |: E& S+ [/ q& ?' Z
            if (res == FR_OK && br == ulFileSize)
9 i5 C- q! K& B& r            {/ Y, g* ~% {( w& ^4 P1 k, w
                //找到歌词的起始位置
" h, Q% L6 d( B  x, p, X/ N                i = 0;
- f/ u1 N& F8 Z/ A& m                ptmp = strstr(pbuff, "[");  
" Q, L+ H# v: C                while (ptmp[i] != '\0')     //遍历缓冲区中的信息
! U/ c1 @/ s0 B% @$ B8 V                {
% Z) p4 g+ W0 ?0 S* O                    /**********************解析时间**********************/
2 q$ l  @* f- v                    //[00:40.452]
' X8 J: p9 y7 ?2 q8 v                    //[分:秒.毫秒]. R" C. L" `5 d& g
                    usTime = 0;
- [. v" R6 T3 h/ h" c4 Z  C                    //计算该行歌词播放时间(秒),毫秒部分四舍五入# ?- q* \# u% M6 q: l$ y* N
                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)
) ?6 j, y' K4 E8 r; F3 O7 Y                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)' b* f/ @* v  g5 x* ]
                    i++;    // ':'
/ S5 g! k+ ^( \                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)- r) u9 a" W. `4 A! o/ H3 j" p
                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)/ K& _" @9 z6 K; I4 D* Z6 k
                    i++;    // '.'3 z, |# V) |! A* O
                    if (ptmp[i++] >= 5)  usTime++;
, `" z1 M- X% Z9 {# }# ?                    //手动调整时间误差
) E) ?. X0 k9 L) z- C8 ^* _" L                    if (usTime > 5) usTime -= (usTime / 10 + 1);
* Q3 ?1 T8 E* D) ]8 o1 b7 A$ [                    //保存时间7 A) n% C7 p$ D" D
                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;/ L) _" h5 v$ U2 N/ d9 z
                    printf("%02d:%02d ", usTime/60, usTime%60);1 B. O+ s) o$ H. Z) N8 Y5 j" w0 v

8 m- c: {% F3 I' E                    /**********************拷贝歌词**********************/
' x  k) k9 [  {                    j = 0;' T! x& m$ g1 o* {. `
                    //让指针偏移到歌词文本部分 ) Q2 i" ^5 |4 B! d( G+ i5 X
                    while (ptmp[i++] != ']');
5 n  C/ n* g2 Z# s! s                    //拷贝歌词内容
; m3 [; k  i0 S0 [- ^' X4 s                    while (ptmp[i] != '\0' && ptmp[i] != '[')  
; I; l0 p# M; z! C                    {
) g2 c" l9 a2 N" }                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];    0 T: d# N: x+ b3 _. x1 ~& A  b
                    }   
  g  d, T5 a9 C6 P                    //制作成字符串
- B0 u- g$ R) T6 ~* b+ K                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';7 ?6 W6 q- O- n1 C4 F& F* ~
                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
5 Y! f2 G" k2 p' u' L* W                    g_ucLrcTableIndex++;
; i/ P" w" z. d" a* y  R                }
/ |& G6 @( Q! O; P7 d' L            }2 U$ f" Q( V. E. c$ v: T
            free(pbuff);
. f1 R' \5 y) }1 r7 p  c        }    + z" U2 C7 }* b( k" Z
        f_close(&fp);: q+ c9 }$ T' Q9 v5 r8 m- f4 x
    }
7 E+ a( D( V' {1 @2 c    if (i != 0) return 0;
; U; S" W( n. |. e$ Q. x! d6 Q    else return 1;
! f0 T* W# m; I, h# P( V}9 C  A. i2 }8 P( G/ y2 ~# L+ j

3 P- C1 v9 W6 G* `5 ]4 B
sealoong 回答时间:2022-9-30 14:28:25
我爱你们% @. A' \' z1 K3 C; s2 P0 K4 `

所属标签

相似技术帖

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