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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47
' C* ^% f4 {% E4 s8 w& G
分享一个STM32移植FAFTS文件系统遍历创建文件夹4 K! D& |+ m; I+ B4 ^- N& _
  1. FRESULT folder_create(char* path)2 v& W7 R' X9 X3 x$ X  h; R
  2. {
    8 R. z8 Z5 E  ^/ ^9 A$ `6 O- j
  3.     FRESULT res;9 @; H  _/ d, F$ @* Y: l& h
  4.     DIR dir;* v6 F# [! S5 @& M1 r
  5.         char *str = path;
    5 Q/ T0 w  I' x, ^, Y
  6.         char *pbuf;0 v! P1 y; u% G8 [; h
  7.         u16 cnt=0;
    $ b* {' m, x' O% A
  8.        
    # X  D: N* c' q% G0 k, ?, X
  9.     res = f_opendir(&dir, path);    3 M3 c% o! l! U$ I
  10.         if (res == FR_OK)
    ; C6 ^4 Y0 \2 s
  11.         {3 L! n) `" Z' N4 A
  12.                 f_closedir(&dir);
    . M" H) {# s0 `5 J
  13.                 return FR_OK;
    2 J2 E; f5 ]4 K: Y, m$ i
  14.         }
    4 Y7 n. m& z3 V
  15.         else
    4 w8 Q  F" v+ u0 _+ |& o
  16.         {
    , Z3 E( p' b) b: q1 i  k
  17.                 pbuf=mymalloc(SRAMIN,200); 8 s  i$ r; g- w- y3 s9 W/ D
  18.                 if(pbuf==NULL)& T+ J4 x# L/ F$ v
  19.                         return FR_NOT_ENOUGH_CORE;               
    : v1 {7 Z( V, I. U
  20.                 while(*str !=0)8 C4 g, _& m2 ^
  21.                 {4 Y  X$ K, t; ~, s. q
  22.                         if(*str=='/'), d( h8 i5 f9 H& W- |' h* I' g
  23.                         {
    2 {) v: X' b5 d7 ~3 }& r
  24.                                 memset(pbuf,0x00,200);& i& T% b2 q" F4 ]/ T. H! V1 W
  25.                                 memcpy(pbuf,path,cnt);
    % S1 _0 w, A2 `+ _
  26.                                 printf("%s\r\n",pbuf);) |- b5 g8 G1 ]$ D  K, R( J
  27. ( F; d7 r$ A5 y3 R. k! J3 A4 w
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)- M4 q. v* m( {' h
  29.                                         f_mkdir(pbuf);& l9 h, j- r" C7 u5 T* T
  30.                                 else* {, ]2 Q0 a, W+ f0 w
  31.                                         f_closedir(&dir);        ) f3 ?  I* p8 a: n. k) q8 F% D
  32.                         }
    ! D7 A5 S8 I/ y: Q" V4 l
  33.                        
    . O  P" w, d5 }7 g% \& w
  34.                         cnt++;( [: n0 R1 [8 D5 z5 `8 O! _7 z
  35.                           R/ o  U- a" N5 q9 O9 P
  36.                         str++;
    4 Z1 l$ c7 z) f6 v. {; _) r
  37.                 }
    4 u. C* @$ Y  ]- E! F
  38.                 myfree(SRAMIN,pbuf);
    ! V  e. y! J) R  U- H
  39.                 res = f_mkdir(path);//创建最后一级目录
    ' @  L0 z& G2 e, h4 z  O9 D
  40.                
    . H' w3 Z3 j( @' e% C5 m9 V# P
  41.         }
    ; F1 |/ |4 X5 D& K
  42.         return res;
    5 ~1 b" j5 F" Q# N& d" d; R, z7 c8 M9 m
  43. }
    9 G1 e, U, T% ?, @
复制代码
调用方法:  i1 ~0 e3 T+ T9 b+ X
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");9 Q, s; y5 c' E2 U* N
复制代码

2 j" [( \( @3 J# n! Q% F
0 y) g: S% L; b1 T) u
, @: v  f3 o: a1 I. n$ ]1 D9 G# U5 V; |' U& V! n1 l% |: R0 Z$ h
收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】5 D, k+ `7 }$ ?5 J$ }" u
#include <stdlib.h>% h1 v6 \; X: A6 o; M- ]& X/ q
#define LRC_TABLE_MAX 100                          
  K" P: U, E# R, Nstatic uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间
6 N" ?6 _$ ^  d* _& g; i$ P/ Hstatic char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本7 t" [5 f8 l$ f# ~3 P9 R8 N
static uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值
2 _$ @) n) q  R4 V7 c/*****************************************************************************\  x6 B* d9 m. W3 w' w' [9 U1 g
函数功能:歌词解析* B. G: q8 v+ N4 n  J6 z: I9 j
形参说明:_cpLrcPath 歌词路径% o; H# G* c: N# I
返 回 值:0 - 成功 / 1 - 失败& e( u. w" G! P: r
\*****************************************************************************/
* L* q7 f& b# E1 y2 f6 m6 fu8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)* Q7 c5 Q3 h- P# R4 M" w& T9 U
{
. P# k6 m; u& C- b8 q) {6 M    //变量定义
& q* M% g  p) y    FIL fp;          //文件指针; F+ z+ j8 ^6 D( N8 F, ]
    FRESULT res;     //文件系统返回值8 V# V, ^9 N6 `3 J0 b! [3 v
    UINT br;         //成功读取的字节数
2 }+ z: r6 b% o
7 ]% ^5 a. k6 h7 r6 W    uint16_t usTime = 0;    //用于临时存放转换计算后的时间6 v3 g/ ?1 W( j& g; B2 N& [# V0 U
    uint32_t ulFileSize;    //歌词文件总大小
