func_lfs_record.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659
  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_LFS_RECORD
  22. /* Includes ------------------------------------------------------------------*/
  23. #include <stdint.h>
  24. #include <string.h>
  25. #include <stdlib.h>
  26. #include <stdbool.h>
  27. #include "dev_spi_sdcard.h"
  28. #include "func_spi_w25qxx.h"
  29. #include "mid_littlefs_flash.h"
  30. #include "func_queue_record.h"
  31. #include "Data_deal.h"
  32. /* Private includes ----------------------------------------------------------*/
  33. /* USER CODE BEGIN Includes */
  34. /* USER CODE END Includes */
  35. /* Private typedef -----------------------------------------------------------*/
  36. #define MAX_FILE_COUNT 20
  37. #define NUM_FILE_SET 10
  38. /* Private define ------------------------------------------------------------*/
  39. /* USER CODE BEGIN PD */
  40. /* USER CODE END PD */
  41. /* Private macro -------------------------------------------------------------*/
  42. /* USER CODE BEGIN PM */
  43. /* USER CODE END PM */
  44. /* Private variables ---------------------------------------------------------*/
  45. /* USER CODE BEGIN PV */
  46. /* USER CODE END PV */
  47. const char FILE_START[] = "20";
  48. const char FILE_END[] = ".TXT";
  49. const char FILE_FOLD[] = "JLRECORD";//"";//
  50. /* Private function prototypes -----------------------------------------------*/
  51. #pragma pack(4) /*4字节对齐*/
  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. lfs_file_t opt_file; //当前操作的文件
  60. lfs_dir_t dir; //操作的文件名
  61. uint32_t opt_len;
  62. uint32_t items_num;
  63. int8_t read_buf[512];
  64. uint32_t read_len;
  65. int8_t write_buf[512];
  66. uint32_t write_len;
  67. uint32_t file_num;
  68. int8_t file_list[MAX_FILE_COUNT][32];//保存文件名
  69. int8_t link_ok;
  70. uint32_t free_size;
  71. }fs_record_OBJ;
  72. fs_record_OBJ fs_record_obj = {
  73. .fs_stat = true,
  74. .fold = FILE_FOLD,
  75. .items_num= 0,
  76. .file_num = 0,
  77. .link_ok = false,
  78. };
  79. #pragma pack()/*还原默认对齐*/
  80. void func_record_lfs_Get_Capacity(void);
  81. void func_record_lfs_files_update(char * path);
  82. void func_record_lfs_dir_qsort(size_t fcount);
  83. extern SDateTime m_datetime;
  84. /* Private user code ---------------------------------------------------------*/
  85. uint8_t func_record_lfs_stat_get(void)
  86. {
  87. return fs_record_obj.fs_stat;
  88. }
  89. uint8_t func_record_lfs_stat_set(uint8_t stat)
  90. {
  91. fs_record_obj.fs_stat = stat;
  92. return fs_record_obj.fs_stat;
  93. }
  94. void func_record_lfs_mk_fileName(char *buf)
  95. {
  96. //fs_record_obj.path[12] = 0;
  97. #if 0
  98. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  99. m_datetime.year%100 + 2000,
  100. m_datetime.month%100,
  101. m_datetime.day%100
  102. );
  103. #elif 0
  104. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  105. m_datetime.day%100 + 2000,
  106. m_datetime.hour%100,
  107. m_datetime.min%100
  108. );
  109. #else
  110. sprintf(buf,"%s/%04d%02d%02d.TXT",fs_record_obj.fold,
  111. m_datetime.hour%100 + 2000,
  112. m_datetime.min%100,
  113. m_datetime.sec%100
  114. );
  115. #endif
  116. return;
  117. }
  118. /**
  119. * @brief 指定长度len,buf内容写入文件
  120. * @retval int
  121. */
  122. uint32_t func_record_lfs_write(void *buf ,uint32_t len)
  123. {
  124. lfs_soff_t res;
  125. UINT write_len = 0;
  126. //根据日期生成文件名,用于文件写入
  127. func_record_lfs_mk_fileName((char *)fs_record_obj.name_new);
  128. //打开当前存在的文件;
  129. res = lfs_file_open_static(&lfs_flash, &fs_record_obj.opt_file,(char *)fs_record_obj.name_new , LFS_O_WRONLY);
  130. if(LFS_ERR_OK != res)
  131. {
  132. //检查文件个数是否超限
  133. func_record_lfs_files_update((char *)fs_record_obj.fold);
  134. if(LFS_ERR_NOENT == res)
  135. {
  136. //创建文件并写入
  137. res = lfs_file_open_static(&lfs_flash, &fs_record_obj.opt_file, (char*)fs_record_obj.name_new, LFS_O_RDWR| LFS_O_CREAT);
  138. if(LFS_ERR_OK != res)
  139. {
  140. fs_record_obj.fs_stat = false;
  141. return 0;
  142. }
  143. }
  144. else
  145. {
  146. return 0;
  147. }
  148. }
  149. //将当前发送文件更新为当前写入文件
  150. strcpy((char *)fs_record_obj.name_send,(char *)fs_record_obj.name_new);
  151. fs_record_obj.opt_len = lfs_file_size(&lfs_flash, &fs_record_obj.opt_file);
  152. //操作指针移动到文件末尾
  153. res = lfs_file_seek(&lfs_flash, &fs_record_obj.opt_file, fs_record_obj.opt_len,LFS_SEEK_END);
  154. taskENTER_CRITICAL(); /* 临界保护开启 */
  155. res = lfs_file_write(&lfs_flash, &fs_record_obj.opt_file, buf, len);
  156. //lfs_file_sync(&lfs_flash, &fs_record_obj.opt_file);
  157. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file); //关闭文件
  158. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  159. return write_len;
  160. }
  161. void func_record_lfs_get_NameSend(void)
  162. {
  163. //发送文件是否存在
  164. if(strlen((char*)fs_record_obj.name_send) > 0)
  165. {
  166. return;
  167. }
  168. //检查文件个数是否超限
  169. func_record_lfs_files_update((char *)fs_record_obj.fold);
  170. }
  171. /**
  172. * @brief The application entry point.
  173. * @retval int
  174. */
  175. uint32_t func_record_lfs_read(uint8_t *buf, uint32_t len)
  176. {
  177. lfs_soff_t res;
  178. //uint32_t file_len = 0;
  179. uint32_t read_len = 0;
  180. func_record_lfs_get_NameSend();
  181. if(strlen((char *)fs_record_obj.name_send) <= 0)
  182. {
  183. return 0;
  184. }
  185. res = lfs_file_open_static(&lfs_flash, &fs_record_obj.opt_file, (char*)fs_record_obj.name_send, LFS_O_RDONLY);
  186. if(LFS_ERR_OK != res)
  187. {
  188. return 0;
  189. }
  190. fs_record_obj.opt_len = lfs_file_size(&lfs_flash, &fs_record_obj.opt_file);
  191. //如果文件小于数据长度,则删除文件
  192. if(fs_record_obj.opt_len < len)
  193. {
  194. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  195. taskENTER_CRITICAL(); /* 临界保护开启 */
  196. res = lfs_remove(&lfs_flash, (char*)fs_record_obj.name_send);
  197. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  198. if(res == LFS_ERR_OK)
  199. {
  200. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  201. }
  202. return 0;
  203. };
  204. res = lfs_file_seek(&lfs_flash, &fs_record_obj.opt_file, 0 - len, LFS_SEEK_END);
  205. res = lfs_file_read(&lfs_flash, &fs_record_obj.opt_file, buf, len);
  206. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  207. return read_len;
  208. }
  209. int32_t func_record_lfs_remove(void *buf, uint32_t len)
  210. {
  211. lfs_soff_t res;
  212. uint32_t read_len = 0;
  213. func_record_lfs_get_NameSend();
  214. if(strlen((char *)fs_record_obj.name_send) <= 0)
  215. {
  216. return 0;
  217. }
  218. res = lfs_file_open_static(&lfs_flash, &fs_record_obj.opt_file, (char*)fs_record_obj.name_send, LFS_O_RDWR);
  219. if(LFS_ERR_OK != res)
  220. {
  221. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  222. return 0;
  223. }
  224. fs_record_obj.opt_len = lfs_file_size(&lfs_flash, &fs_record_obj.opt_file);
  225. //如果文件小于数据长度,则删除文件
  226. if(fs_record_obj.opt_len < len)
  227. {
  228. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  229. taskENTER_CRITICAL(); /* 临界保护开启 */
  230. res = lfs_remove(&lfs_flash, (char*)fs_record_obj.name_send);
  231. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  232. if(res == LFS_ERR_OK)
  233. {
  234. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  235. }
  236. return 0;
  237. };
  238. res = lfs_file_seek(&lfs_flash, &fs_record_obj.opt_file, 0 - len, LFS_SEEK_END);
  239. res = lfs_file_read(&lfs_flash, &fs_record_obj.opt_file, buf, len);
  240. taskENTER_CRITICAL(); /* 临界保护开启 */
  241. res = lfs_file_truncate(&lfs_flash, &fs_record_obj.opt_file ,fs_record_obj.opt_len - len); //截断后面的文件
  242. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  243. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  244. return read_len;
  245. }
  246. int32_t func_record_lfs_delete(uint8_t *buf,uint32_t len)
  247. {
  248. lfs_soff_t res;
  249. if(strlen((char *)fs_record_obj.name_send) <= 0)
  250. {
  251. return 0;
  252. }
  253. //打开文件
  254. res = lfs_file_open_static(&lfs_flash, &fs_record_obj.opt_file, (char*)fs_record_obj.name_send, LFS_O_WRONLY | LFS_O_EXCL );
  255. if ( res != LFS_ERR_OK )
  256. {
  257. if(res == FR_NO_FILE )
  258. {
  259. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  260. memset((char*)fs_record_obj.name_new, 0x00,sizeof(fs_record_obj.name_new));
  261. }
  262. return res;
  263. }
  264. fs_record_obj.opt_len = lfs_file_size(&lfs_flash, &fs_record_obj.opt_file);
  265. //如果文件小于数据长度,则删除文件
  266. if(fs_record_obj.opt_len <= len)
  267. {
  268. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  269. taskENTER_CRITICAL(); /* 临界保护开启 */
  270. res = lfs_remove(&lfs_flash, (char*)fs_record_obj.name_send);
  271. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  272. if(res == LFS_ERR_OK)
  273. {
  274. memset((char*)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  275. }
  276. return 0;
  277. };
  278. taskENTER_CRITICAL(); /* 临界保护开启 */
  279. res = lfs_file_truncate(&lfs_flash, &fs_record_obj.opt_file, fs_record_obj.opt_len - len); //截断后面的文件
  280. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  281. res = lfs_file_close(&lfs_flash, &fs_record_obj.opt_file);
  282. return res;
  283. }
  284. /**
  285. * 文件信息获取
  286. */
  287. lfs_soff_t func_record_lfs_file_check(void)
  288. {
  289. lfs_soff_t res; /* 文件操作结果 */
  290. struct lfs_info finfo;
  291. /* 获取文件信息 */
  292. res=lfs_stat(&lfs_flash,"TestDir/testdir.txt",&finfo);
  293. if(res==LFS_ERR_OK)
  294. {
  295. printf("“testdir.txt”文件信息:\n");
  296. printf("》文件大小: %ld(字节)\n", finfo.size);
  297. //printf("》时间戳: %u/%02u/%02u, %02u:%02u\n",
  298. // (finfo.fdate >> 9) + 1980, finfo.fdate >> 5 & 15, finfo.fdate & 31,finfo.ftime >> 11, finfo.ftime >> 5 & 63);
  299. printf("》属性: %c%c%\n\n",
  300. (finfo.type & LFS_TYPE_DIR) ? 'D' : '-', // 是一个目录
  301. (finfo.type & LFS_TYPE_REG) ? 'R' : '-' // 只读文件
  302. );
  303. }
  304. return res;
  305. }
  306. /**
  307. * @brief scan_files 递归扫描FatFs内的文件
  308. * @param path:初始扫描路径
  309. * @retval result:文件系统的返回值
  310. */
  311. lfs_soff_t func_record_lfs_scan_files (char* path)
  312. {
  313. lfs_soff_t res; //部分在递归过程被修改的变量,不用全局变量
  314. struct lfs_info fno;
  315. lfs_dir_t dir;
  316. int i;
  317. char *fn; // 文件名
  318. //打开目录
  319. res = lfs_dir_open(&lfs_flash, &dir, path);
  320. if (res == LFS_ERR_OK)
  321. {
  322. i = strlen(path);
  323. for (;;)
  324. {
  325. //读取目录下的内容,再读会自动读下一个文件
  326. res = lfs_dir_read(&lfs_flash, &dir, &fno);
  327. //为空时表示所有项目读取完毕,跳出
  328. if (res != true || fno.name[0] == 0) break;
  329. #if _USE_LFN
  330. fn = *fno.lfname ? fno.lfname : fno.name;
  331. #else
  332. fn = fno.name;
  333. #endif
  334. //点表示当前目录,跳过
  335. if (*fn == '.') continue;
  336. //目录,递归读取
  337. if (fno.type & LFS_TYPE_DIR)
  338. {
  339. //合成完整目录名
  340. sprintf(&path[i], "/%s", fn);
  341. // //递归遍历
  342. // res = func_record_lfs_scan_files(path);
  343. // path[i] = 0;
  344. // //打开失败,跳出循环
  345. // if (res != LFS_ERR_OK)
  346. // break;
  347. }
  348. else
  349. {
  350. printf("%s/%s\n", path, fn); //输出文件名
  351. /* 可以在这里提取特定格式的文件路径 */
  352. }//else
  353. } //for
  354. }
  355. lfs_dir_close(&lfs_flash, &fs_record_obj.dir);
  356. return res;
  357. }
  358. /*------------------------------------------------------
  359. 读取指定目录下所有的文件
  360. 说明:
  361. lfs_dir_read 按顺序读取目录内文件,
  362. 重复调用此函数可读取目录内所有文件;
  363. ---------------------------------------------------------*/
  364. void func_record_lfs_files_update(char * path)
  365. {
  366. char file_name[32] = {0};
  367. lfs_soff_t res; //部分在递归过程被修改的变量,不用全局变量
  368. struct lfs_info fno = {0};
  369. fs_record_obj.items_num = 0;
  370. fs_record_obj.file_num = 0;
  371. memset((void *)fs_record_obj.file_list, 0x00,sizeof(fs_record_obj.file_list));
  372. memset((void *)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  373. //获取fatfs文件系统
  374. fs_record_obj.free_size = mid_lfs_flash_get_free();
  375. #if _USE_LFN//如果使能支持长文件名 先对下面两项初始化
  376. fileinfo.lfsize=_MAX_LFN * 2 + 1;//
  377. fileinfo.lfname=(TCHAR*)FileName;//
  378. #endif
  379. res = lfs_dir_open(&lfs_flash, &fs_record_obj.dir,(const char*)path);
  380. if(res != LFS_ERR_OK)/* 打开文件夹目录成功,目录信息已经在dir结构体中保存 */
  381. {
  382. res = lfs_mkdir(&lfs_flash, (const char*)path);
  383. if(res == LFS_ERR_OK)
  384. {
  385. fs_record_obj.fs_stat = true;
  386. return;
  387. }
  388. else
  389. {
  390. return;
  391. }
  392. }
  393. fs_record_obj.fs_stat = true;
  394. //打开日志路径正常,获取路文件夹内的文件列表
  395. while(lfs_dir_read(&lfs_flash, &fs_record_obj.dir, &fno) == true) //读文件信息到文件状态结构体中
  396. {
  397. fs_record_obj.items_num++;
  398. //判定的顺序不能变
  399. if(!fno.name[0]) break; //如果文件名为‘\0',说明读取完成结束
  400. if (fno.type & LFS_TYPE_DIR) continue; //表示目录,跳过
  401. if (fno.name[0] == '.') continue; //点表示当前目录,跳过
  402. if( (fs_record_obj.file_num < MAX_FILE_COUNT)
  403. &&(strstr(fno.name,FILE_START) == fno.name)
  404. &&((strstr(fno.name,FILE_END) != 0))
  405. )
  406. {
  407. sprintf((char *)fs_record_obj.file_list[fs_record_obj.file_num], "%s/%s", fs_record_obj.fold,fno.name);//将文件名存入列表中
  408. fs_record_obj.file_num ++;
  409. }
  410. else
  411. {
  412. /* 如果目录已经存在,关闭它 */
  413. res = lfs_dir_close(&lfs_flash, &fs_record_obj.dir);
  414. sprintf((char *)file_name,"%s/%s",fs_record_obj.fold, fno.name); //输出文件名
  415. taskENTER_CRITICAL(); /* 临界保护开启 */
  416. res = lfs_remove(&lfs_flash, file_name);
  417. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  418. if(LFS_ERR_OK != res)
  419. {
  420. fs_record_obj.fs_stat = false;
  421. return;
  422. }
  423. }
  424. }
  425. /* 如果目录已经存在,关闭它 */
  426. res = lfs_dir_close(&lfs_flash, &fs_record_obj.dir);
  427. if(fs_record_obj.file_num > 0)
  428. {
  429. }
  430. else
  431. {
  432. memset((void *)fs_record_obj.name_send, 0x00,sizeof(fs_record_obj.name_send));
  433. return;
  434. }
  435. //按文件名最小到大排序;
  436. if(fs_record_obj.file_num > 1)
  437. {
  438. func_record_lfs_dir_qsort(fs_record_obj.file_num);
  439. }
  440. //获取最新的文件;
  441. uint8_t max_idx = fs_record_obj.file_num - 1;
  442. sprintf((char *)fs_record_obj.name_send,"%s", fs_record_obj.file_list[max_idx]);
  443. //如果文件个数超限,
  444. if((fs_record_obj.file_num > NUM_FILE_SET)
  445. ||(fs_record_obj.free_size < 500))
  446. {
  447. //删除日期最早的文件
  448. sprintf((char *)file_name,"%s", fs_record_obj.file_list[0]);
  449. taskENTER_CRITICAL(); /* 临界保护开启 */
  450. res = lfs_remove(&lfs_flash, file_name);
  451. taskEXIT_CRITICAL(); /* 临界保护关闭 */
  452. if(LFS_ERR_OK != res)
  453. {
  454. fs_record_obj.fs_stat = false;
  455. return;
  456. }
  457. }
  458. UNUSED(res);
  459. return;
  460. }
  461. int qsort_cmp(const void *a,const void *b)
  462. {
  463. return strcmp(( char * ) a, (const char* )b);
  464. }
  465. //(void * /*base*/, size_t /*nmemb*/, size_t /*size*/, int (* /*compar*/)(const void *, const void *)) __attribute__((__nonnull__(1,4)));
  466. void func_record_lfs_dir_qsort(size_t fcount)
  467. {
  468. qsort((void *)fs_record_obj.file_list, fcount, sizeof(fs_record_obj.file_list[0]), qsort_cmp);
  469. }
  470. void func_record_lfs_init(void)
  471. {
  472. memset(fs_record_obj.file_list, 0x00,sizeof(fs_record_obj.file_list)); //清空文件列表
  473. fs_record_obj.file_num = 0;
  474. fs_record_obj.fs_stat = true;
  475. func_record_lfs_files_update((char *)fs_record_obj.fold);
  476. }
  477. typedef struct record_lfs_object
  478. {
  479. uint32_t cnts;
  480. uint8_t test_flag;
  481. char buf[LFS_PAGE_SIZE];
  482. }record_lfs_OBJ;
  483. record_lfs_OBJ record_lfs_obj;
  484. void func_record_lfs_fs_test(void)
  485. {
  486. record_lfs_obj.cnts++;
  487. sprintf(record_lfs_obj.buf,"XX%08xXX",record_lfs_obj.cnts);
  488. switch(record_lfs_obj.test_flag)
  489. {
  490. case 0:
  491. {
  492. func_record_lfs_write((uint8_t *)record_lfs_obj.buf ,strlen(record_lfs_obj.buf));
  493. }break;
  494. case 1:
  495. {
  496. func_record_lfs_read((uint8_t *)record_lfs_obj.buf ,sizeof(record_lfs_obj.buf));
  497. func_record_lfs_delete((uint8_t *)record_lfs_obj.buf ,sizeof(record_lfs_obj.buf));
  498. func_record_lfs_read((uint8_t *)record_lfs_obj.buf ,sizeof(record_lfs_obj.buf));
  499. }break;
  500. default:
  501. {
  502. func_record_lfs_files_update((char *)fs_record_obj.fold);
  503. func_record_lfs_read((uint8_t *)record_lfs_obj.buf ,sizeof(record_lfs_obj.buf));
  504. }break;
  505. }
  506. }
  507. char path_buf[512] = {0};
  508. void func_record_lfs_main(void const *argument)
  509. {
  510. #if USE_SPI_FLASH
  511. func_w25q_init();
  512. func_w25q_test();
  513. #endif
  514. #if USE_LFS_RECORD
  515. taskENTER_CRITICAL();
  516. mid_lfs_flash_init();
  517. mid_lfs_flash_bootcnt();
  518. mid_lfs_flash_boot_step();
  519. taskEXIT_CRITICAL();
  520. func_record_queue_init();
  521. func_record_queue_update();
  522. #endif
  523. osDelay(1000);//
  524. func_record_lfs_init();
  525. while(1)
  526. {
  527. strcpy(path_buf,fs_record_obj.fold);
  528. //func_record_lfs_scan_files(path_buf);
  529. func_record_lfs_fs_test();
  530. osDelay(1000);
  531. }
  532. }
  533. #endif //---------------------------USE_LFS_RECORD----------------------------
  534. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/