FATFS嵌入式系统设计

灰太狼 2022-12-09 03:11 339阅读 0赞

http://blog.chinaunix.net/uid-20766895-id-2827635.html

  1. int main(void)
  2. {
  3. u32 total,free;
  4. u8 t=0;
  5. u8 res=0;
  6. u8 *data_nanme=0;
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  8. delay_init(168); //初始化延时函数
  9. uart_init(115200); //初始化串口波特率为115200
  10. LED_Init(); //初始化LED
  11. usmart_dev.init(84); //初始化USMART
  12. LCD_Init(); //LCD初始化
  13. KEY_Init(); //按键初始化
  14. W25QXX_Init(); //初始化W25Q128
  15. my_mem_init(SRAMIN); //初始化内部内存池
  16. my_mem_init(SRAMCCM); //初始化CCM内存池
  17. POINT_COLOR=RED;//设置字体为红色
  18. LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
  19. LCD_ShowString(30,70,200,16,16,"FATFS TEST");
  20. LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  21. LCD_ShowString(30,110,200,16,16,"2014/5/15");
  22. LCD_ShowString(30,130,200,16,16,"Use USMART for test");
  23. while(SD_Init())//检测不到SD卡
  24. {
  25. LCD_ShowString(30,150,200,16,16,"SD Card Error!");
  26. delay_ms(500);
  27. LCD_ShowString(30,150,200,16,16,"Please Check! ");
  28. delay_ms(500);
  29. LED0=!LED0;//DS0闪烁
  30. }
  31. exfuns_init(); //为fatfs相关变量申请内存
  32. f_mount(fs[0],"0:",1); //挂载SD卡
  33. res=f_mount(fs[1],"1:",1); //挂载FLASH.
  34. if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
  35. {
  36. LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting..."); //格式化FLASH
  37. res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
  38. if(res==0)
  39. {
  40. f_setlabel((const TCHAR *)"1:ALIENTEK"); //设置Flash磁盘的名字为:ALIENTEK
  41. LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish"); //格式化完成
  42. }else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error "); //格式化失败
  43. delay_ms(1000);
  44. }
  45. LCD_Fill(30,150,240,150+16,WHITE); //清除显示
  46. while(exf_getfree("0",&total,&free)) //得到SD卡的总容量和剩余容量
  47. {
  48. LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");
  49. delay_ms(200);
  50. LCD_Fill(30,150,240,150+16,WHITE); //清除显示
  51. delay_ms(200);
  52. LED0=!LED0;//DS0闪烁
  53. }
  54. POINT_COLOR=BLUE;//设置字体为蓝色
  55. LCD_ShowString(30,150,200,16,16,"FATFS OK!");
  56. LCD_ShowString(30,170,200,16,16,"SD Total Size: MB");
  57. LCD_ShowString(30,190,200,16,16,"SD Free Size: MB");
  58. LCD_ShowNum(30+8*14,170,total>>10,5,16); //显示SD卡总容量 MB
  59. LCD_ShowNum(30+8*14,190,free>>10,5,16); //显示SD卡剩余容量 MB
  60. while(1)
  61. {
  62. t++;
  63. // delay_ms(200);
  64. LED0=0;
  65. // *data_nanme=f_typetell("test");
  66. // printf(data_nanme);
  67. // LCD_ShowString(30,290,200,16,16,*u8 data_nanme) ;
  68. // sprintf(write_buff,"%04d\r\n",ad_value[i]*3300/4096);
  69. //res_ad=f_lseek(&fil_ad,f_size(&fil_ad));
  70. //res_ad=f_write(&fil_ad,write_buff,6,&bww_ad);
  71. // if(KEY_Scan(1)==KEY0_PRES)
  72. if(KEY0==0)
  73. {
  74. LED0=1;
  75. // f_mount(0, &fs);
  76. //如果data.txt存在,则打开;否则,创建一个新文件
  77. // res = f_open(&file, "0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE );
  78. //(const TCHAR*) 转换为字符串
  79. /* f_open函数:创建文件
  80. fp:文件指针
  81. 1:test.txt:文件名
  82. 第三个参数是文件操作的权限,读/写/不管文件是否存在都创建(存在就覆盖)
  83. */
  84. // /* 打开文件 */
  85. res=f_open(&fsrc, (const TCHAR*)filename, FA_CREATE_ALWAYS | FA_WRITE);
  86. if(res!=FR_OK) //判断是否打开成功
  87. {
  88. LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
  89. LCD_ShowString(30,230,200,16,16,"f_open error!");
  90. }
  91. /* 将缓冲区的数据写到文件中 */
  92. res = f_write(&fsrc, wtext, sizeof(wtext), &bw);
  93. /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
  94. fp:文件指针
  95. */
  96. f_close(&fsrc); //关闭文件
  97. /* f_write函数:向文件中写入数据
  98. fp:文件指针
  99. write_buf:要写入文件的数据
  100. 第三个参数:写入多少个字节
  101. 第四个参数:指针,返回已经写入到文件的字节数
  102. */
  103. /*
  104. 1.打开文件
  105. f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
  106. 2.写数据
  107. f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);
  108. 3.关闭文件
  109. f_close(filescr1);//一定要关闭
  110. 第二次写入数据
  111. 1.打开文件
  112. f_open(filescr2, "0:/201711022.txt", FA_OPEN_DEFAULT);
  113. 2.按照文件现有大小移动指针
  114. f_lseek(filescr1,filescr1->fptr+filescr1->fsize);
  115. 3.写数据
  116. f_write(filescr1, test_buff0, sizeof(test_buff0), &bw1);
  117. 4.关闭文件
  118. f_close(filescr1);//一定要关闭
  119. 其实,多次写入的时候就是需要将指针移动,
  120. 这样的h我们就可以根据自己的需求进行在相同文件内连续写入数据了。
  121. 但是如果要在指定行进行修改就比较麻烦了,
  122. 就需要计算指针移动的位置,者相比于面向对象的编程语言而言要麻烦的多。
  123. */
  124. //f_lseek(&fsrc,(&fsrc)->fsize);
  125. // f_lseek(&fsrc,(&fsrc)->fptr-1);
  126. /*注册一个工作区域*/
  127. // f_mount(0,&fs);
  128. /* 打开创建一个新文件 */
  129. res=f_open(&fdst,"0:/DATA.CSV",FA_CREATE_NEW | FA_WRITE);
  130. /* 写入标题数据 */
  131. res=f_write(&fdst,"年-月-日-时-分-秒,fix,track\n",29,&bw);
  132. /* 关闭文件 */
  133. f_close(&fdst);
  134. /* 数据转换 */
  135. // size = format_data(text,324,12585);
  136. /* 打开文件 */
  137. res=f_open(&fdst,"0:/DATA.CSV",FA_OPEN_EXISTING | FA_WRITE);
  138. /* 查找文件的结尾 */
  139. res=f_lseek(&fdst,f_size(&fdst));
  140. /* 写入数据 */
  141. res=f_write(&fdst,text,sizeof(text),&bw);
  142. /* 关闭文件 */
  143. f_close(&fdst);
  144. if ( res == FR_OK )
  145. {
  146. // /* 打开文件 */
  147. res=f_open(&fsrc, (const TCHAR*)filename, FA_CREATE_ALWAYS | FA_WRITE);
  148. f_lseek(&fsrc, f_size(&fsrc)); //将文件指针移动到文件末尾
  149. /* 将缓冲区的数据写到文件中 */
  150. res = f_write(&fsrc, wtext, sizeof(wtext), &bw);
  151. /* f_close:关闭文件,使用f_open必须使用f_close,不然会有缓存
  152. fp:文件指针
  153. */
  154. f_close(&fsrc); //关闭文件
  155. }
  156. // res=f_write(&fsrc, wtext, sizeof(wtext), &bw); //向SD卡指定路径写入数据
  157. //LCD_ShowString(30,230,200,16,16,res);
  158. if(res!=FR_OK) //判断是否写入成功
  159. {
  160. LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write error!");
  161. LCD_ShowString(30,230,200,16,16,"f_write error!");
  162. }else
  163. {
  164. LCD_ShowString(10,230,tftlcd_data.width,tftlcd_data.height,16,"f_write ok!");
  165. }
  166. }
  167. //if(KEY_Scan(1)==KEY1_PRES)
  168. if(KEY1==0)
  169. {
  170. res=f_open(&fsrc, (const TCHAR*)filename, FA_READ); //打开文件,如果文件不存在,则创建该文件
  171. if(res!=FR_OK) //判断是否打开成功
  172. {
  173. LCD_ShowString(10,220,tftlcd_data.width,tftlcd_data.height,16,"f_open error!");
  174. }
  175. res=f_read(&fsrc, buffer, sizeof(buffer), &br); //读取SD卡指定路径的内容,并存放在buffer数组中
  176. if(res!=FR_OK) //判断是否读取成功
  177. {
  178. LCD_ShowString(10,240,tftlcd_data.width,tftlcd_data.height,16,"f_read error!");
  179. }
  180. else //如果读取成功,则使用LCD显示
  181. {
  182. LCD_ShowString(10,240,tftlcd_data.width,tftlcd_data.height,16,"f_read ok!");
  183. LCD_ShowString(10,260,tftlcd_data.width,tftlcd_data.height,16,buffer);
  184. }
  185. f_close(&fsrc);
  186. }
  187. }
  188. }
  189. FatFs 模块为应用程序提供了下列函数:
  190. 1.f_mount
  191. FatFs 模块上注册 / 注销一个工作区 ( 文件系统对象 )
  192. FRESULT f_mount (
  193. BYTE Drive, /* 逻辑驱动器号 */
  194. FATFS* FileSystemObject /* 工作区指针 */
  195. );
  196. 参数
  197. Drive
  198. 注册 / 注销工作区的逻辑驱动器号 (0-9)
  199. FileSystemObject
  200. 工作区 ( 文件系统对象 ) 指针。
  201. 返回值
  202. FR_OK (0)
  203. 函数成功。
  204. FR_INVALID_DRIVE
  205. 驱动器号无效
  206. f_mount 函数在 FatFs 模块上注册 / 注销一个工作区。 在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。要注销一个工作区,只要指定 FileSystemObject NULL 即可,然后该工作区可以被丢弃。
  207. 该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘 I/O 层。卷装入过程是在f_mount 函数后或存储介质改变后的第一次文件访问时完成的。
  208. 2.f_open
  209. 创建 / 打开一个用于访问文件的文件对象
  210. FRESULT f_open (
  211. FIL* FileObject, /* 空白文件对象结构指针 */
  212. const XCHAR* FileName, /* 文件名指针 */
  213. BYTE ModeFlags /* 模式标志 */
  214. );
  215. 参数
  216. FileObject
  217. 将被创建的文件对象结构的指针。
  218. FileName
  219. NULL 结尾的字符串指针,该字符串指定了将被创建或打开的文件名。
  220. ModeFlags
  221. 指定文件的访问类型和打开方法。它是由下列标志的一个组合指定的。
  222. 模式
  223. 描述
  224. FA_READ
  225. 指定读访问对象。可以从文件中读取数据。与 FA_WRITE 结合可以进行读写访问。
  226. FA_WRITE
  227. 指定写访问对象。可以向文件中写入数据。与 FA_READ 结合可以进行读写访问。
  228. FA_OPEN_EXISTING
  229. 打开文件。如果文件不存在,则打开失败。 ( 默认 )
  230. FA_OPEN_ALWAYS
  231. 如果文件存在,则打开;否则,创建一个新文件。
  232. FA_CREATE_NEW
  233. 创建一个新文件。如果文件已存在,则创建失败。
  234. FA_CREATE_ALWAYS
  235. 创建一个新文件。如果文件已存在,则它将被截断并覆盖。
  236. 注意:当 _FS_READONLY == 1 时,模式标志 FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS 是无效的。
  237. 返回值
  238. FR_OK (0)
  239. 函数成功,该文件对象有效。
  240. FR_NO_FILE
  241. 找不到该文件。
  242. FR_NO_PATH
  243. 找不到该路径。
  244. FR_INVALID_NAME
  245. 文件名无效。
  246. FR_INVALID_DRIVE
  247. 驱动器号无效。
  248. FR_EXIST
  249. 该文件已存在。
  250. FR_DENIED
  251. 由于下列原因,所需的访问被拒绝:
  252. n 以写模式打开一个只读文件。
  253. n 由于存在一个同名的只读文件或目录,而导致文件无法被创建。
  254. n 由于目录表或磁盘已满,而导致文件无法被创建。
  255. FR_NOT_READY
  256. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  257. FR_WRITE_PROTECTED
  258. 在存储介质被写保护的情况下,以写模式打开或创建文件对象。
  259. FR_DISK_ERR
  260. 由于底层磁盘 I/O 接口函数中的一个错误,而导致该函数失败。
  261. FR_INT_ERR
  262. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  263. FR_NOT_ENABLED
  264. 逻辑驱动器没有工作区。
  265. FR_NO_FILESYSTEM
  266. 磁盘上没有有效地 FAT 卷。
  267. 如果函数成功,则创建一个文件对象。该文件对象被后续的读 / 写函数用来访问文件。如果想要关闭一个打开的文件对象,则使用 f_close 函数。如果不关闭修改后的文件,那么文件可能会崩溃。在使用任何文件函数之前,必须使用 f_mount 函数为驱动器注册一个工作区。只有这样,其他文件函数才能正常工作。
  268. 3.f_close
  269. 关闭一个打开的文件
  270. FRESULT f_close (
  271. FIL* FileObject /* 文件对象结构的指针 */
  272. );
  273. 参数
  274. FileObject
  275. 指向将被关闭的已打开的文件对象结构的指针。
  276. 返回值
  277. FR_OK (0)
  278. 文件对象已被成功关闭。
  279. FR_DISK_ERR
  280. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  281. FR_INT_ERR
  282. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  283. FR_NOT_READY
  284. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  285. FR_INVALID_OBJECT
  286. 文件对象无效。
  287. f_close 函数关闭一个打开的文件对象。无论向文件写入任何数据,文件的缓存信息都将被写回到磁盘。该函数成功后,文件对象不再有效,并且可以被丢弃。如果文件对象是在只读模式下打开的,不需要使用该函数,也能被丢弃。
  288. 4.f_read
  289. 从一个文件读取数据
  290. FRESULT f_read (
  291. FIL* FileObject, /* 文件对象结构的指针 */
  292. void* Buffer, /* 存储读取数据的缓冲区的指针 */
  293. UINT ByteToRead, /* 要读取的字节数 */
  294. UINT* ByteRead /* 返回已读取字节数变量的指针 */
  295. );
  296. 参数
  297. FileObject
  298. 指向将被读取的已打开的文件对象结构的指针。
  299. Buffer
  300. 指向存储读取数据的缓冲区的指针。
  301. ByteToRead
  302. 要读取的字节数, UINT 范围内。
  303. ByteRead
  304. 指向返回已读取字节数的 UINT 变量的指针。在调用该函数后,无论结果如何,数值都是有效的。
  305. 返回值
  306. FR_OK (0)
  307. 函数成功。
  308. FR_DENIED
  309. 由于文件是以非读模式打开的,而导致该函数被拒绝。
  310. FR_DISK_ERR
  311. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  312. FR_INT_ERR
  313. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  314. FR_NOT_READY
  315. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  316. FR_INVALID_OBJECT 文件对象无效。
  317. 文件对象中的读 / 写指针以已读取字节数增加。该函数成功后,应该检查 *ByteRead 来检测文件是否结束。在读操作过程中,一旦 *ByteRead < ByteToRead ,则读 / 写指针到达了文件结束位置。
  318. 5.f_write
  319. 写入数据到一个文件
  320. FRESULT f_write (
  321. FIL* FileObject, /* 文件对象结构的指针 */
  322. const void* Buffer, /* 存储写入数据的缓冲区的指针 */
  323. UINT ByteToWrite, /* 要写入的字节数 */
  324. UINT* ByteWritten /* 返回已写入字节数变量的指针 */
  325. );
  326. 参数
  327. FileObject
  328. 指向将被写入的已打开的文件对象结构的指针。
  329. Buffer
  330. 指向存储写入数据的缓冲区的指针。
  331. ByteToRead
  332. 要写入的字节数, UINT 范围内。
  333. ByteRead
  334. 指向返回已写入字节数的 UINT 变量的指针。在调用该函数后,无论结果如何,数值都是有效的。
  335. 返回值
  336. FR_OK (0)
  337. 函数成功。
  338. FR_DENIED
  339. 由于文件是以非写模式打开的,而导致该函数被拒绝。
  340. FR_DISK_ERR
  341. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  342. FR_INT_ERR
  343. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  344. FR_NOT_READY
  345. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  346. FR_INVALID_OBJECT 文件对象无效。
  347. 文件对象中的读 / 写指针以已写入字节数增加。该函数成功后,应该检查 *ByteWritten 来检测磁盘是否已满。在写操作过程中,一旦 *ByteWritten < *ByteToWritten ,则意味着该卷已满。
  348. 6.f_lseek
  349. 移动一个打开的文件对象的文件读 / 写指针。也可以被用来扩展文件大小 ( 簇预分配 )
  350. FRESULT f_lseek (
  351. FIL* FileObject, /* 文件对象结构指针 */
  352. DWORD Offset /* 文件字节偏移 */
  353. );
  354. 参数
  355. FileObject
  356. 打开的文件对象的指针
  357. Offset
  358. 相对于文件起始处的字节数
  359. 返回值
  360. FR_OK (0)
  361. 函数成功。
  362. FR_DISK_ERR
  363. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  364. FR_INT_ERR
  365. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  366. FR_NOT_READY
  367. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  368. FR_INVALID_OBJECT 文件对象无效。
  369. f_lseek 函数当 FS_MINIMIZE <= 2 时可用。offset 只能被指定为相对于文件起始处的字节数。当在写模式下指定了一个超过文件大小的 offset 时,文件的大小将被扩展,并且该扩展的区域中的数据是未定义的。这适用于为快速写操作迅速地创建一个大的文件。f_lseek 函数成功后,为了确保读 / 写指针已被正确地移动,必须检查文件对象中的成员 fptr 。如果 fptr 不是所期望的值,则发生了下列情况之一。
  370. n 文件结束。指定的 offset 被钳在文件大小,因为文件已被以只读模式打开。
  371. n 磁盘满。卷上没有足够的空闲空间去扩展文件大小。
  372. 7.f_truncate
  373. 截断文件大小
  374. FRESULT f_truncate (
  375. FIL* FileObject /* 文件对象结构指针 */
  376. );
  377. 参数
  378. FileObject
  379. 待截断的打开的文件对象的指针。
  380. 返回值
  381. FR_OK (0
  382. 函数成功。
  383. FR_DENIED
  384. 由于文件是以非写模式打开的,而导致该函数被拒绝。
  385. FR_DISK_ERR
  386. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  387. FR_INT_ERR
  388. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  389. FR_NOT_READY
  390. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  391. FR_INVALID_OBJECT 文件对象无效。
  392. f_truncate 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  393. f_truncate 函数截断文件到当前的文件读 / 写指针。当文件读 / 写指针已经指向文件结束时,该函数不起作用。
  394. 8.f_sync
  395. 冲洗一个写文件的缓存信息
  396. FRESULT f_sync (
  397. FIL* FileObject /* 文件对象结构的指针 */
  398. );
  399. 参数
  400. FileObject
  401. 待冲洗的打开的文件对象的指针。
  402. 返回值
  403. FR_OK (0)
  404. 函数成功。
  405. FR_DISK_ERR
  406. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  407. FR_INT_ERR
  408. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  409. FR_NOT_READY
  410. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  411. FR_INVALID_OBJECT 文件对象无效。
  412. f_sync 函数当 _FS_READONLY == 0 时可用。
  413. f_sync 函数和 f_close 函数执行同样的过程,但是文件仍处于打开状态,并且可以继续对文件执行读 / / 移动指针操作。这适用于以写模式长时间打开文件,比如数据记录器。定期的或 f_write 后立即执行 f_sync 可以将由于突然断电或移去磁盘而导致数据丢失的风险最小化。在 f_close 前立即执行 f_sync 没有作用,因为在 f_close 中执行了 f_sync 。换句话说,这两个函数的差异就是文件对象是不是无效的。
  414. 9.f_opendir
  415. 打开一个目录
  416. FRESULT f_opendir (
  417. DIR* DirObject, /* 空白目录对象结构的指针 */
  418. const XCHAR* DirName /* 目录名的指针 */
  419. );
  420. 参数
  421. DirObject
  422. 待创建的空白目录对象的指针。
  423. DirName
  424. '\0' 结尾的字符串指针,该字符串指定了将被打开的目录名。
  425. 返回值
  426. FR_OK (0)
  427. 函数成功,目录对象被创建。该目录对象被后续调用,用来读取目录项。
  428. FR_NO_PATH
  429. 找不到路径。
  430. FR_INVALID_NAME
  431. 路径名无效。
  432. FR_INVALID_DRIVE
  433. 驱动器号无效。
  434. FR_NOT_READY
  435. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  436. FR_DISK_ERR
  437. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  438. FR_INT_ERR
  439. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  440. FR_NOT_ENABLED
  441. 逻辑驱动器没有工作区。
  442. FR_NO_FILESYSTEM
  443. 磁盘上没有有效的 FAT 卷。
  444. f_opendir 函数当 _FS_MINIMIZE <= 1 时可用。
  445. f_opendir 函数打开一个已存在的目录,并为后续的调用创建一个目录对象。该目录对象结构可以在任何时候不经任何步骤而被丢弃。
  446. 10.f_readdir
  447. 读取目录项
  448. FRESULT f_readdir (DIR* DirObject, /* 指向打开的目录对象结构的指针 */
  449. FILINFO* FileInfo /* 指向文件信息结构的指针 */
  450. );
  451. 参数
  452. DirObject
  453. 打开的目录对象的指针。
  454. FileInfo
  455. 存储已读取项的文件信息结构指针。
  456. 返回值
  457. FR_OK (0)
  458. 函数成功。
  459. FR_DISK_ERR
  460. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  461. FR_INT_ERR
  462. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  463. FR_NOT_READY
  464. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  465. FR_INVALID_OBJECT 文件对象无效。
  466. f_readdir 函数当 _FS_MINIMIZE <= 1 时可用。
  467. f_readdir 函数顺序读取目录项。目录中的所有项可以通过重复调用 f_readdir 函数被读取。当所有目录项已被读取并且没有项要读取时,该函数没有任何错误地返回一个空字符串到 f_name[] 成员中。当 FileInfo 给定一个空指针时,目录对象的读索引将被回绕。
  468. LFN 功能被使能时,在使用 f_readdir 函数之前,文件信息结构中的 lfname lfsize 必须被初始化为有效数值。 lfname 是一个返回长文件名的字符串缓冲区指针。 lfsize 是以字符为单位的字符串缓冲区的大小。如果读缓冲区或 LFN 工作缓冲区的大小 ( 对于 LFN) 不足,或者对象没有 LFN ,则一个空字符串将被返回到 LFN 读缓冲区。如果 LFN 包含任何不能被转换为 OEM 代码的字符,则一个空字符串将被返回,但是这不是 Unicode API配置的情况。当 lfname 是一个空字符串时,没有 LFN 的任何数据被返回。当对象没有 LFN 时,任何小型大写字母可以被包含在 SFN 中。
  469. 当相对路径功能被使能 (_FS_RPATH == 1) 时, "." ".." 目录项不会被过滤掉,并且它将出现在读目录项中。
  470. 11.f_getfree
  471. 获取空闲簇的数目
  472. FRESULT f_getfree (
  473. const XCHAR* Path, /* 驱动器的根目录 */
  474. DWORD* Clusters, /* 存储空闲簇数目变量的指针 */
  475. FATFS** FileSystemObject /* 文件系统对象指针的指针 */
  476. );
  477. 参数
  478. Path
  479. '\0' 结尾的字符串指针,该字符串指定了逻辑驱动器的目录。
  480. Clusters
  481. 存储空闲簇数目的 DWORD 变量的指针。
  482. FileSystemObject
  483. 相应文件系统对象指针的指针。
  484. 返回值
  485. FR_OK (0)
  486. 函数成功。 *Clusters 表示空闲簇的数目,并且 *FileSystemObject 指向文件系统对象。
  487. FR_INVALID_DRIVE
  488. 驱动器号无效。
  489. FR_NOT_READY
  490. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  491. FR_DISK_ERR
  492. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  493. FR_INT_ERR
  494. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  495. FR_NOT_ENABLED
  496. 逻辑驱动器没有工作区。
  497. FR_NO_FILESYSTEM
  498. 磁盘上没有有效的 FAT 卷。
  499. f_getfree 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时有效。
  500. f_getfree 函数获取驱动器上空闲簇的数目。文件系统对象中的成员 csize 是每簇中的扇区数,因此,以扇区为单位的空闲空间可以被计算出来。当 FAT32 卷上的 FSInfo 结构不同步时,该函数返回一个错误的空闲簇计数。
  501. 12.f_stat
  502. 获取文件状态
  503. FRESULT f_stat (
  504. const XCHAR* FileName, /* 文件名或目录名的指针 */
  505. FILINFO* FileInfo /* FILINFO 结构的指针 */
  506. );
  507. 参数
  508. FileName
  509. '\0' 结尾的字符串指针,该字符串指定了待获取其信息的文件或目录。
  510. FileInfo
  511. 存储信息的空白 FILINFO 结构的指针。
  512. 返回值
  513. FR_OK (0)
  514. 函数成功。
  515. FR_NO_FILE
  516. 找不到文件或目录。
  517. FR_NO_PATH
  518. 找不到路径。
  519. FR_INVALID_NAME
  520. 路径名无效。
  521. FR_INVALID_DRIVE
  522. 驱动器号无效。
  523. FR_NOT_READY
  524. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  525. FR_DISK_ERR
  526. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  527. FR_INT_ERR
  528. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  529. FR_NOT_ENABLED
  530. 逻辑驱动器没有工作区。
  531. FR_NO_FILESYSTEM
  532. 磁盘上没有有效的 FAT 卷。
  533. f_stat 函数当 _FS_MINIMIZE == 0 时可用。
  534. f_stat 函数获取一个文件或目录的信息。信息的详情,请参考 FILINFO 结构和 f_readdir 函数。
  535. 13.f_mkdir
  536. 创建一个目录
  537. FRESULT f_mkdir (
  538. const XCHAR* DirName /* 目录名的指针 */
  539. );
  540. 参数
  541. DirName
  542. '\0' 结尾的字符串指针,该字符串指定了待创建的目录名。
  543. 返回值
  544. FR_OK (0)
  545. 函数成功。
  546. FR_NO_PATH
  547. 找不到路径。
  548. FR_INVALID_NAME
  549. 路径名无效。
  550. FR_INVALID_DRIVE
  551. 驱动器号无效。
  552. FR_DENIED
  553. 由于目录表或磁盘满,而导致目录不能被创建。
  554. FR_EXIST
  555. 已经存在同名的文件或目录。
  556. FR_NOT_READY
  557. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  558. FR_WRITE_PROTECTED
  559. 存储介质被写保护。
  560. FR_DISK_ERR
  561. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  562. FR_INT_ERR
  563. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  564. FR_NOT_ENABLED
  565. 逻辑驱动器没有工作区。
  566. FR_NO_FILESYSTEM
  567. 磁盘上没有有效的 FAT 卷。
  568. f_mkdir 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  569. f_mkdir 函数创建一个新目录。
  570. 14.f_unlink
  571. 移除一个对象
  572. FRESULT f_unlink (
  573. const XCHAR* FileName /* 对象名的指针 */
  574. );
  575. 参数
  576. FileName
  577. '\0' 结尾的字符串指针,该字符串指定了一个待移除的对象。
  578. 返回值
  579. FR_OK (0)
  580. 函数成功。
  581. FR_NO_FILE
  582. 找不到文件或目录。
  583. FR_NO_PATH
  584. 找不到路径。
  585. FR_INVALID_NAME
  586. 路径名无效。
  587. FR_INVALID_DRIVE
  588. 驱动器号无效。
  589. FR_DENIED
  590. 由于下列原因之一,而导致该函数被拒绝:
  591. n ★对象具有只读属性
  592. n ★目录不是空的
  593. FR_NOT_READY
  594. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  595. FR_WRITE_PROTECTED
  596. 存储介质被写保护。
  597. FR_DISK_ERR
  598. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  599. FR_INT_ERR
  600. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  601. FR_NOT_ENABLED
  602. 逻辑驱动器没有工作区。
  603. FR_NO_FILESYSTEM
  604. 磁盘上没有有效的 FAT 卷。
  605. f_unlink 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  606. f_unlink 函数移除一个对象。不要移除打开的对象或当前目录。
  607. 15.f_chmod
  608. 修改一个文件或目录的属性。
  609. FRESULT f_chmod (
  610. const XCHAR* FileName, /* 文件或目录的指针 */
  611. BYTE Attribute, /* 属性标志 */
  612. BYTE AttributeMask /* 属性掩码 */
  613. );
  614. 参数
  615. FileName
  616. '\0' 结尾的字符串指针,该字符串指定了一个待被修改属性的文件或目录。
  617. Attribute
  618. 待被设置的属性标志,可以是下列标志的一个或任意组合。指定的标志被设置,其他的被清除。
  619. 属性 描述
  620. AM_RDO 只读
  621. AM_ARC 存档
  622. AM_SYS 系统
  623. AM_HID 隐藏
  624. AttributeMask
  625. 属性掩码,指定修改哪个属性。指定的属性被设置或清除。
  626. 返回值
  627. FR_OK (0)
  628. 函数成功。
  629. FR_NO_FILE
  630. 找不到文件或目录。
  631. FR_NO_PATH
  632. 找不到路径。
  633. FR_INVALID_NAME
  634. 路径名无效。
  635. FR_INVALID_DRIVE
  636. 驱动器号无效。
  637. FR_NOT_READY
  638. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  639. FR_WRITE_PROTECTED
  640. 存储介质被写保护。
  641. FR_DISK_ERR
  642. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  643. FR_INT_ERR
  644. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  645. FR_NOT_ENABLED
  646. 逻辑驱动器没有工作区。
  647. FR_NO_FILESYSTEM
  648. 磁盘上没有有效的 FAT 卷。
  649. f_chmod 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  650. f_chmod 函数修改一个文件或目录的属性。
  651. 16.f_utime
  652. f_utime 函数修改一个文件或目录的时间戳。
  653. FRESULT f_utime (
  654. const XCHAR* FileName, /* 文件或目录路径的指针 */
  655. const FILINFO* TimeDate /* 待设置的时间和日期 */
  656. );
  657. 参数
  658. FileName
  659. '\0' 结尾的字符串的指针,该字符串指定了一个待修改时间戳的文件或目录。
  660. TimeDate
  661. 文件信息结构指针,其中成员 ftime fdata 存储了一个待被设置的的时间戳。不关心任何其他成员。
  662. 返回值
  663. FR_OK (0)
  664. 函数成功。
  665. FR_NO_FILE
  666. 找不到文件或目录。
  667. FR_NO_PATH
  668. 找不到路径。
  669. FR_INVALID_NAME
  670. 路径名无效。
  671. FR_INVALID_DRIVE
  672. 驱动器号无效。
  673. FR_NOT_READY
  674. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  675. FR_WRITE_PROTECTED
  676. 存储介质被写保护。
  677. FR_DISK_ERR
  678. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  679. FR_INT_ERR
  680. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  681. FR_NOT_ENABLED
  682. 逻辑驱动器没有工作区。
  683. FR_NO_FILESYSTEM
  684. 磁盘上没有有效的 FAT 卷。
  685. f_utime 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  686. f_utime 函数修改一个文件或目录的时间戳。
  687. 17.f_rename
  688. 重命名一个对象。
  689. FRESULT f_rename (const XCHAR* OldName, /* 原对象名的指针 */
  690. const XCHAR* NewName /* 新对象名的指针 */
  691. );
  692. 参数
  693. OldName
  694. '\0' 结尾的字符串的指针,该字符串指定了待被重命名的原对象名。
  695. NewName
  696. '\0' 结尾的字符串的指针,该字符串指定了重命名后的新对象名,不能包含驱动器号。
  697. 返回值
  698. FR_OK (0)
  699. 函数成功。
  700. FR_NO_FILE
  701. 找不到原名。
  702. FR_NO_PATH
  703. 找不到路径。
  704. FR_INVALID_NAME
  705. 文件名无效。
  706. FR_INVALID_DRIVE
  707. 驱动器号无效。
  708. FR_NOT_READY
  709. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  710. FR_EXIST
  711. 新名和一个已存在的对象名冲突。
  712. FR_DENIED
  713. 由于任何原因,而导致新名不能被创建。
  714. FR_WRITE_PROTECTED
  715. 存储介质被写保护。
  716. FR_DISK_ERR
  717. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  718. FR_INT_ERR
  719. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  720. FR_NOT_ENABLED
  721. 逻辑驱动器没有工作区。
  722. FR_NO_FILESYSTEM
  723. 磁盘上没有有效的 FAT 卷。
  724. f_rename 函数当 _FS_READONLY == 0 并且 _FS_MINIMIZE == 0 时可用。
  725. f_rename 函数重命名一个对象,并且也可以将对象移动到其他目录。逻辑驱动器号由原名决定,新名不能包含一个逻辑驱动器号。不要重命名打开的对象。
  726. 18.f_mkfs
  727. 在驱动器上创建一个文件系统
  728. FRESULT f_mkfs (
  729. BYTE Drive, /* 逻辑驱动器号 */
  730. BYTE PartitioningRule, /* 分区规则 */
  731. WORD AllocSize /* 分配单元大小 */
  732. );
  733. 参数
  734. Drive
  735. 待格式化的逻辑驱动器号 (0-9)
  736. PartitioningRule
  737. 当给定 0 时,首先在驱动器上的第一个扇区创建一个分区表,然后文件系统被创建在分区上。这被称为FDISK 格式化,用于硬盘和存储卡。当给定 1 时,文件系统从第一个扇区开始创建,而没有分区表。这被称为超级软盘 (SFD) 格式化,用于软盘和可移动磁盘。
  738. AllocSize
  739. 指定每簇中以字节为单位的分配单元大小。数值必须是 0 或从 512 32K 之间 2 的幂。当指定 0 时,簇大小取决于卷大小。
  740. 返回值
  741. FR_OK (0)
  742. 函数成功。
  743. FR_INVALID_DRIVE
  744. 驱动器号无效。
  745. FR_NOT_READY
  746. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  747. FR_WRITE_PROTECTED
  748. 驱动器被写保护。
  749. FR_NOT_ENABLED
  750. 逻辑驱动器没有工作区。
  751. FR_DISK_ERR
  752. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  753. FR_MKFS_ABORTED
  754. 由于下列原因之一,而导致函数在开始格式化前终止:
  755. n 磁盘容量太小
  756. n 参数无效
  757. n 该驱动器不允许的簇大小。
  758. f_mkfs 函数当 _FS_READOLNY == 0 并且 _USE_MKFS == 1 时可用。
  759. f_mkfs 函数在驱动器中创建一个 FAT 文件系统。对于可移动媒介,有两种分区规则: FDISK SFD ,通过参数PartitioningRule 选择。 FDISK 格式在大多数情况下被推荐使用。该函数当前不支持多分区,因此,物理驱动器上已存在的分区将被删除,并且重新创建一个占据全部磁盘空间的新分区。
  760. 根据 Microsoft 发布的 FAT 规范, FAT 分类: FAT12/FAT16/FAT32 ,由驱动器上的簇数决定。因此,选择哪种 FAT 分类,取决于卷大小和指定的簇大小。簇大小影响文件系统的性能,并且大簇会提高性能。
  761. 19.f_forward
  762. 读取文件数据并将其转发到数据流设备。
  763. FRESULT f_forward (
  764. FIL* FileObject, /* 文件对象 */
  765. UINT (*Func)(const BYTE*,UINT), /* 数据流函数 */
  766. UINT ByteToFwd, /* 要转发的字节数 */
  767. UINT* ByteFwd /* 已转发的字节数 */
  768. );
  769. 参数
  770. FileObject
  771. 打开的文件对象的指针。
  772. Func
  773. 用户定义的数据流函数的指针。详情参考示例代码。
  774. ByteToFwd
  775. 要转发的字节数, UINT 范围内。
  776. ByteFwd
  777. 返回已转发的字节数的 UINT 变量的指针。
  778. 返回值
  779. FR_OK (0)
  780. 函数成功。
  781. FR_DENIED
  782. 由于文件已经以非读模式打开,而导致函数失败。
  783. FR_DISK_ERR
  784. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  785. FR_INT_ERR
  786. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  787. FR_NOT_READY
  788. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  789. FR_INVALID_OBJECT
  790. 文件对象无效。
  791. f_forward 函数当 _USE_FORWARD == 1 并且 _FS_TINY == 1 时可用。
  792. f_forward 函数从文件中读取数据并将数据转发到输出流,而不使用数据缓冲区。这适用于小存储系统,因为它在应用模块中不需要任何数据缓冲区。文件对象的文件指针以转发的字节数增加。如果 *ByteFwd < ByteToFwd 并且没有错误,则意味着由于文件结束或在数据传输过程中流忙,请求的字节不能被传输。
  793. 20.f_chdir
  794. f_chdir 函数改变一个驱动器的当前目录。
  795. FRESULT f_chdir (
  796. const XCHAR* Path /* 路径名的指针 */
  797. );
  798. 参数
  799. Path
  800. '\0' 结尾的字符串的指针,该字符串指定了将要进去的目录。
  801. 返回值
  802. FR_OK (0)
  803. 函数成功。
  804. FR_NO_PATH
  805. 找不到路径。
  806. FR_INVALID_NAME
  807. 路径名无效。
  808. FR_INVALID_DRIVE
  809. 驱动器号无效。
  810. FR_NOT_READY
  811. 由于驱动器中没有存储介质或任何其他原因,而导致磁盘驱动器无法工作。
  812. FR_DISK_ERR
  813. 由于底层磁盘 I/O 函数中的错误,而导致该函数失败。
  814. FR_INT_ERR
  815. 由于一个错误的 FAT 结构或一个内部错误,而导致该函数失败。
  816. FR_NOT_ENABLED
  817. 逻辑驱动器没有工作区。
  818. FR_NO_FILESYSTEM
  819. 磁盘上没有有效的 FAT 卷。
  820. f_chdir 函数当 _FS_RPATH == 1 时可用。
  821. f_chdir 函数改变一个逻辑驱动器的当前目录。当一个逻辑驱动器被自动挂载时,它的当前目录被初始化为根目录。注意:当前目录被保存在每个文件系统对象中,因此它也影响使用同一逻辑驱动器的其它任务。
  822. 21.f_chdrive
  823. f_chdrive 函数改变当前驱动器。
  824. FRESULT f_chdrive (
  825. BYTE Drive /* 逻辑驱动器号 */
  826. );
  827. Drive
  828. 指定将被设置为当前驱动器的逻辑驱动器号。
  829. 返回值
  830. FR_OK (0)
  831. 函数成功。
  832. FR_INVALID_DRIVE
  833. 驱动器号无效。
  834. f_chdrive 函数当 _FS_RPATH == 1 时可用。
  835. f_chdrive 函数改变当前驱动器。当前驱动器号初始值为 0 ,注意:当前驱动器被保存为一个静态变量,因此它也影响使用文件函数的其它任务。
  836. 22.f_gets
  837. f_gets 从文件中读取一个字符串。
  838. char* f_gets (
  839. char* Str, /* 读缓冲区 */
  840. int Size, /* 读缓冲区大小 */
  841. FIL* FileObject /* 文件对象 */
  842. );
  843. 参数
  844. Str
  845. 存储读取字符串的读缓冲区指针。
  846. Size
  847. 读缓冲区大小。
  848. FileObject
  849. 打开的文件对象结构指针。
  850. 返回值
  851. 当函数成功后, Str 将被返回。
  852. f_gets 函数当 _USE_STRFUNC == 1 或者 _USE_STRFUNC == 2 时可用。如果 _USE_STRFUNC == 2 ,文件中包含的 '\r' 则被去除。
  853. f_gets 函数是 f_read 的一个封装函数。当读取到 '\n' 、文件结束或缓冲区被填冲了 Size - 1 个字符时,读操作结束。读取的字符串以 '\0' 结束。当文件结束或读操作中发生了任何错误, f_gets() 返回一个空字符串。可以使用宏 f_eof() f_error() 检查 EOF 和错误状态。
  854. 23.f_putc
  855. f_putc 函数向文件中写入一个字符。
  856. int f_putc (
  857. int Chr, /* 字符 */
  858. FIL* FileObject /* 文件对象 */
  859. );
  860. 参数
  861. Chr
  862. 待写入的字符。
  863. FileObject
  864. 打开的文件对象结构的指针。
  865. 返回值
  866. 当字符被成功地写入后,函数返回该字符。由于磁盘满或任何错误而导致函数失败,将返回 EOF
  867. 描述
  868. f_putc 函数当 (_FS_READONLY == 0)&&(_USE_STRFUNC == 1 || _USE_STRFUNC == 2) 时可用。当_USE_STRFUNC == 2 时,字符 '\n' 被转换为 "\r\n" 写入文件中。
  869. f_putc 函数是 f_write 的一个封装函数。
  870. 24.f_puts
  871. f_puts 函数向文件中写入一个字符串。
  872. int f_puts (
  873. const char* Str, /* 字符串指针 */
  874. FIL* FileObject /* 文件对象指针 */
  875. );
  876. 参数
  877. Str
  878. 待写入的 '\0' 结尾的字符串的指针。 '\0' 字符不会被写入。
  879. FileObject
  880. 打开的文件对象结构的指针。
  881. 返回值
  882. 函数成功后,将返回写入的字符数。由于磁盘满或任何错误而导致函数失败,将返回 EOF
  883. f_puts() (_FS_READONLY == 0)&&(_USE_STRFUNC == 1 || _USE_STRFUNC == 2) 时可用。当_USE_STRFUNC == 2 时,字符串中的 '\n' 被转换为 "\r\n" 写入文件中。
  884. f_puts() f_putc() 的一个封装函数。
  885. 25.f_printf
  886. f_printf 函数向文件中写入一个格式化字符串。
  887. int f_printf (
  888. FIL* FileObject, /* 文件对象指针 */
  889. const char* Foramt, /* 格式化字符串指针 */
  890. ...
  891. );
  892. 参数
  893. FileObject
  894. 已打开的文件对象结构的指针。
  895. Format
  896. '\0' 结尾的格式化字符串指针。
  897. ...
  898. 可选参数
  899. 返回值
  900. 函数成功后,将返回写入的字符数。由于磁盘满或任何错误而导致函数失败,将返回 EOF
  901. f_printf 函数当 (_FS_READONLY == 0)&&(_USE_STRFUNC == 1 || _USE_STRFUNC == 2) 时可用。当 _USE_STRFUNC == 2 时,包含在格式化字符串中的 '\n' 将被转换成 "\r\n" 写入文件中。 f_printf 函数是 f_putc f_puts 的一个封装函数。如下所示,格式控制符是标准库的一个子集:
  902. 类型: c s d u X
  903. 大小: l
  904. 标志: 0
  905. 磁盘I/O接口
  906. 由于FatFs模块完全与磁盘I/O层分开,因此底层磁盘I/O需要下列函数去读/写物理磁盘以及获取当前时间。由于底层磁盘I/O模块并不是FatFs的一部分,因此它必须由用户提供。
  907. 26.disk_initialize
  908. 初始化磁盘驱动器
  909. DSTATUS disk_initialize (
  910. BYTE Drive /* 物理驱动器号 */
  911. );
  912. 参数
  913. Drive
  914. 指定待初始化的物理驱动器号。
  915. 返回值
  916. disk_initialize 函数返回一个磁盘状态作为结果。磁盘状态的详情,参考 disk_status 函数。
  917. disk_initialize 函数初始化一个物理驱动器。函数成功后,返回值中的 STA_NOINIT 标志被清除。disk_initialize 函数被 FatFs 模块在卷挂载过程中调用,去管理存储介质的改变。当 FatFs 模块起作用时,或卷上的 FAT 结构可以被瓦解时,应用程序不能调用该函数。可以使用 f_mount 函数去重新初始化文件系统。
  918. 27.disk_status
  919. 获取当前磁盘的状态
  920. DSTATUS disk_status (
  921. BYTE Drive /* 物理驱动器号 */
  922. );
  923. 参数
  924. Drive
  925. 指定待确认的物理驱动器号。
  926. 返回值
  927. 磁盘状态,是下列标志的组合: STA_NOINIT 指示磁盘驱动器还没有被初始化。当系统复位、磁盘移除和 disk_initialize 函数失败时,该标志被设置;当 disk_initialize 函数成功时,该标志被清除。 STA_NODISK 指示驱动器中没有存储介质。当安装了磁盘驱动器后,该标志始终被清除。
  928. STA_PROTECTED
  929. 指示存储介质被写保护。在不支持写保护缺口的驱动器上,该标志始终被清除。当 STA_NODISK 被设置时,该标志无效。
  930. 28.disk_read
  931. 从磁盘驱动器中读取扇区
  932. DRESULT disk_read (
  933. BYTE Drive, /* 物理驱动器号 */
  934. BYTE* Buffer, /* 读取数据缓冲区的指针 */
  935. DWORD SectorNumber, /* 起始扇区号 */
  936. BYTE SectorCount /* 要读取的扇区数 */
  937. );
  938. 参数
  939. Drive
  940. 指定物理驱动器号。
  941. Buffer
  942. 存储读取数据的缓冲区的指针。该缓冲区大小需要满足要读取的字节数 ( 扇区大小 * 扇区总数。由上层指定的存储器地址可能会也可能不会以字边界对齐。 SectorNumber 指定在逻辑块地址 (LBA) 中的起始扇区号。
  943. SectorCount
  944. 指定要读取的扇区数 (1-255)
  945. 返回值
  946. RES_OK (0)
  947. 函数成功
  948. RES_ERROR
  949. 在读操作过程中发生了不能恢复的硬错误。
  950. RES_PARERR
  951. 无效的参数。
  952. RES_NOTRDY
  953. 磁盘驱动器还没被初始化。
  954. 29.disk_write
  955. 向磁盘驱动器中写入扇区
  956. DRESULT disk_write (
  957. BYTE Drive, /* 物理驱动器号 */
  958. const BYTE* Buffer, /* 写入数据缓冲区的指针 ( 可能未对齐 ) */
  959. DWORD SectorNumber, /* 起始扇区号 */
  960. BYTE SectorCount /* 要写入的扇区数 */
  961. );
  962. 参数
  963. Drive
  964. 指定物理驱动器号。
  965. Buffer
  966. 存储写入数据的缓冲区的指针。由上层指定的存储器地址可能会也可能不会以字边界对齐。
  967. SectorNumber
  968. 指定在逻辑块地址 (LBA) 中的起始扇区号。
  969. SectorCount
  970. 指定要写入的扇区数 (1-255)
  971. 返回值
  972. RES_OK (0)
  973. 函数成功
  974. RES_ERROR
  975. 在读操作过程中发生了不能恢复的硬错误。
  976. RES_WRPRT
  977. 存储介质被写保护。
  978. RES_PARERR
  979. 无效的参数。
  980. RES_NOTRDY
  981. 磁盘驱动器还没被初始化。
  982. 在只读配置中,不需要此函数。
  983. 30.disk_ioctl
  984. 控制设备特定的功能以及磁盘读写以外的其它功能。
  985. DRESULT disk_ioctl (
  986. BYTE Drive, /* 驱动器号 */
  987. BYTE Command, /* 控制命令代码 */
  988. void* Buffer /* 数据传输缓冲区 */
  989. );
  990. 参数
  991. Drive
  992. 指定驱动器号 (1-9)
  993. Command
  994. 指定命令代码。
  995. Buffer
  996. 取决于命令代码的参数缓冲区的指针。当不使用时,指定一个 NULL 指针。
  997. 返回值
  998. RES_OK (0)
  999. 函数成功。
  1000. RES_ERROR
  1001. 发生错误。
  1002. RES_PARERR
  1003. 无效的命令代码。
  1004. RES_NOTRDY
  1005. 磁盘驱动器还没被初始化。
  1006. FatFs 模块只使用下述与设备无关的命令,没有使用任何设备相关功能。
  1007. 命令
  1008. 描述
  1009. GET_SECTOR_SIZE
  1010. 返回驱动器的扇区大小赋给 Buffer 指向的 WORD 变量。在单个扇区大小配置中(_MAX_SS 512) ,不需要该命令。
  1011. GET_SECTOR_COUNT
  1012. 返回总扇区数赋给 Buffer 指向的 DWORD 变量。只在 f_mkfs 函数中,使用了该命令。
  1013. GET_BLOCK_SIZE
  1014. 返回以扇区为单位的存储阵列的擦除块大小赋给 Buffer 指向的 DWORD 变量。当擦除块大小未知或是磁盘设备时,返回 1 。只在 f_mkfs 函数中,使用了该命令。
  1015. 31.get_fattime
  1016. 获取当前时间
  1017. DWORD get_fattime (void);
  1018. 返回值
  1019. 返回的当前时间被打包进一个 DWORD 数值。各位域定义如下:
  1020. bit31:25
  1021. 年,从 1980 年开始算起 (0..127)
  1022. bit24:21
  1023. (1..12)
  1024. bit20:16
  1025. (1..31)
  1026. bit15:11
  1027. (0..23)
  1028. bit10:5
  1029. (0..59)
  1030. bit4:0
  1031. /2(0..29) ,由此可见 FatFs 的时间分辨率为 2
  1032. get_fattime 函数必须返回任何有效的时间,即使系统不支持实时时钟。如果返回一个 0 ,则文件将没有一个有效的时间。在只读配置中,不需要此函数。

发表评论

表情:
评论列表 (有 0 条评论,339人围观)

还没有评论,来说两句吧...

相关阅读