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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47
/ E/ @5 L7 F8 A& V- l
分享一个STM32移植FAFTS文件系统遍历创建文件夹
) \. m, d# n' Y+ E) J2 h, u) ~
  1. FRESULT folder_create(char* path)
    7 s7 J; @/ Q: x8 e- S! L
  2. {
    + g& C: n2 @$ t. m6 A
  3.     FRESULT res;" K7 c5 ]. q# Z6 i6 i
  4.     DIR dir;
    ) t3 e6 y& D& c* ?. ]
  5.         char *str = path;% G. u: U6 s8 f/ I$ O2 ^
  6.         char *pbuf;# X& q/ ?$ M0 s; L& }$ ~
  7.         u16 cnt=0;
      g' Y) |8 a; {6 {* ?
  8.         ) @! _: e' i! i) h
  9.     res = f_opendir(&dir, path);   
    . T, L( p- X, d9 m7 A
  10.         if (res == FR_OK)
    6 l6 e$ [/ M6 ]! h8 o3 {
  11.         {  k: c7 o5 T9 J
  12.                 f_closedir(&dir);
    ' Z% S/ M6 C' F1 w7 a
  13.                 return FR_OK;# z2 [, ~+ }$ Q3 y. m( T" I
  14.         }  v3 A( D$ }4 e+ W$ z3 p  ~1 r, y
  15.         else& I5 }3 y  g3 g, i6 S# K
  16.         {
    # \: m4 H8 c% h2 E3 \& w& i: P- O
  17.                 pbuf=mymalloc(SRAMIN,200); ; b: W7 |. k8 M9 m' y% f
  18.                 if(pbuf==NULL)- R) J; X/ i# G6 B
  19.                         return FR_NOT_ENOUGH_CORE;                ' g1 _5 Y  k2 \! V9 O: h
  20.                 while(*str !=0)+ g' M" l$ G6 L: [
  21.                 {
    0 n/ }7 P' k4 k& Z) G& T+ ~. z
  22.                         if(*str=='/')
    ' W5 E% O1 a9 [9 ~
  23.                         {
      f. J- H% P2 T3 F
  24.                                 memset(pbuf,0x00,200);% ~* }) e3 A; `$ ?9 N
  25.                                 memcpy(pbuf,path,cnt);, E+ @; M# z) L, p
  26.                                 printf("%s\r\n",pbuf);
    # q% J9 N, g5 d3 ^

  27. # j7 J$ ?7 J' ~, Q4 v
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)
    ( t: h2 Z7 z( W7 R+ w4 J
  29.                                         f_mkdir(pbuf);
    3 a. m5 ?, f' w, T. f* Y6 ]
  30.                                 else
    ' g; _8 t4 O8 L& q! h6 y3 X5 Y0 n
  31.                                         f_closedir(&dir);       
    ; B  t! M5 t2 v$ v9 B" d3 s( n, q# e
  32.                         }
    ) S1 c$ i3 O3 e5 i
  33.                        
    7 ?: E7 t* D+ v5 D7 X4 n
  34.                         cnt++;. ^0 S6 `) Z- F( F
  35.                        
    ) s, ~) r" y: `: e! T$ H- N
  36.                         str++;8 r; S( |2 k+ U: q- M/ f
  37.                 }
    1 N# y  R1 b$ g# a/ O
  38.                 myfree(SRAMIN,pbuf);
    ! Y) z  ]1 c& `6 ?
  39.                 res = f_mkdir(path);//创建最后一级目录  G2 T+ n* R6 q1 \/ E1 i
  40.                
    ; ?6 u. Y: _, l# x( s8 P, }
  41.         }3 v6 ]7 o) ^' h  N5 q1 B7 k3 M: z
  42.         return res;
    5 u; C- a1 S6 U6 w0 m% t
  43. }
    # g5 |& E) S1 S
复制代码
调用方法:
2 t7 Y, G/ @5 w' G+ ~
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
    6 X# ~; n8 ?0 u- W) n
复制代码

8 _9 x0 C' Z. x. I7 s
& D: \7 v; I: D- d4 @" t. i
5 K2 ^0 K: W$ K1 u7 `' O4 g2 S) C, w& }/ v. Y+ e7 z. ?4 ]% K
收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】
; ]& Q1 F) `2 a: A#include <stdlib.h>9 t% I+ M7 r& v5 w' H+ _
#define LRC_TABLE_MAX 100                          
0 F, A1 F* \4 n$ n1 h4 cstatic uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间
, q6 k: U% x1 Nstatic char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本/ P6 m2 O# X+ F$ x9 {
static uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值
* D! P& t1 Q9 R# o% V  R/*****************************************************************************\( [, y7 v* z% i/ z9 _+ e
函数功能:歌词解析( ?0 ?  y5 A/ _- a/ k' \5 x  ?
形参说明:_cpLrcPath 歌词路径5 P. }( p$ Q4 G: h0 a: B
返 回 值:0 - 成功 / 1 - 失败
/ I& L. T) e  y\*****************************************************************************// Y! ]+ [3 [) k
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)% r& t* o- V: n9 ?0 t, \
{
# T+ c. W# i4 l3 h# u8 h; B7 K; c    //变量定义( F% m3 Z/ x3 a  Z; r8 ?
    FIL fp;          //文件指针
$ P, M& D- U$ G6 b- \    FRESULT res;     //文件系统返回值! M2 |' F, _3 d& A* `7 B1 {+ h
    UINT br;         //成功读取的字节数$ i! l0 R. \. a5 k% P; [

, |! h& O9 ]& n6 F    uint16_t usTime = 0;    //用于临时存放转换计算后的时间
# s7 V) i" l" {" z    uint32_t ulFileSize;    //歌词文件总大小; V. z! ?0 l0 ]. P7 I; a/ F; Q
    uint32_t i = 0, j = 0;  //临时变量
