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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47
* D/ R8 X" \2 _% J
分享一个STM32移植FAFTS文件系统遍历创建文件夹" l" q' A1 X+ D. k6 M
  1. FRESULT folder_create(char* path)
    2 C9 T% X  _: \2 [3 J+ T0 H
  2. {
    & G& h% {7 q/ [! ~
  3.     FRESULT res;
    , H/ q' f, L8 c  n
  4.     DIR dir;
    ; a( q+ Y# Y6 k& P! u9 ~
  5.         char *str = path;, K4 Q" h; J; g' q0 x3 G8 Q% K
  6.         char *pbuf;/ O: ^/ W" Z- W7 ~( E! x: @. n
  7.         u16 cnt=0;* V/ H7 m" S( d" Y: R5 Q3 K
  8.         6 q  A+ r7 ?3 z* ]" h
  9.     res = f_opendir(&dir, path);   
    2 A$ v: S  D0 ?' o7 `# o
  10.         if (res == FR_OK) / `. o. {( l* _  [8 L1 ^
  11.         {
    ! m0 ~( k8 L8 X: d/ m+ s8 M
  12.                 f_closedir(&dir);# ?. U3 X/ P: l. R& q5 Y6 j
  13.                 return FR_OK;
    2 W- T; G+ H6 \4 N/ Q/ c
  14.         }
    ! L' p2 q1 e$ h5 o5 X7 B
  15.         else
    ! M$ G7 e$ R: e# R5 M
  16.         {5 j# X: }1 m2 i( r& \5 H! k
  17.                 pbuf=mymalloc(SRAMIN,200); : [- c' _- ^9 D) Y8 l  }7 o
  18.                 if(pbuf==NULL)# d# e, v; T( _% l  E1 j! }* I
  19.                         return FR_NOT_ENOUGH_CORE;                0 n! h6 ^" }- T' F
  20.                 while(*str !=0)0 D" {1 z& j0 \  e' g) ?9 A# c9 V
  21.                 {
    / g4 H/ a: d) R( q( O
  22.                         if(*str=='/')
    4 n% A, h( R4 l! _4 \
  23.                         {! u& |7 z- @1 [& S2 Y6 H  W' l
  24.                                 memset(pbuf,0x00,200);
    7 R3 _$ j& M9 y, N3 A
  25.                                 memcpy(pbuf,path,cnt);
    : |, P0 c& K: k" j5 c
  26.                                 printf("%s\r\n",pbuf);1 N$ f+ e% R2 P/ k# n( N* w

  27. " _  ?. \9 j( X  ?, b
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)* D8 V) q5 c' L
  29.                                         f_mkdir(pbuf);' P  r' Y9 \: L" e
  30.                                 else: D, i  t; r. U4 b4 D
  31.                                         f_closedir(&dir);        9 }) o5 B# S: ]
  32.                         }
    % Z! i; [. X7 b1 N
  33.                         ) ~& x7 ]+ V0 Y1 a
  34.                         cnt++;. [9 ?1 |2 U  y& S% W5 ^- i
  35.                        
    - X  Y" J  }; w/ Y: c  g
  36.                         str++;
    4 W8 J1 W6 T0 ~$ g; B) X5 _5 S. R
  37.                 }8 j9 s0 k$ s# Q5 p/ {. i. s0 t
  38.                 myfree(SRAMIN,pbuf);
    ; v( g8 t" Z: N) x, k/ T" y
  39.                 res = f_mkdir(path);//创建最后一级目录
    . f' t9 f! m- S& ]: b8 v
  40.                   h" i6 ]" p$ Z/ T! U0 I8 c5 S6 A
  41.         }
    2 i) G8 R1 C; H: C! T
  42.         return res;
    / |% ~& f7 l  y1 X( T, b' E
  43. }4 q0 j5 @$ \+ S, t* a
复制代码
调用方法:4 E3 R* l' J5 Y( S% s
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
    " S3 l/ a5 P0 Z3 M# Q, l
复制代码

8 k, o: i* P. F
. r3 _* @9 J3 \
# z" e6 }" V: k0 m2 r* ^
5 |% _; y& @, I# k3 p
收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】4 N( O* {. H7 C6 s5 J
#include <stdlib.h>5 Q1 Q  h& }% B9 i4 j6 L
#define LRC_TABLE_MAX 100                          
5 l9 q+ y- n8 }static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间1 @( `8 [/ @' N" w2 F' A
static char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本
- Q3 u7 B2 H# W! e# j0 r  mstatic uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值9 Z8 P6 }5 P' l6 p/ c; q1 \. K
/*****************************************************************************\: {# d* I0 u7 y0 Z
函数功能:歌词解析& c4 F  s2 P8 v0 v$ o/ d
形参说明:_cpLrcPath 歌词路径& B" j0 w# ]( g3 j+ k( u+ U' N2 V
返 回 值:0 - 成功 / 1 - 失败0 z' w8 a( {' ?* q! a
\*****************************************************************************// F8 H& {* }! P: D+ a
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)7 G2 j+ q2 s3 \7 r5 }$ Q
{
; q9 u( o. p) {5 x    //变量定义" l' \1 W% S7 i4 Q) S+ d- b% j7 {6 h
    FIL fp;          //文件指针' z) F. A- z- j0 k
    FRESULT res;     //文件系统返回值
" v6 j) B" r" H1 M" x# K* {    UINT br;         //成功读取的字节数  v* t6 V* O7 y* d  ?

3 c: f. _$ ?. A- l; G+ k& `# P    uint16_t usTime = 0;    //用于临时存放转换计算后的时间
' m% ^3 \5 a- Q+ c    uint32_t ulFileSize;    //歌词文件总大小4 j5 T! H8 g- v2 {
    uint32_t i = 0, j = 0;  //临时变量
  @5 N& H8 Q4 @( S! z6 x    char *ptmp = NULL;      //歌词内容指针
4 O4 e! `  o. @0 y! z    char *pbuff = NULL;     //用于存放所有歌词内容
% K2 k$ {) q) f( {: s( \2 I- Y+ a& ?# s8 t* y/ k
    //打开文件5 X) `. F2 U8 V2 e. w0 H
    res = f_open(&fp, _cpLrcPath, FA_READ);
. `* |9 v( p* x0 z: _! j    if (res == FR_OK)0 I; b: @, B+ e. C" d7 p
    {
6 l% I/ [9 r7 I( m5 f$ S        //计算文件大小3 t) y, w" M  F! k* O; @
        ulFileSize = f_size(&fp);
/ r4 p/ Q, p" D" y& s7 M        //申请空间3 Z$ X: h6 g% S$ q3 R- Q
        pbuff = malloc(ulFileSize);
( f4 b; {2 D: I/ `1 U* ^: M        if (pbuff != NULL)9 z/ z. B/ O+ {! E
        {
4 f* v. J2 S1 J# F) x) \& U! m% V7 k            //一次性将总缓冲区读满
9 v+ ]' h6 O+ X% h            res = f_read(&fp, pbuff, ulFileSize, &br);
" H/ l) B. u4 [3 U            if (res == FR_OK && br == ulFileSize)
0 ]$ d, k; `$ P! J! h            {
& S# r7 v1 q) Q5 Z) h                //找到歌词的起始位置: R' y3 r9 G* a. J2 `, I
                i = 0;% q5 h6 q3 F" {' x
                ptmp = strstr(pbuff, "[");  2 T6 Q% g7 l4 [4 z1 w
                while (ptmp[i] != '\0')     //遍历缓冲区中的信息
0 ]. z: q4 {* V# q4 f. u                {+ K& h9 @" B+ n
                    /**********************解析时间**********************/
( ~5 \4 D9 ^' U5 q7 j' R9 K                    //[00:40.452]: c, M; w: @# O/ p. ]
                    //[分:秒.毫秒]1 U; Q0 X- T( y8 I3 Z, E
                    usTime = 0;
' c) X& n! @  q' v5 s5 \7 g                    //计算该行歌词播放时间(秒),毫秒部分四舍五入
. _9 M6 ?7 A5 u( W                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)
: z; n" T  Z9 y$ a3 X                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)7 h( u. O6 L0 S2 g7 O
                    i++;    // ':'/ A0 v) i! ^8 g1 ]6 f" M
                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)& i! a! v9 w" T0 a
                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)  h" X( ?9 ^" g
                    i++;    // '.'
9 v9 n- W% k, B: Y; B- s* A: f                    if (ptmp[i++] >= 5)  usTime++;" E+ l8 w* C+ l% z! b" \9 w+ x
                    //手动调整时间误差# Z# D. x2 n8 t0 q) b6 y
                    if (usTime > 5) usTime -= (usTime / 10 + 1);
8 Y" `2 u7 {4 v4 M4 Q                    //保存时间
, a) G' `8 a# e! w: }/ i                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
, R/ P# V& \+ l" \+ n( U' k                    printf("%02d:%02d ", usTime/60, usTime%60);
  @9 l1 q& X6 c8 |& q4 j: E8 n! i" T6 I( V! i1 c) U- k0 w
                    /**********************拷贝歌词**********************/
# P0 n4 A* y: B1 I) t                    j = 0;$ q4 g: t. J; d6 d$ S
                    //让指针偏移到歌词文本部分
& a! m; G6 b5 c2 I/ R* D! a                    while (ptmp[i++] != ']'); 8 F- D3 f. {- y; S, {, X
                    //拷贝歌词内容
- V1 |  f! ?& G                    while (ptmp[i] != '\0' && ptmp[i] != '[')  
/ z: g  A" ?: Z. q6 F' h. Y# ~4 ?                    {/ e0 M! v. K5 j- U5 k
                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];   
2 L7 H) c: M1 Q                    }    . j+ K. R; u- ~, x3 R' z! Q' W$ i! [
                    //制作成字符串
. j$ p: Y7 F! \) x3 M( W                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';$ ]2 t6 @8 Y9 V. q, \# B
                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
8 Z- Q" y6 g4 D( H9 P; t                    g_ucLrcTableIndex++;
: u1 P# w; s7 O                }# r2 X! v% b; ~8 E/ \
            }
) V% b3 x2 s8 V5 j" }: U            free(pbuff);
  u* p$ k' O+ |! X" m1 g: j+ X        }    + \& @3 A+ M5 _) Q% |6 s8 L% d
        f_close(&fp);4 B! g' P! b2 w: U8 B  T8 ~
    }
) w& g* ~: a5 x( c    if (i != 0) return 0;
" Q  i5 D5 E( N$ b    else return 1;6 i8 C6 \' b& I% S4 D; a' ^% F2 v& k
}
) f4 g5 Z2 j! w  g# a/ b0 \
( ~, l( d$ t/ W7 E" \# E
sealoong 回答时间:2022-9-30 14:28:25
我爱你们
- Z" Q- e5 r4 k% S
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版