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

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

[复制链接]
STMCU-管管 发布时间:2022-9-30 12:47

* ]8 z, i2 f. P; w" {7 i# H7 {+ l% `分享一个STM32移植FAFTS文件系统遍历创建文件夹7 P8 {/ Y) K' l( u
  1. FRESULT folder_create(char* path)2 J% }+ e- @$ C& b
  2. {
    # E1 R6 B& Z/ {; T' d
  3.     FRESULT res;
    0 Q. A# O. B. E" k. t
  4.     DIR dir;
    + d1 Q/ X' Z; H
  5.         char *str = path;
    ( B$ W0 L& g) {, r0 `1 b9 h
  6.         char *pbuf;2 I9 Q9 D" Q. f) {  F1 V9 |" j
  7.         u16 cnt=0;6 n( e+ z9 Q1 j6 H# A% V
  8.         ( T( Y* y% k2 _7 H2 s
  9.     res = f_opendir(&dir, path);    ! ^  d; k5 A0 b  x4 S& `
  10.         if (res == FR_OK)
      r7 X5 W- v2 ]! Q" q
  11.         {
    - c& }- B* X: D. J* z; p3 ^
  12.                 f_closedir(&dir);
    / ?) z$ _: `5 f3 i: c% b
  13.                 return FR_OK;$ A8 [( m4 h  P! `
  14.         }  K- x# N+ o4 }' r" u
  15.         else
    - i# K% e. x' S
  16.         {9 d3 Z- }( M2 X  g: g! s+ ]0 V) F
  17.                 pbuf=mymalloc(SRAMIN,200);
    & V( T4 Z0 k/ M& q0 |& Z
  18.                 if(pbuf==NULL)
    ! O4 B# f5 L, h9 a' ]3 I9 Q
  19.                         return FR_NOT_ENOUGH_CORE;               
    2 R8 Y: ]. u6 j/ Q2 j; C
  20.                 while(*str !=0); I0 S+ ?5 p1 k2 W
  21.                 {) w% l+ }* Y- O' [9 z
  22.                         if(*str=='/')
    / C7 q( B5 d# v" A
  23.                         {
    ( ~8 v/ N) R2 _, _- U; ^
  24.                                 memset(pbuf,0x00,200);* ~9 C. {% k' g2 D
  25.                                 memcpy(pbuf,path,cnt);
    " t5 {& E  l  E( E, y) T# t
  26.                                 printf("%s\r\n",pbuf);1 y/ h! j: e# Z' Y8 q* r
  27. / W: _+ T0 [2 \* m0 B
  28.                                 if(f_opendir(&dir, pbuf)==FR_NO_PATH)" Q) O. e1 Y% {0 k+ @
  29.                                         f_mkdir(pbuf);7 z$ a: `( _5 @- E
  30.                                 else
    - G2 \5 r; P' \9 f1 w4 v
  31.                                         f_closedir(&dir);        ! C5 x* m2 Z1 a0 b# q
  32.                         }
    + m% j+ d+ p' @
  33.                        
    4 z' A: {4 Q" C! m1 D2 R) A
  34.                         cnt++;
    6 x% A# D, q7 B  \
  35.                        
    5 \6 D& B  G+ P' |
  36.                         str++;0 g& \; A1 d. b" N5 D1 k8 [
  37.                 }  R' y  _5 Z% Q/ B
  38.                 myfree(SRAMIN,pbuf);
    , [6 @4 L  a% |5 d
  39.                 res = f_mkdir(path);//创建最后一级目录/ n; d1 g" k5 k& u1 Q. ^0 S5 h
  40.                
    . p7 H* _. T% Y6 q$ P  O
  41.         }
    + ^! l! Y; @. h& I# J0 e
  42.         return res;  a* \9 F: b( f
  43. }
    , u7 y4 w6 `7 J' k) @# R1 i
复制代码
调用方法:
3 ?8 m  d7 m; t/ K
  1. folder_create("0:/ccc/x1/x2/x3/x4/x5/x6/x7/x8");. A) a( c& q$ U
复制代码
& W/ f/ D" H$ z  u2 j# X7 B8 H5 I
+ e' Y% A7 ]; S! E! [

2 _" k: A4 ^: r, s! R! R/ M- ]9 O. b' O) V5 ?9 f- m' _
收藏 评论2 发布时间:2022-9-30 12:47

举报

2个回答
至暗时刻 回答时间:2022-9-30 13:30:33
【分享一个基于STM32+FatFs文件系统+Vs1053b制作音乐播放器---Lrc歌词解析】# u# r0 }, d% |5 Z
#include <stdlib.h>8 D5 v' u1 J! Y7 i* S
#define LRC_TABLE_MAX 100                          
: y2 W, J7 i) g$ a# Gstatic uint16_t g_usaLrcTimeTable[LRC_TABLE_MAX];  //记录歌词时间  ]5 I/ _1 ?' d# Q3 @
static char g_caLrcTextTable[LRC_TABLE_MAX][100];  //记录歌词文本0 W& C1 |& K: v! I
static uint8_t g_ucLrcTableIndex;                  //歌词"时间/文件表"的索引值
0 J8 g0 ]" F' D: `7 [/*****************************************************************************\
! @0 A6 \0 l5 B- ?8 Y& E 函数功能:歌词解析+ a# y2 B6 [! x# v+ n1 c; m/ n
形参说明:_cpLrcPath 歌词路径3 o1 U. h4 a: L
返 回 值:0 - 成功 / 1 - 失败6 b: B& i3 i( _" k$ ]% ^/ N
\*****************************************************************************/) H* ^" u% U& }" \8 Z+ [1 r! S
u8 VS1053B_Parse_MusicLrc(const char *_cpLrcPath)
4 ~/ l' b& ?5 @8 C  ]{
: ^# _4 q9 E6 d( _  [$ m2 R    //变量定义
6 M& [5 S1 m/ t- L/ C+ j- p    FIL fp;          //文件指针" b0 r9 N5 k9 f; p
    FRESULT res;     //文件系统返回值7 K9 O: w" N: }& j) B2 l
    UINT br;         //成功读取的字节数
/ N! k& s1 h1 ?; Z$ w5 t2 [8 d! k3 w" x1 w1 I( e
    uint16_t usTime = 0;    //用于临时存放转换计算后的时间% b3 N1 C. i; G1 @
    uint32_t ulFileSize;    //歌词文件总大小: g3 v! f' b$ C, y+ ]- U
    uint32_t i = 0, j = 0;  //临时变量  b# w- ]% @5 r( Q5 s( b" A% A# P; ~
    char *ptmp = NULL;      //歌词内容指针
7 Z% c( W/ i2 [1 N- P3 D3 |& X    char *pbuff = NULL;     //用于存放所有歌词内容
$ I. C8 P( t5 e1 w
/ B$ G& w( w. f    //打开文件, g( a0 Q& `( w  ?
    res = f_open(&fp, _cpLrcPath, FA_READ);# ^- [2 f8 ~0 h( o
    if (res == FR_OK)
! @1 u2 o# k$ h    {" a& B  x7 m  x! _: X3 a) ^$ u
        //计算文件大小% P8 j- q1 C2 z2 r0 E- J& d
        ulFileSize = f_size(&fp);) I/ x! v7 ^+ U0 l; L
        //申请空间) j- X5 n8 P! G" G, F+ w8 \
        pbuff = malloc(ulFileSize);$ N, n7 W2 H+ c0 E
        if (pbuff != NULL)
& E; q8 \; t4 f5 Q6 ?        {
  q9 T. L  F& m8 N. c/ T( P            //一次性将总缓冲区读满3 @7 {9 l; Y4 y2 \! n4 a8 ^
            res = f_read(&fp, pbuff, ulFileSize, &br);
5 }# R0 x! ]. j4 p4 S) v            if (res == FR_OK && br == ulFileSize)
  ~$ ^7 l7 a* i' p- e$ A- ^$ Z! u            {
# n4 |" j4 Z2 e, e                //找到歌词的起始位置
7 ?$ k( E/ M5 V% [$ Y6 O                i = 0;4 K( S1 ^; Y1 z8 @
                ptmp = strstr(pbuff, "[");  " b0 q  Z' ^& J4 ?/ K2 a
                while (ptmp[i] != '\0')     //遍历缓冲区中的信息
8 s* Q% V4 ?/ {                {
% W8 ^/ ?" {5 b% s4 w                    /**********************解析时间**********************/- A# f6 x  X3 w) \
                    //[00:40.452]
- e% T% m% `- W/ P+ J% i4 v& i$ F                    //[分:秒.毫秒]
; [! t" X+ t7 h$ W! x  a7 e1 _                    usTime = 0;5 P" q/ T2 z# q* C
                    //计算该行歌词播放时间(秒),毫秒部分四舍五入! h: ], e% q# R7 H; g# [
                    usTime += (ptmp[i++] - '0') * 60 * 10;  //分(十位)) Y  j! R( P$ s" r3 [6 H7 x
                    usTime += (ptmp[i++] - '0') * 60 * 1;   //分(个位)
0 e; u. v* H7 t                    i++;    // ':'* J/ k* x" }4 x, S" L# a: R: n& f
                    usTime += (ptmp[i++] - '0') * 10;   //秒(十位)
0 Z2 I* u( y# q5 h                    usTime += (ptmp[i++] - '0') * 1;    //秒(个位)& Q0 s, q' ?! f
                    i++;    // '.'
3 t* K# S/ E' X: A% f% L8 V5 y                    if (ptmp[i++] >= 5)  usTime++;  `6 J- x/ S/ V9 b$ o( k0 O" @+ j
                    //手动调整时间误差7 d/ O0 o" w$ ~' w$ p
                    if (usTime > 5) usTime -= (usTime / 10 + 1);; U* [9 _6 m' D1 l
                    //保存时间
4 I& ~/ x( F  W) o) b$ w                    g_usaLrcTimeTable[g_ucLrcTableIndex] = usTime;8 }5 x! U3 x1 F
                    printf("%02d:%02d ", usTime/60, usTime%60);
* [8 |4 n2 F  B- e. U  R) c* \$ p7 [8 y- d  v$ L
                    /**********************拷贝歌词**********************/
0 Q$ f" c, k& H  |                    j = 0;
2 R& M' z- `, K: h, T7 I                    //让指针偏移到歌词文本部分   o, G# Y' q. [9 n- c6 F3 t  M
                    while (ptmp[i++] != ']');
' n9 Y! Z  m- ^; h1 U, h( W1 ^                    //拷贝歌词内容$ w/ I9 b( n- n( G" a, r3 }" U  N7 _; L
                    while (ptmp[i] != '\0' && ptmp[i] != '[')  9 d9 r& s( o  S3 z7 n* D
                    {
) a: `' j2 o, `                        g_caLrcTextTable[g_ucLrcTableIndex][j++] = ptmp[i++];    2 S0 H7 y! ^) _4 w  e. w4 r
                    }    1 a3 ~+ K) X% X: X; A
                    //制作成字符串
- K( k; m7 i  C9 `9 N" O6 `# R4 Z                    g_caLrcTextTable[g_ucLrcTableIndex][j] = '\0';
/ @( I& u2 y, B3 q                    printf("%s\r\n", g_caLrcTextTable[g_ucLrcTableIndex]);  ]7 i* ?& z1 e. A/ Q* i* S
                    g_ucLrcTableIndex++;
. U/ Y- I1 U1 J, i7 }& u                }, b8 [- s# w* m+ s  f8 ?9 G
            }; t0 U& ^. {- C: [& l' C& @, S! C% O+ C
            free(pbuff);& }+ Y* E# a$ `) P( f7 \
        }   
9 m/ ]4 W# G0 k. ]. {        f_close(&fp);, v% Q# i. @7 P8 K
    }& x3 Q9 G4 _* I
    if (i != 0) return 0;
! J5 o; n8 U6 N/ x  T7 W    else return 1;; ^  X# @: b4 H( T! I/ }2 }0 B
}/ V% C7 N+ C% Y4 s8 [# @- G$ A9 M
* X6 r0 p% `2 p# o& V9 N2 a: r
sealoong 回答时间:2022-9-30 14:28:25
我爱你们
2 m$ a) `. O: @  y

所属标签

相似技术帖

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