USB的FATFS文件系统调试

时间:2021-12-14 16:09:12

  去FATFS官网下载源代码,最新的版本已经到V0.09a

   修改ffconf.h文件里的宏定义

   #define _CODE_PAGE	437

   #define	_USE_LFN	1	/* 0, 1 or 2 */ 
/   0: Disable LFN. _MAX_LFN and _LFN_UNICODE have no effect.
/   1: Enable LFN with static working buffer on the bss. NOT REENTRANT.
/   2: Enable LFN with dynamic working buffer on the STACK.

    #define	_LFN_UNICODE	1	/* 0 or 1 */
/* To switch the character code set on FatFs API to Unicode,
/  enable LFN feature and set _LFN_UNICODE to 1.
*/

   然后出现编译错误

..\APP\usbh_usr.c(582): error:  #167: argument of type "char *" is incompatible with parameter of type "const XCHAR *"

   编译器定位到usbh_usr.c里的 res = f_opendir(&dir, path);

   找到调用的函数的定义FRESULT f_opendir (DIR *dj,const XCHAR *path) 第一参数创建目录对象的指针,第二参数指向目录的路径。再回头编译报错信息,函数的传入参数不匹配,path是char *型数据类型,但是此函数需要的是const XCHAR *数据类型。

   接着分析往前看,原来,上层还有一个函数,static uint8_t Explore_Disk (char* path , uint8_t recu_level),变量path就是从Explore_Disk()这个函数的第一个参数传入的。

   很自然的,我们把函数的参数从char* path改成XCHAR* path后(注意声明函数处也需修改),编译错误指向另一处。

..\APP\usbh_usr.c(476): error:  #167: argument of type "char *" is incompatible with parameter of type "XCHAR *"

   编译器定位到Explore_Disk("0:/", 1);"0:/"在C语言里被识别成char *。可是我们需要XCHAR *类型的参数。

   这里又有一个问题,XCHAR *没听说过,到底是什么样的庐山真面目。

    /* Type of file name on FatFs API */
    #if _LFN_UNICODE && _USE_LFN
    typedef WCHAR XCHAR;/* Unicode */
    #else
    typedef char XCHAR;/* SBCS, DBCS */
    #endif

   我们尝试做如下努力:

   第一、重新定义变量;

           定义变量,XCHAR* a="0:/";或XCHAR a[]="0:/";均报错

..\APP\usbh_usr.c(449): error:  #144: a value of type "char *" cannot be used to initialize an entity of type "XCHAR *"

   第二、数据类型强制转换;

     XCHAR a[]= L"{0:/}";

   编译一下,此编译错误通过了,在字符串前使用L强制成unicode编码。

   因为unicode的宏定义被打开,因此字符串操作函数如strcpy()也要相应改成wcscpy()。

      最后一点,如果此工程勾选了microlib,则出现错误

.\obj\MSC.axf: Error: L6218E: Undefinedsymbol wcsrcpy (referred from usbh_usr.o).

   因此去掉microlib后编译通过。


  that's all.thank you !