func_fatfs.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  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. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #if USE_FATFS_RECORD
  23. #include "dev_spi_sdcard.h"
  24. #include "func_spi_w25qxx.h"
  25. #include "func_fatfs.h"
  26. #include "func_fatfs_record.h"
  27. /* Private includes ----------------------------------------------------------*/
  28. /* USER CODE BEGIN Includes */
  29. /* USER CODE END Includes */
  30. /* Private typedef -----------------------------------------------------------*/
  31. /* Private define ------------------------------------------------------------*/
  32. /* USER CODE BEGIN PD */
  33. /* USER CODE END PD */
  34. /* Private macro -------------------------------------------------------------*/
  35. /* USER CODE BEGIN PM */
  36. /* USER CODE END PM */
  37. /* Private variables ---------------------------------------------------------*/
  38. /* USER CODE BEGIN PV */
  39. /* USER CODE END PV */
  40. /* Private function prototypes -----------------------------------------------*/
  41. /* USER CODE BEGIN PFP */
  42. FATFS fileSystem;
  43. FIL testFile;
  44. uint8_t testBuffer[16] = "SD write success";
  45. char fatfs_buf[4*1024];
  46. #if USE_SPI_SD
  47. const char FATFS_Path[4] = "0:/"; //挂载SD卡
  48. #else
  49. const char FATFS_Path[4] ;//= "1:/"; //挂载FLASH.
  50. #endif
  51. char readnrf,reafsd;
  52. /* USER CODE END PFP */
  53. void func_fatfs_Get_Capacity(void);
  54. /* Private user code ---------------------------------------------------------*/
  55. /* USER CODE BEGIN 0 */
  56. /* USER CODE END 0 */
  57. /**
  58. * @brief The application entry point.
  59. * @retval int
  60. */
  61. int func_fatfs_init(void)
  62. {
  63. FRESULT res;
  64. uint8_t format_disk = 0;
  65. /* Initialize all configured peripherals */
  66. FATFS_Init();
  67. //res = f_mkfs ( FATFS_Path, FM_ANY, 0, fatfs_buf, sizeof(fatfs_buf));
  68. /* USER CODE BEGIN 2 */
  69. res = f_mount(&fileSystem, (const TCHAR*)FATFS_Path, 1);
  70. if(res != FR_OK)
  71. {
  72. func_record_fatfs_set_OK(false);
  73. }
  74. if(res == FR_NO_FILESYSTEM)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
  75. {
  76. //
  77. while(res != FR_OK)
  78. {
  79. if(format_disk)
  80. {
  81. func_w25q_erase_ship();
  82. format_disk = 0;
  83. }
  84. if(format_disk)
  85. {
  86. res = f_mkfs (FATFS_Path, FM_ANY, 0, fatfs_buf, sizeof(fatfs_buf));
  87. format_disk = 0;
  88. }
  89. res = f_mount(&fileSystem, (const TCHAR*)FATFS_Path, 1);
  90. };
  91. }
  92. /* USER CODE END 2 */
  93. /* Infinite loop */
  94. /* USER CODE BEGIN WHILE */
  95. /* USER CODE END 3 */
  96. return res;
  97. }
  98. /**
  99. * @brief The application entry point.
  100. * @retval int
  101. */
  102. int func_fatfs_main(void)
  103. {
  104. /* USER CODE BEGIN 1 */
  105. //func_fatfs_Get_Capacity();
  106. /* USER CODE END 1 */
  107. return 0;
  108. }
  109. typedef struct fatfs_st
  110. {
  111. DWORD TotalSpace;
  112. DWORD AvailableSize;
  113. DWORD UsedSize;
  114. }fatfs_st;
  115. fatfs_st fatfs_run_st;
  116. void func_fatfs_Capacity(void)
  117. {
  118. FATFS *hFatfs = &fileSystem;
  119. fatfs_run_st.TotalSpace=((hFatfs->n_fatent - 2) * hFatfs->ssize *hFatfs->csize)/1024;
  120. fatfs_run_st.AvailableSize=(hFatfs->free_clst*hFatfs->ssize*hFatfs->csize)/1024;
  121. fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;
  122. }
  123. uint32_t func_fatfs_get_free(void)
  124. {
  125. return (fileSystem.free_clst*fileSystem.ssize*fileSystem.csize)/1024;
  126. }
  127. void func_fatfs_Get_Capacity(void)
  128. {
  129. // FRESULT result;
  130. // FATFS FS;
  131. FATFS *fs;
  132. DWORD fre_clust;
  133. FRESULT res;
  134. res = f_getfree(FATFS_Path, &fre_clust, &fs); /* 根目录 */
  135. if ( res == FR_OK )
  136. {
  137. fatfs_run_st.TotalSpace=(fs->n_fatent - 2);
  138. fatfs_run_st.AvailableSize=fre_clust;
  139. fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;
  140. /* Print free space in unit of MB (assuming 512 bytes/sector) */
  141. // printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB used.\r\n",TotalSpace, AvailableSize,UsedSize);
  142. }
  143. else
  144. {
  145. // printf("Get SDCard Capacity Failed (%d)\r\n", result);
  146. }
  147. return;
  148. }
  149. void func_fatfs_Get_Capacity_Sample(void)
  150. {
  151. // FRESULT result;
  152. // FATFS FS;
  153. FATFS *fs;
  154. DWORD fre_clust;
  155. FRESULT res;
  156. res = f_getfree(FATFS_Path, &fre_clust, &fs); /* 根目录 */
  157. if ( res == FR_OK )
  158. {
  159. fatfs_run_st.TotalSpace=(uint16_t)(((fs->n_fatent - 2) * fs->csize ) / 2 /1024);
  160. fatfs_run_st.AvailableSize=(uint16_t)((fre_clust * fs->csize) / 2 /1024);
  161. fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;
  162. /* Print free space in unit of MB (assuming 512 bytes/sector) */
  163. // printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB used.\r\n",TotalSpace, AvailableSize,UsedSize);
  164. }
  165. else
  166. {
  167. // printf("Get SDCard Capacity Failed (%d)\r\n", result);
  168. }
  169. return;
  170. }
  171. FIL file; /* 文件对象 */
  172. /* FatFs多项功能测试 */
  173. FRESULT func_fatfs_miscellaneous(void)
  174. {
  175. FRESULT f_res; /* 文件操作结果 */
  176. UINT fnum; /* 文件成功读写数量 */
  177. DIR dir;
  178. FATFS *pfs;
  179. DWORD fre_clust, fre_sect, tot_sect;
  180. printf("\n*************** 设备信息获取 ***************\r\n");
  181. /* 获取设备信息和空簇大小 */
  182. f_res = f_getfree((TCHAR const*)FATFS_Path, &fre_clust, &pfs);
  183. /* 计算得到总的扇区个数和空扇区个数 */
  184. tot_sect = (pfs->n_fatent - 2) * pfs->csize;
  185. fre_sect = fre_clust * pfs->csize;
  186. /* 打印信息(4096 字节/扇区) */
  187. printf("》设备总空间:%10lu KB。\n》可用空间: %10lu KB。\n", tot_sect *4, fre_sect *4);
  188. printf("\n******** 文件定位和格式化写入功能测试 ********\r\n");
  189. f_res = f_open(&file, "FatFs读写测试文件.txt",
  190. FA_OPEN_EXISTING|FA_WRITE|FA_READ );
  191. if ( f_res == FR_OK )
  192. {
  193. /* 文件定位 */
  194. f_res = f_lseek(&file,f_size(&file)-1);
  195. if (f_res == FR_OK)
  196. {
  197. /* 格式化写入,参数格式类似printf函数 */
  198. f_printf(&file,"\n在原来文件新添加一行内容\n");
  199. f_printf(&file,"》设备总空间:%10lu KB。\n》可用空间: %10lu KB。\n", tot_sect *4, fre_sect *4);
  200. /* 文件定位到文件起始位置 */
  201. f_res = f_lseek(&file,0);
  202. /* 读取文件所有内容到缓存区 */
  203. f_res = f_read(&file,fatfs_buf,f_size(&file),&fnum);
  204. if(f_res == FR_OK)
  205. {
  206. printf("》文件内容:\n%s\n",fatfs_buf);
  207. }
  208. }
  209. f_close(&file);
  210. printf("\n********** 目录创建和重命名功能测试 **********\r\n");
  211. /* 尝试打开目录 */
  212. f_res=f_opendir(&dir,"TestDir");
  213. if(f_res!=FR_OK)
  214. {
  215. /* 打开目录失败,就创建目录 */
  216. f_res=f_mkdir("TestDir");
  217. }
  218. else
  219. {
  220. /* 如果目录已经存在,关闭它 */
  221. f_res=f_closedir(&dir);
  222. /* 删除文件 */
  223. f_unlink("TestDir/testdir.txt");
  224. }
  225. if(f_res==FR_OK)
  226. {
  227. /* 重命名并移动文件 */
  228. f_res=f_rename("FatFs读写测试文件.txt","TestDir/testdir.txt");
  229. }
  230. }
  231. else
  232. {
  233. printf("!! 打开文件失败:%d\n",f_res);
  234. printf("!! 或许需要再次运行“FatFs移植与读写测试”工程\n");
  235. }
  236. return f_res;
  237. }
  238. /**
  239. * 文件信息获取
  240. */
  241. FRESULT func_fatfs_file_check(void)
  242. {
  243. FRESULT f_res; /* 文件操作结果 */
  244. static FILINFO finfo;
  245. /* 获取文件信息 */
  246. f_res=f_stat("TestDir/testdir.txt",&finfo);
  247. if(f_res==FR_OK)
  248. {
  249. printf("“testdir.txt”文件信息:\n");
  250. printf("》文件大小: %ld(字节)\n", finfo.fsize);
  251. printf("》时间戳: %u/%02u/%02u, %02u:%02u\n",
  252. (finfo.fdate >> 9) + 1980, finfo.fdate >> 5 & 15, finfo.fdate & 31,finfo.ftime >> 11, finfo.ftime >> 5 & 63);
  253. printf("》属性: %c%c%c%c%c\n\n",
  254. (finfo.fattrib & AM_DIR) ? 'D' : '-', // 是一个目录
  255. (finfo.fattrib & AM_RDO) ? 'R' : '-', // 只读文件
  256. (finfo.fattrib & AM_HID) ? 'H' : '-', // 隐藏文件
  257. (finfo.fattrib & AM_SYS) ? 'S' : '-', // 系统文件
  258. (finfo.fattrib & AM_ARC) ? 'A' : '-'); // 档案文件
  259. }
  260. return f_res;
  261. }
  262. /**
  263. * @brief scan_files 递归扫描FatFs内的文件
  264. * @param path:初始扫描路径
  265. * @retval result:文件系统的返回值
  266. */
  267. FRESULT func_fatfs_scan_files (char* path)
  268. {
  269. FRESULT res; //部分在递归过程被修改的变量,不用全局变量
  270. FILINFO fno;
  271. DIR dir;
  272. int i;
  273. char *fn; // 文件名
  274. #if _USE_LFN
  275. /* 长文件名支持 */
  276. /* 简体中文需要2个字节保存一个“字”*/
  277. static char lfn[_MAX_LFN*2 + 1];
  278. fno.fname = lfn;
  279. fno.fsize = sizeof(lfn);
  280. #endif
  281. //打开目录
  282. res = f_opendir(&dir, path);
  283. if (res == FR_OK)
  284. {
  285. i = strlen(path);
  286. for (;;)
  287. {
  288. //读取目录下的内容,再读会自动读下一个文件
  289. res = f_readdir(&dir, &fno);
  290. //为空时表示所有项目读取完毕,跳出
  291. if (res != FR_OK || fno.fname[0] == 0) break;
  292. #if _USE_LFN
  293. fn = *fno.lfname ? fno.lfname : fno.fname;
  294. #else
  295. fn = fno.fname;
  296. #endif
  297. //点表示当前目录,跳过
  298. if (*fn == '.') continue;
  299. //目录,递归读取
  300. if (fno.fattrib & AM_DIR)
  301. {
  302. //合成完整目录名
  303. sprintf(&path[i], "/%s", fn);
  304. //递归遍历
  305. res = func_fatfs_scan_files(path);
  306. path[i] = 0;
  307. //打开失败,跳出循环
  308. if (res != FR_OK)
  309. break;
  310. }
  311. else
  312. {
  313. printf("%s/%s\n", path, fn); //输出文件名
  314. /* 可以在这里提取特定格式的文件路径 */
  315. }//else
  316. } //for
  317. }
  318. return res;
  319. }
  320. /*------------------------------------------------------
  321. 读取指定目录下所有的文件
  322. 说明:
  323. f_readdir 按顺序读取目录内文件,
  324. 重复调用此函数可读取目录内所有文件;
  325. ---------------------------------------------------------*/
  326. void func_fatfs_ReadDirTest(char*path)
  327. {
  328. // FRESULT res; /* FatFs 函数通用结果代码 */
  329. DIR dir;
  330. FILINFO fno;
  331. #if _USE_LFN//如果使能支持长文件名 先对下面两项初始化
  332. fileinfo.lfsize=_MAX_LFN * 2 + 1;//
  333. fileinfo.lfname=(TCHAR*)FileName;//
  334. #endif
  335. if(f_opendir(&dir,(const char*)path) == FR_OK)/* 打开文件夹目录成功,目录信息已经在dir结构体中保存 */
  336. {
  337. while(f_readdir(&dir, &fno) == FR_OK) /* 读文件信息到文件状态结构体中 */
  338. {
  339. if(!fno.fname[0]) break; /* 如果文件名为‘\0',说明读取完成结束 */
  340. printf("%s/",path);//打印路径
  341. #if _USE_LFN
  342. printf("文件名:%s\r\n",fileinfo.lfname );//打印信息到串口
  343. #else
  344. printf("文件名:%s\r\n", fno.fname);//
  345. #endif
  346. }
  347. }
  348. }
  349. char* pstr = 0;
  350. char* pidx = 0;
  351. void func_record_fatfs_str(void)
  352. {
  353. char str_name[] ="20221112.TXT" ;
  354. while(1)
  355. {
  356. pstr = strstr(str_name,FILE_START);
  357. pidx = strstr(str_name,FILE_END);
  358. UNUSED(pstr);
  359. UNUSED(pidx);
  360. }
  361. }
  362. #if 0
  363. static int qsort_cmp(const void *a,const void *b)
  364. {
  365. return strcmp(( char * ) a, (const char* )b);
  366. }
  367. #define MAX_FILE_COUNT 20
  368. char fileList[MAX_FILE_COUNT][30];//保存文件名
  369. void func_fatfs_dir_qsort(uint32_t fcount)
  370. {
  371. qsort(fileList, fcount, sizeof(fileList[0]), qsort_cmp);
  372. }
  373. #endif
  374. #endif //--------------------------USE_FATFS_RECORD------------------------------
  375. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/