去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 !