5 N4 Y4 @! r" ~7 W& m* l+ W9 }    uint32_t i = 0, j = 0;  //临时变量
0 q( Z! U8 a1 M/ v- @    char *ptmp = NULL;      //歌词内容指针+ Q) F2 T, P% R% N& d% F
    char *pbuff = NULL;     //用于存放所有歌词内容
5 J" Z9 q) C) [: Q$ }
% B4 X. n& v( V+ m/ s9 E    //打开文件* x2 k. T/ d% a0 z" F3 ^
    res = f_open(&fp, _cpLrcPath, FA_READ);
+ E( H' \5 W9 k! e" E    if (res == FR_OK)
2 n% D, q. ?! t: p    {, F4 }4 }+ @' b; k
        //计算文件大小& L. M3 A' X( m8 U9 R1 S2 L
        ulFileSize = f_size(&fp);
6 [' k0 C& ~6 C0 m        //申请空间, z' w1 w, k) A. b6 w3 F* n0 |
        pbuff = malloc(ulFileSize);
/ Q" D6 U# N# @+ v3 X2 Y        if (pbuff != NULL)
; q  o# h1 a/ ]# A+ B/ p, |        {( l9 S' j' p6 k
            //一次性将总缓冲区读满
' @, ]/ x' |+ K7 l            res = f_read(&fp, pbuff, ulFileSize, &br);
$ L; u4 m2 m' j) ?5 J% i! Q7 r, m            if (res == FR_OK && br == ulFileSize)
, v0 n% B8 s7 s( O7 ]8 J            {
9 I% P+ i# \' O( ~2 V- G( J7 n                //找到歌词的起始位置+ [' n2 {! U# h1 A1 N; f
                i = 0;
' E0 U5 D4 d7 T4 Q/ F6 N                ptmp = strstr(pbuff, "[");  
/ }( I/ b5 t8 M0 A                while (ptmp[i] != '\0')     //遍历缓冲区中的信息' {. F, D# W, X. e  G
                {
/ J& a  @& ?; w8 e+ ?                    /**********************解析时间**********************/$ T. g& u  q, y* H; ?
                    //[00:40.452]
3 T$ d7 p, |$ F  x* F                    //[分:秒.毫秒]
0 S& M- [* R/ }                    usTime = 0;
0 M% ^5 v- \7 g. e5 [! n- t                    //计算该行歌词播放时间(秒),毫秒部分四舍五入
6 p0 A. R& |! `# _                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)
, N/ Z, k  G. G! k# W$ m5 e                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)
. q4 i& G  X* z* ^+ o- Z                    i++;    // ':', j& d. B7 _7 `) e
                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位): y8 F8 f9 [5 C" }- k7 c( d6 U" _
                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)
; H& l8 M) t  Y, u; n/ }                    i++;    // '.'
3 e2 o4 }0 u( u" W  b  d                    if (ptmp[i++] >= 5)  usTime++;2 d/ y/ W- {4 _" p( A5 U( X* ~. u  a0 o
                    //手动调整时间误差
/ L* L2 l: O, d. `% s                    if (usTime > 5) usTime -= (usTime / 10 + 1);$ a% T2 {7 J8 F$ x" ]/ w6 ?
                    //保存时间
- S' W0 S1 g3 O                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;# p) h2 ~2 @/ ?! E: q; f
                    printf("%02d:%02d ", usTime/60, usTime%60);
& i& y) E/ t. B! p. @
( P  N! z. M' c' W                    /**********************拷贝歌词**********************/% a$ t  u6 Q: d) J6 J
                    j = 0;0 i$ M! C* x) l
                    //让指针偏移到歌词文本部分
  S0 K, S$ }( A/ a                    while (ptmp[i++] != ']');
! e& z8 W. B3 H1 q9 S- m1 y                    //拷贝歌词内容
: N9 E0 q: g! a7 U& Q. ]                    while (ptmp[i] != '\0' && ptmp[i] != '[')  
* O! ^+ U  H* }6 j& \1 }                    {$ S$ T5 L4 D3 l7 b' t8 A7 W
                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];    ) N4 ?5 [  u& d/ d, I
                    }   
) z# N- Y: ^& C                    //制作成字符串& d- x9 _# D4 _1 q' _1 U7 h' C: o
                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
: Q6 C0 ^' o4 E; M" c                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);% c, c0 G; R! j7 B, Y0 O
                    g_ucLrcTableIndex++;
7 s0 ]# G5 G: T/ A. D                }
! g) l: z9 U7 l, u            }
% x' O8 K7 j+ E- w8 A2 E            free(pbuff);/ a! d( L$ d+ Q7 v0 q" U: }
        }    ' |1 u" M; R) K4 A
        f_close(&fp);
7 j2 b/ H  B/ u6 o& i    }! J! @$ z" v! N* d
    if (i != 0) return 0;& J9 N4 N1 s6 J8 U" ^
    else return 1;
& ?- Q- |0 B3 e% F" j$ S6 J  {- @) N}0 n8 \$ W3 X) h& G6 a# Y

9 S, b8 ~' j) z* ^
sealoong 回答时间:2022-9-30 14:28:25
我爱你们+ m2 h5 B5 T9 K2 B8 k4 E. R

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版