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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47
& r' V1 m4 b9 h: V; T* W
分享一个STM32移植FAFTS文件系统遍历创建文件夹$ k  u' c' T* t' J0 E: p: _
  1. FRESULT folder_create(char* path)! U2 O+ F" ]& h* U4 d7 k. r
  2. {
    3 W9 i  L( ^1 F4 K; t: Q
  3.     FRESULT res;5 j3 k( A: Q5 ]5 W% o- O9 H' z
  4.     DIR dir;# B# r: |9 ^0 r
  5.         char *str = path;
    9 D3 }1 U. x  r7 v/ X8 i. h
  6.         char *pbuf;7 K) e: J& ]9 n) |$ }8 f, h8 y: O
  7.         u16 cnt=0;! @, |' ?/ z' K; w& _
  8.        
    ) T9 V( ~, L. u' U7 x
  9.     res = f_opendir(&dir, path);    6 n2 t' G& V- ~. {: P- }7 y
  10.         if (res == FR_OK) 6 @8 L7 s7 z0 {
  11.         {
    ! \) Z/ I" h7 ^1 i  I7 t+ ?: s5 H1 z  m
  12.                 f_closedir(&dir);
    " Q: t7 _$ Y( p) C  P. k) X& U1 P
  13.                 return FR_OK;+ O  o* ]- J% r/ ?8 T
  14.         }2 k3 R# A8 A8 y0 m4 O7 J) E
  15.         else1 s* m8 L6 i$ `
  16.         {) _- x! u2 J' l3 [6 P- J# ]
  17.                 pbuf=mymalloc(SRAMIN,200);
    , I7 R* n) M: q! F" B! }
  18.                 if(pbuf==NULL)- u- m3 a$ V) Z) r
  19.                         return FR_NOT_ENOUGH_CORE;               
    + y& z- j+ U' [% B4 f
  20.                 while(*str !=0)
    / }5 ?! X0 ]! V8 z
  21.                 {# W2 v$ A* D+ v5 F* |
  22.                         if(*str=='/')! t. f1 w0 U6 s0 s' D# k8 G6 J5 g& n
  23.                         {
    # z" u5 ?  a, v# ~8 V3 @# \* ^7 k2 f
  24.                                 memset(pbuf,0x00,200);% I/ e/ Z0 N2 F
  25.                                 memcpy(pbuf,path,cnt);
    ( z2 `2 b9 A7 r5 ^. c) e
  26.                                 printf("%s\r\n",pbuf);8 ]' F: O- o& h7 K9 o4 A- z

  27. 1 P0 M2 ]( m1 @8 S) b
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)
    ) U5 w1 A0 s2 \9 Y
  29.                                         f_mkdir(pbuf);9 r$ y/ t( l* h
  30.                                 else
    % `2 x  @1 M: b
  31.                                         f_closedir(&dir);        $ x. G, v8 \4 P( N
  32.                         }9 x" `+ ^6 B5 L
  33.                        
    1 c) K4 L2 d) [# M: T
  34.                         cnt++;. T& u. S- ~: r2 c
  35.                        
    $ d( f" Z& k6 l
  36.                         str++;
    3 k- O/ i# k+ G
  37.                 }( S& x1 U' j  A7 C/ E# i) f+ r
  38.                 myfree(SRAMIN,pbuf);
    & h  h& R) x, ?  \
  39.                 res = f_mkdir(path);//创建最后一级目录* I5 C! U# S) U5 f% C, |
  40.                
    . J' U  L8 j2 r0 `
  41.         }( h8 m, ^! I: L7 o$ e
  42.         return res;
    ( C4 |2 M+ p6 e% S# u
  43. }
    7 B  R( J/ G+ W: r
复制代码
调用方法:' G; ?( W! P& N3 u
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");
    5 Q$ \) [2 M5 P) J" \
复制代码
7 K9 T8 a) G5 p+ v6 y5 d4 Y7 M% h

$ a! v8 Y" c8 s3 S; H$ \% M+ z1 m7 N8 t4 c: B

