func_fatfs_record.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. #include "main.h"
  21. #if USE_FATFS_RECORD==1
  22. /* Includes ------------------------------------------------------------------*/
  23. #include <stdint.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <stdbool.h>
  27. #include "func_fatfs.h"
  28. #include "dev_spi_sdcard.h"
  29. #include "func_spi_w25qxx.h"
  30. #include "func_fatfs_record.h"
  31. #include "func_queue_record.h"
  32. #include "Data_deal.h"
  33. /* Private includes ----------------------------------------------------------*/
  34. /* USER CODE BEGIN Includes */
  35. /* USER CODE END Includes */
  36. /* Private typedef -----------------------------------------------------------*/
  37. #define MAX_FILE_COUNT 20
  38. #define NUM_FILE_SET 10
  39. /* Private define ------------------------------------------------------------*/
  40. /* USER CODE BEGIN PD */
  41. /* USER CODE END PD */
  42. /* Private macro -------------------------------------------------------------*/
  43. /* USER CODE BEGIN PM */
  44. /* USER CODE END PM */
  45. /* Private variables ---------------------------------------------------------*/
  46. /* USER CODE BEGIN PV */
  47. /* USER CODE END PV */
  48. const char FILE_START[] = "20";
  49. const char FILE_END[] = ".TXT";
  50. const char FILE_FOLD[] = "JLRECORD";
  51. /* Private function prototypes -----------------------------------------------*/
  52. typedef struct fs_record_struct
  53. {
  54. int8_t fs_stat;
  55. const char *fold; //操作路径
  56. int8_t * path[32]; //操作路径
  57. int8_t name_new[32]; //最新的文件名
  58. int8_t name_send[32]; //最老的文件名
  59. FIL opt_file; //当前操作的文件
  60. FATFS fs;
  61. DIR dir; //操作的文件名
  62. uint32_t opt_len;
  63. uint32_t items_num;
  64. int8_t read_buf[512];
  65. uint32_t read_len;
  66. int8_t write_buf[512];
  67. uint32_t write_len;
  68. uint32_t file_num;
  69. int8_t file_list[MAX_FILE_COUNT][32];//保存文件名
  70. int8_t link_ok;
  71. uint32_t free_size;
  72. }fs_record_OBJ;
  73. fs_record_OBJ fs_record_obj = {
  74. .fs_stat = true,
  75. .fold = FILE_FOLD,
  76. .items_num= 0,
  77. .file_num = 0,
  78. .link_ok = false,
  79. };
  80. //add boly 20221020
  81. //uint8_t data_buf[16*1024] = {0};
  82. //end boly
  83. void func_record_Get_Capacity(void);
  84. void func_record_files_update(char * path);
  85. void func_record_dir_qsort(size_t fcount);
  86. extern SDateTime m_datetime;
  87. /* Private user code ---------------------------------------------------------*/
  88. uint8_t func_record_fatfs_isOK(void)
  89. {
  90. return fs_record_obj.fs_stat;
  91. }
  92. uint8_t func_record_fatfs_set_OK(uint8_t stat)
  93. {
  94. fs_record_obj.fs_stat = stat;
  95. return fs_record_obj.fs_stat;
  96. }
  97. void func_record_mk_fileName(char *buf)
  98. {
  99. //fs_record_obj.path[12] = 0;
  100. #if 0
  101. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  102. m_datetime.year%100 + 2000,
  103. m_datetime.month%100,
  104. m_datetime.day%100
  105. );
  106. #elif 0
  107. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  108. m_datetime.day%100 + 2000,
  109. m_datetime.hour%100,
  110. m_datetime.min%100
  111. );
  112. #else
  113. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  114. m_datetime.hour%100 + 2000,
  115. m_datetime.min%100,
  116. m_datetime.sec%100
  117. );
  118. #endif
  119. return;
  120. }
  121. /**
  122. * @brief 指定长度len,buf内容写入文件
  123. * @retval int
  124. */
  125. uint32_t func_record_write(uint8_t *buf ,uint32_t len)
  126. {
  127. FRESULT res;
  128. UINT write_len = 0;
  129. //根据日期生成文件名,用于文件写入
  130. func_record_mk_fileName((char *)fs_record_obj.name_new);
  131. //打开当前存在的文件;
  132. res = f_open(&fs_record_obj.opt_file,(char *)fs_record_obj.name_new , FA_WRITE| FA_OPEN_EXISTING);
  133. if(FR_OK != res)
  134. {
  135. //检查文件个数是否超限
  136. func_record_files_update((char *)fs_record_obj.fold);
  137. if(FR_NO_FILE == res)
  138. {
  139. //创建文件并写入
  140. res = f_open(&fs_record_obj.opt_file, (char*)fs_record_obj.name_new, FA_WRITE| FA_CREATE_NEW);
  141. if(FR_OK != res)
  142. {
  143. fs_record_obj.fs_stat = false;
  144. return 0;
  145. }
  146. }
  147. else
  148. {
  149. return 0;
  150. }
  151. }
  152. //将当前发送文件更新为当前写入文件
  153. strcpy((char *)fs_record_obj.name_send,(char *)fs_record_obj.name_new);
  154. fs_record_obj.opt_len = f_size(&fs_record_obj.opt_file);
  155. //操作指针移动到文件末尾
  156. res = f_lseek(&fs_record_obj.opt_file, fs_record_obj.opt_len);
  157. taskENTER_CRITICAL(); /* 临界保护开启 */
  158. res = f_write(&fs_record_obj.opt_file, buf, len, &write_len);
  159. res = f_close(&fs_record_obj.opt_file); //关闭文件
  160. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  161. return write_len;
  162. }
  163. void func_record_get_NameSend(void)
  164. {
  165. //发送文件是否存在
  166. if(strlen((char*)fs_record_obj.name_send) > 0)
  167. {
  168. return;
  169. }
  170. //检查文件个数是否超限
  171. func_record_files_update((char *)fs_record_obj.fold);
  172. }
  173. /**
  174. * @brief The application entry point.
  175. * @retval int
  176. */
  177. uint32_t func_record_read(uint8_t *buf, uint32_t len)
  178. {
  179. FRESULT res;
  180. //uint32_t file_len = 0;
  181. uint32_t read_len = 0;
  182. func_record_get_NameSend();
  183. if(strlen((char *)fs_record_obj.name_send) <= 0)
  184. {
  185. return 0;
  186. }
  187. res = f_open(&fs_record_obj.opt_file, (char*)fs_record_obj.name_send, FA_READ | FA_OPEN_EXISTING);
  188. if(FR_OK != res)
  189. {
  190. return 0;
  191. }
  192. fs_record_obj.opt_len = f_size(&fs_record_obj.opt_file);
  193. //如果文件小于数据长度,则删除文件
  194. if(fs_record_obj.opt_len < len)
  195. {
  196. res = f_close(&fs_record_obj.opt_file);
  197. taskENTER_CRITICAL(); /* 临界保护开启 */
  198. res = f_unlink((char*)fs_record_obj.name_send);
  199. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  200. if(res == FR_OK)
  201. {
  202. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  203. }
  204. return 0;
  205. };
  206. res = f_lseek(&fs_record_obj.opt_file, fs_record_obj.opt_len - len);
  207. res = f_read(&fs_record_obj.opt_file, buf, len, &read_len);
  208. res = f_close(&fs_record_obj.opt_file);
  209. return read_len;
  210. }
  211. uint32_t func_record_remove(uint8_t *buf, uint32_t len)
  212. {
  213. FRESULT res;
  214. uint32_t read_len = 0;
  215. func_record_get_NameSend();
  216. if(strlen((char *)fs_record_obj.name_send) <= 0)
  217. {
  218. return 0;
  219. }
  220. res = f_open(&fs_record_obj.opt_file, (char*)fs_record_obj.name_send, FA_WRITE| FA_READ| FA_OPEN_EXISTING);
  221. if(FR_OK != res)
  222. {
  223. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  224. return 0;
  225. }
  226. fs_record_obj.opt_len = f_size(&fs_record_obj.opt_file);
  227. //如果文件小于数据长度,则删除文件
  228. if(fs_record_obj.opt_len < len)
  229. {
  230. res = f_close(&fs_record_obj.opt_file);
  231. taskENTER_CRITICAL(); /* 临界保护开启 */
  232. res = f_unlink((char*)fs_record_obj.name_send);
  233. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  234. if(res == FR_OK)
  235. {
  236. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  237. }
  238. return 0;
  239. };
  240. res = f_lseek(&fs_record_obj.opt_file, fs_record_obj.opt_len - len);
  241. res = f_read(&fs_record_obj.opt_file, buf, len, &read_len);
  242. res = f_lseek(&fs_record_obj.opt_file, fs_record_obj.opt_len - len);
  243. taskENTER_CRITICAL(); /* 临界保护开启 */
  244. res = f_truncate(&fs_record_obj.opt_file ); //截断后面的文件
  245. res = f_close(&fs_record_obj.opt_file);
  246. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  247. return read_len;
  248. }
  249. uint32_t func_record_delete(uint8_t *buf,uint32_t len)
  250. {
  251. FRESULT res;
  252. //uint32_t file_len = 0;
  253. if(strlen((char *)fs_record_obj.name_send) <= 0)
  254. {
  255. return 0;
  256. }
  257. //打开文件
  258. res = f_open(&fs_record_obj.opt_file, (char*)fs_record_obj.name_send, FA_WRITE | FA_OPEN_EXISTING );
  259. if ( res != FR_OK )
  260. {
  261. if(res == FR_NO_FILE )
  262. {
  263. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  264. memset((char*)fs_record_obj.name_new, 0x00,sizeof(fs_record_obj.name_new));
  265. }
  266. return res;
  267. }
  268. fs_record_obj.opt_len = f_size(&fs_record_obj.opt_file);
  269. //如果文件小于数据长度,则删除文件
  270. if(fs_record_obj.opt_len <= len)
  271. {
  272. res = f_close(&fs_record_obj.opt_file);
  273. taskENTER_CRITICAL(); /* 临界保护开启 */
  274. res = f_unlink((char*)fs_record_obj.name_send);
  275. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  276. if(res == FR_OK)
  277. {
  278. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  279. }
  280. return 0;
  281. };
  282. res = f_lseek(&fs_record_obj.opt_file, fs_record_obj.opt_len - len);
  283. taskENTER_CRITICAL(); /* 临界保护开启 */
  284. res = f_truncate(&fs_record_obj.opt_file ); //截断后面的文件
  285. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  286. res = f_close(&fs_record_obj.opt_file);
  287. return res;
  288. }
  289. /**
  290. * 文件信息获取
  291. */
  292. FRESULT func_record_file_check(void)
  293. {
  294. FRESULT f_res; /* 文件操作结果 */
  295. static FILINFO finfo;
  296. /* 获取文件信息 */
  297. f_res=f_stat("TestDir/testdir.txt",&finfo);
  298. if(f_res==FR_OK)
  299. {
  300. printf("“testdir.txt”文件信息:\n");
  301. printf("》文件大小: %ld(字节)\n", finfo.fsize);
  302. printf("》时间戳: %u/%02u/%02u, %02u:%02u\n",
  303. (finfo.fdate >> 9) + 1980, finfo.fdate >> 5 & 15, finfo.fdate & 31,finfo.ftime >> 11, finfo.ftime >> 5 & 63);
  304. printf("》属性: %c%c%c%c%c\n\n",
  305. (finfo.fattrib & AM_DIR) ? 'D' : '-', // 是一个目录
  306. (finfo.fattrib & AM_RDO) ? 'R' : '-', // 只读文件
  307. (finfo.fattrib & AM_HID) ? 'H' : '-', // 隐藏文件
  308. (finfo.fattrib & AM_SYS) ? 'S' : '-', // 系统文件
  309. (finfo.fattrib & AM_ARC) ? 'A' : '-'); // 档案文件
  310. }
  311. return f_res;
  312. }
  313. /**
  314. * @brief scan_files 递归扫描FatFs内的文件
  315. * @param path:初始扫描路径
  316. * @retval result:文件系统的返回值
  317. */
  318. FRESULT func_record_scan_files (char* path)
  319. {
  320. FRESULT res; //部分在递归过程被修改的变量,不用全局变量
  321. FILINFO fno;
  322. DIR dir;
  323. int i;
  324. char *fn; // 文件名
  325. #if _USE_LFN
  326. /* 长文件名支持 */
  327. /* 简体中文需要2个字节保存一个“字”*/
  328. static char lfn[_MAX_LFN*2 + 1];
  329. fno.fname = lfn;
  330. fno.fsize = sizeof(lfn);
  331. #endif
  332. //打开目录
  333. res = f_opendir(&dir, path);
  334. if (res == FR_OK)
  335. {
  336. i = strlen(path);
  337. for (;;)
  338. {
  339. //读取目录下的内容,再读会自动读下一个文件
  340. res = f_readdir(&dir, &fno);
  341. //为空时表示所有项目读取完毕,跳出
  342. if (res != FR_OK || fno.fname[0] == 0) break;
  343. #if _USE_LFN
  344. fn = *fno.lfname ? fno.lfname : fno.fname;
  345. #else
  346. fn = fno.fname;
  347. #endif
  348. //点表示当前目录,跳过
  349. if (*fn == '.') continue;
  350. //目录,递归读取
  351. if (fno.fattrib & AM_DIR)
  352. {
  353. //合成完整目录名
  354. sprintf(&path[i], "/%s", fn);
  355. //递归遍历
  356. res = func_record_scan_files(path);
  357. path[i] = 0;
  358. //打开失败,跳出循环
  359. if (res != FR_OK)
  360. break;
  361. }
  362. else
  363. {
  364. printf("%s/%s\n", path, fn); //输出文件名
  365. /* 可以在这里提取特定格式的文件路径 */
  366. }//else
  367. } //for
  368. }
  369. return res;
  370. }
  371. /*------------------------------------------------------
  372. 读取指定目录下所有的文件
  373. 说明:
  374. f_readdir 按顺序读取目录内文件,
  375. 重复调用此函数可读取目录内所有文件;
  376. ---------------------------------------------------------*/
  377. void func_record_files_update(char * path)
  378. {
  379. char file_name[32] = {0};
  380. FRESULT res; //部分在递归过程被修改的变量,不用全局变量
  381. FILINFO fno = {0};
  382. fs_record_obj.items_num = 0;
  383. fs_record_obj.file_num = 0;
  384. memset((void *)fs_record_obj.file_list, 0x00,sizeof(fs_record_obj.file_list));
  385. memset((void *)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  386. //获取fatfs文件系统
  387. fs_record_obj.free_size = func_fatfs_get_free();
  388. #if _USE_LFN//如果使能支持长文件名 先对下面两项初始化
  389. fileinfo.lfsize=_MAX_LFN * 2 + 1;//
  390. fileinfo.lfname=(TCHAR*)FileName;//
  391. #endif
  392. if(f_opendir(&fs_record_obj.dir,(const char*)path) != FR_OK)/* 打开文件夹目录成功,目录信息已经在dir结构体中保存 */
  393. {
  394. res = f_mkdir((const char*)path);
  395. if(res == FR_OK)
  396. {
  397. fs_record_obj.fs_stat = true;
  398. return;
  399. }
  400. else
  401. {
  402. return;
  403. }
  404. }
  405. fs_record_obj.fs_stat = true;
  406. //打开日志路径正常,获取路文件夹内的文件列表
  407. while(f_readdir(&fs_record_obj.dir, &fno) == FR_OK) //读文件信息到文件状态结构体中
  408. {
  409. fs_record_obj.items_num++;
  410. //判定的顺序不能变
  411. if(!fno.fname[0]) break; //如果文件名为‘\0',说明读取完成结束
  412. if (fno.fattrib & AM_DIR) continue; //表示目录,跳过
  413. if (fno.fname[0] == '.') continue; //点表示当前目录,跳过
  414. if( (fs_record_obj.file_num < MAX_FILE_COUNT)
  415. &&(strstr(fno.fname,FILE_START) == fno.fname)
  416. &&((strstr(fno.fname,FILE_END) != 0))
  417. )
  418. {
  419. sprintf((char *)fs_record_obj.file_list[fs_record_obj.file_num], "%s/%s", fs_record_obj.fold,fno.fname);//将文件名存入列表中
  420. fs_record_obj.file_num ++;
  421. }
  422. else
  423. {
  424. /* 如果目录已经存在,关闭它 */
  425. res = f_closedir(&fs_record_obj.dir);
  426. sprintf((char *)file_name,"%s/%s",fs_record_obj.fold, fno.fname); //输出文件名
  427. taskENTER_CRITICAL(); /* 临界保护开启 */
  428. res = f_unlink(file_name);
  429. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  430. if(FR_OK != res)
  431. {
  432. fs_record_obj.fs_stat = false;
  433. return;
  434. }
  435. }
  436. }
  437. /* 如果目录已经存在,关闭它 */
  438. res = f_closedir(&fs_record_obj.dir);
  439. if(fs_record_obj.file_num > 0)
  440. {
  441. }
  442. else
  443. {
  444. memset((void *)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  445. return;
  446. }
  447. //按文件名最小到大排序;
  448. if(fs_record_obj.file_num > 1)
  449. {
  450. func_record_dir_qsort(fs_record_obj.file_num);
  451. }
  452. //获取最新的文件;
  453. uint8_t max_idx = fs_record_obj.file_num - 1;
  454. sprintf((char *)fs_record_obj.name_send,"%s", fs_record_obj.file_list[max_idx]);
  455. //如果文件个数超限,
  456. if((fs_record_obj.file_num > NUM_FILE_SET)
  457. ||(fs_record_obj.free_size < 500))
  458. {
  459. //删除日期最早的文件
  460. sprintf((char *)file_name,"%s", fs_record_obj.file_list[0]);
  461. taskENTER_CRITICAL(); /* 临界保护开启 */
  462. res = f_unlink(file_name);
  463. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  464. if(FR_OK != res)
  465. {
  466. fs_record_obj.fs_stat = false;
  467. return;
  468. }
  469. }
  470. UNUSED(res);
  471. return;
  472. }
  473. int qsort_cmp(const void *a,const void *b)
  474. {
  475. return strcmp(( char * ) a, (const char* )b);
  476. }
  477. //(void * /*base*/, size_t /*nmemb*/, size_t /*size*/, int (* /*compar*/)(const void *, const void *)) __attribute__((__nonnull__(1,4)));
  478. void func_record_dir_qsort(size_t fcount)
  479. {
  480. qsort((void *)fs_record_obj.file_list, fcount, sizeof(fs_record_obj.file_list[0]), qsort_cmp);
  481. }
  482. void func_record_init(void)
  483. {
  484. memset(fs_record_obj.file_list, 0x00,sizeof(fs_record_obj.file_list)); //清空文件列表
  485. fs_record_obj.file_num = 0;
  486. fs_record_obj.fs_stat = true;
  487. func_record_files_update((char *)fs_record_obj.fold);
  488. }
  489. void func_record_fs_test(void)
  490. {
  491. record_test_obj.cnts++;
  492. sprintf(record_test_obj.buf,"XX%08xXX",record_test_obj.cnts);
  493. switch(record_test_obj.test_flag)
  494. {
  495. case 0:
  496. {
  497. func_record_write((uint8_t *)record_test_obj.buf ,strlen(record_test_obj.buf));
  498. }break;
  499. case 1:
  500. {
  501. func_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
  502. func_record_delete((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
  503. func_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
  504. }break;
  505. default:
  506. {
  507. func_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
  508. }break;
  509. }
  510. }
  511. char* pstr = 0;
  512. char* pidx = 0;
  513. void func_record_str(void)
  514. {
  515. char str_name[] ="20221112.TXT" ;
  516. while(1)
  517. {
  518. pstr = strstr(str_name,FILE_START);
  519. pidx = strstr(str_name,FILE_END);
  520. UNUSED(pstr);
  521. UNUSED(pidx);
  522. }
  523. }
  524. char path_buf[512] = {0};
  525. void func_record_fatfs_main(void const *argument)
  526. {
  527. //func_record_str();
  528. //add boly 20221014 SD卡 FATFS组件初始化
  529. #if USE_SPI_SD
  530. SDCARD_GPIO_Init();
  531. SDCARD_SPI_Init();
  532. #endif
  533. #if USE_SPI_FLASH
  534. func_w25q_init();
  535. func_w25q_test();
  536. #endif
  537. #if USE_FATFS_RECORD
  538. taskENTER_CRITICAL();
  539. func_fatfs_init();
  540. func_fatfs_main();
  541. taskEXIT_CRITICAL();
  542. func_record_queue_init();
  543. func_record_queue_update();
  544. //while(1)
  545. {
  546. osDelay(1000);
  547. };
  548. //end boly
  549. #endif
  550. osDelay(1000);//
  551. func_record_init();
  552. while(1)
  553. {
  554. strcpy(path_buf,fs_record_obj.fold);
  555. //func_fatfs_scan_files(path_buf);
  556. //func_record_fs_test();
  557. func_record_queue_test();
  558. func_record_work();
  559. osDelay(1000);
  560. }
  561. }
  562. #endif //---------------------------USE_FATFS_RECORD----------------------------
  563. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/