* T/ t& i4 r& r$ @2 P    char *ptmp = NULL;      //歌词内容指针
8 |- R2 I) A1 X2 ^" Q9 k& ]+ o* T    char *pbuff = NULL;     //用于存放所有歌词内容, S% F' Z9 ?. `0 S

* @8 u6 g% ?  J- w+ U$ o    //打开文件
. u5 M# s' s/ o1 ]4 l5 `2 A    res = f_open(&fp, _cpLrcPath, FA_READ);6 ^" i# _; L% d/ a7 W: c
    if (res == FR_OK), X7 w. e. X. F0 o% k* J3 X$ w  v
    {
" J9 m  ~! @; A) t$ d        //计算文件大小8 S7 W( X) U1 a8 \
        ulFileSize = f_size(&fp);$ H9 H) f4 M6 ?! o
        //申请空间7 h4 }7 D% W" }4 X
        pbuff = malloc(ulFileSize);
0 f1 _, }0 H+ H' K1 S: V        if (pbuff != NULL). D+ J" s% W0 n% B2 Z
        {) f* U+ }3 [2 j( i1 S( X
            //一次性将总缓冲区读满8 v4 k) a' `4 C1 z7 |0 @
            res = f_read(&fp, pbuff, ulFileSize, &br);
2 `# O# S, Y  z+ T# @            if (res == FR_OK && br == ulFileSize)- }0 i' K2 I* q) g9 P; a
            {) l  t0 J' W+ f& c9 {1 W+ p# Q' g
                //找到歌词的起始位置
  F4 ?! ]* x$ K( a                i = 0;" Z) X1 h2 _; m1 o1 r
                ptmp = strstr(pbuff, "[");  
4 g# w2 W1 V0 |; m: l# C                while (ptmp[i] != '\0')     //遍历缓冲区中的信息
( Q- b; i1 J$ s4 f$ Y                {
- j2 z" B% N! c, I. p) x                    /**********************解析时间**********************/2 U& d- }' v3 v( y+ c
                    //[00:40.452]4 G) r" r% ^9 D! x1 y
                    //[分:秒.毫秒]
' d# L; y! v  }3 G                    usTime = 0;
8 I3 M( I7 l8 I2 s" a( L                    //计算该行歌词播放时间(秒),毫秒部分四舍五入
0 X( K8 Q' j! m6 W- E                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)
& ^' }* w8 N+ n                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)0 L7 }/ g5 P7 D3 @) M  o6 m! i& V9 I$ G
                    i++;    // ':'
4 e) U; I2 |( I9 H                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)
$ {6 i) A2 ~$ K/ P                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)
2 L6 E( J* D0 }+ a" y                    i++;    // '.'7 z, E- S9 Q9 c  ?- ^
                    if (ptmp[i++] >= 5)  usTime++;
3 A5 B/ ?1 f4 x/ k; n) y: s6 n                    //手动调整时间误差
" w4 d- ]. D) {1 F1 L5 t. F% b                    if (usTime > 5) usTime -= (usTime / 10 + 1);
$ e; a: g5 F- L                    //保存时间
3 N% Y/ a% j/ c  o' B                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
4 J* V& {8 S0 C5 N7 {8 M                    printf("%02d:%02d ", usTime/60, usTime%60);8 r' h! p$ p& O4 O  h6 ?+ q
6 V6 w! T* R, S1 y
                    /**********************拷贝歌词**********************/
" }% ^5 E, U4 A! e8 K% J                    j = 0;2 L# \8 d6 F/ i+ z' M6 Y
                    //让指针偏移到歌词文本部分
1 q; y) g, ~9 Z$ y( v2 D: W- X                    while (ptmp[i++] != ']'); ' {) g  X5 Z# w& O0 i( L9 \
                    //拷贝歌词内容
% L! o; l. i4 m; c                    while (ptmp[i] != '\0' && ptmp[i] != '[')  
7 l! M& G, R8 n; c: v2 x8 L- i                    {
9 \# q+ W! |/ o# Z  O8 @                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];   
8 D9 S  @3 {5 y  ^                    }   
4 _, S3 ?) l8 {0 a7 c! e& u0 a                    //制作成字符串  H7 \) E3 u4 R: ?
                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
) D( }" w' V8 L+ Y                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);. ]! o  B$ T! }: k0 I% b
                    g_ucLrcTableIndex++;
& u/ A* a8 N6 M, M0 S6 ]                }
0 |8 V& x" w5 B- F' q            }3 S1 w& K6 }6 m$ ]
            free(pbuff);& _) W2 _2 B! t9 l' F0 H
        }   
( Y, S, s& P9 H8 T  G        f_close(&fp);
% z: m" q6 i/ f( ?% C    }
$ O. g/ p' A8 u) E& S5 Q1 Y- Q    if (i != 0) return 0;" M, h$ \" }2 e  z0 J+ v" Z
    else return 1;/ h( o: p9 l( \4 T% y
}8 {5 Y4 f9 a$ T& t* P

. |/ W' d* v& D" p7 d
sealoong 回答时间:2022-9-30 14:28:25
我爱你们
1 E- j6 p$ @1 l( ]' h9 z
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版