" i7 d. l" T+ ^. M
收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】: \* l8 B* k! ]+ |
#include <stdlib.h># N7 x) a8 g) }3 m& L
#define LRC_TABLE_MAX 100                          # G6 d6 f( U; E& ^% G( W
static uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间
+ C) ^) h  ^: Y- d5 L; {static char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本
- a/ d' l* c1 F/ }  xstatic uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值& L) G( ]3 x( G% n
/*****************************************************************************\
3 X- Z/ P4 Y% t* T 函数功能:歌词解析
& s# Z8 \0 [* ~- Y8 e6 S 形参说明:_cpLrcPath 歌词路径5 E" d: E7 b  g
返 回 值:0 - 成功 / 1 - 失败2 W0 b; E5 Z- A6 j# a. U: H( [
\*****************************************************************************/
# O& t  A1 V" w7 `: Ju8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)7 `4 x+ g0 r1 w* a& D% b4 j9 S
{
: J1 [3 y- a  Z% ?7 ~    //变量定义2 I% X7 J* U9 h8 P# I) ?
    FIL fp;          //文件指针% c$ `: X" \. R9 D
    FRESULT res;     //文件系统返回值
- z1 R; z# D  [! [# {2 L    UINT br;         //成功读取的字节数9 @& c2 K! D. F* P; g& K

! p/ \7 k$ ]. e" j2 T    uint16_t usTime = 0;    //用于临时存放转换计算后的时间
& A' O" H1 S, x4 t2 ]    uint32_t ulFileSize;    //歌词文件总大小
$ t6 S3 T, c  `' W6 H7 A/ z2 @    uint32_t i = 0, j = 0;  //临时变量
* D7 T, k' @" s4 \. t% \9 Q    char *ptmp = NULL;      //歌词内容指针
8 X3 f6 N8 T8 h$ R- ?' r- n1 F6 P    char *pbuff = NULL;     //用于存放所有歌词内容2 M, r; O. G6 T8 b
* }* z! S! W2 d3 G4 p) @. L
    //打开文件
0 a8 @3 ^, v9 O& F  I    res = f_open(&fp, _cpLrcPath, FA_READ);
* s; a6 g) c* V1 p$ L! m: `    if (res == FR_OK)
& {0 Z" p' E4 a2 m* d+ d" \7 E3 `5 P' L    {5 E( y0 a5 ?( g" \( u; S( R' S
        //计算文件大小; ~6 x9 D+ y0 M
        ulFileSize = f_size(&fp);% j+ m/ m: f' j  j) {% o
        //申请空间% t+ [0 }/ v2 N+ |$ c
        pbuff = malloc(ulFileSize);
! `5 u0 d; g9 A8 a        if (pbuff != NULL)
1 b* w; t2 z6 G, S        {+ a# B( C% F$ I; ]3 {3 m1 s
            //一次性将总缓冲区读满  ^$ a$ b+ }/ a6 ^2 [& Z
            res = f_read(&fp, pbuff, ulFileSize, &br);. D$ b- B+ ]4 }. o" q7 N5 H
            if (res == FR_OK && br == ulFileSize)
2 v' {; w0 |2 j# N! O            {
: Y5 L8 i& n( j                //找到歌词的起始位置
8 `3 L% o) @% {# N- R                i = 0;
& H# Q4 @3 x* f  [6 ~, X' T                ptmp = strstr(pbuff, "[");  : U9 C3 y# L+ v/ v
                while (ptmp[i] != '\0')     //遍历缓冲区中的信息
0 f9 m6 t  I2 h8 ?% u0 T                {% E0 x4 E+ \* p
                    /**********************解析时间**********************/4 j8 S+ _$ O" y1 Y3 w4 u
                    //[00:40.452]
+ @& M5 Q7 [; @) @" q- _                    //[分:秒.毫秒]
1 I  g; Z- Q6 }                    usTime = 0;4 F% S+ b+ Y: E, x: h$ a( b
                    //计算该行歌词播放时间(秒),毫秒部分四舍五入
/ S0 _& U2 u8 H3 S                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)  x2 n& G5 L- }  F' G
                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)
* p% M: A# G: h$ |6 b; L( v0 w                    i++;    // ':') @+ y8 f: D% j- i
                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)8 G% l6 v, K$ O+ p3 J( A. e
                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)
* b- P8 i: R" S" U                    i++;    // '.'
$ Q9 G+ v* g, O( e- i7 P5 M1 u  ]                    if (ptmp[i++] >= 5)  usTime++;
5 D" p% N, x% M" h                    //手动调整时间误差
# T/ _- m2 b+ R" f3 f6 E                    if (usTime > 5) usTime -= (usTime / 10 + 1);7 b$ B% @& O2 }$ W5 b7 w" l
                    //保存时间
* k4 `1 Y0 w6 W4 X/ z. L                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;
% d( X+ E+ ?7 I: |8 b* N6 E7 h                    printf("%02d:%02d ", usTime/60, usTime%60);8 a2 o' {5 t; t3 d; w

* x0 q+ b$ M* @% c, j5 D                    /**********************拷贝歌词**********************/( K3 g0 r3 y* o0 }; t# Y
                    j = 0;
8 Y0 m' l2 P+ Z$ C                    //让指针偏移到歌词文本部分
- |& c! ]# p  ]. w' D: H, `                    while (ptmp[i++] != ']');
! V+ ~! P  x; U+ k, P) X                    //拷贝歌词内容& G* a- N% I* J. W) ]8 {$ w5 o
                    while (ptmp[i] != '\0' && ptmp[i] != '[')  - M1 R2 A: \3 U& Z, p; R4 a/ P# |
                    {
5 _( C- B! {$ a, I& P9 k6 k) x                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];    - b+ l" o7 @' f/ k; ~0 N
                    }   
% U. T7 X2 c+ ~                    //制作成字符串
/ r& L1 @2 I2 {; T" G; y* J5 L                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
, \) C- ]9 ]! S, @- P7 f                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);
& F4 O, X. U- y; d. K                    g_ucLrcTableIndex++;
6 P1 N9 M' r) Y" U3 R                }
' N; s" v8 F7 M2 D' v3 K            }
& w6 j5 v2 |% \& T5 f. f            free(pbuff);
) h, r# ^, }0 P( _3 E        }    ) P) e3 ^7 h2 k/ x2 P
        f_close(&fp);
/ d; Q2 H# B  p+ Z0 l& h    }/ y% h2 ?) z2 S9 R- J3 m* g* n  }& D8 e& S
    if (i != 0) return 0;
9 d; O8 m0 C, z1 a    else return 1;
" I* i& l& p. B7 q/ l}
3 c& r7 r. o$ W. c0 p
7 k. U8 D2 G( ?, W. k
sealoong 回答时间:2022-9-30 14:28:25
我爱你们5 m0 @3 p* O" H
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版