func_fatfs.c 9.2 KB

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