新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 將FATFS移植STM32RBT6遇到的掛載不成功和返回值問題

        將FATFS移植STM32RBT6遇到的掛載不成功和返回值問題

        作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

        /*-----------------------------------------------------------------------*/
        /* Miscellaneous Functions */

        DRESULT disk_ioctl (
        BYTE drv,/* Physical drive nmuber (0..) */
        BYTE ctrl,/* Control code */
        void *buff/* Buffer to send/receive control data */
        )
        {
        DRESULT res;


        if (drv)
        {
        return RES_PARERR; //僅支持單磁盤操作,否則返回參數(shù)錯誤
        }

        //FATFS目前版本僅需處理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三個命令
        switch(ctrl)
        {
        case CTRL_SYNC:

        res=RES_OK;
        break;

        case GET_BLOCK_SIZE:
        *(WORD*)buff = 512;
        res = RES_OK;
        break;

        case GET_SECTOR_COUNT:
        *(DWORD*)buff = SD_GetCapacity();
        res = RES_OK;
        break;
        default:
        res = RES_PARERR;
        break;
        }

        return res;
        }

        以上代碼是參照網(wǎng)友的,當(dāng)然原子的也沒有問題。只要底層沒有問題基本上,應(yīng)用層就不會有問題。如何判別底層函數(shù)呢?在不加fatfs前跟蹤調(diào)試一下看是否初始化能成功和其他的寄存器值是否能讀成功。

        在sd卡底層沒有問題的情況下再做應(yīng)用層函數(shù)的編寫。

        我在移植時沒有使用內(nèi)存管理機制,所以卡了好幾天,一直以為是底層問題,可是讀sd卡絕對沒有問題,還能播放MP3呢。找不到問題所在頭就大,后來在論壇上留言終于網(wǎng)友點醒了我,原來在定義FATFS *FS;是需要分配內(nèi)存的,據(jù)說空間分配有兩種方式一個是數(shù)組,另一個是定義指針,定義指針時要使用malloc分配內(nèi)存還要free釋放內(nèi)存,而我定義了fatfs結(jié)構(gòu)的指針沒有分配內(nèi)存,造成返回值FR_NO_FILESYSTEM,/* (13) There is no valid FAT volume */,后來我改成fatfs fs;還有一個問題sd卡的掛載驅(qū)動號是1 ,我寫0res= f_mount(&fs,(TCHAR*)0,1); /* Mount a logical drive */;的時候老返回FR_INVALID_DRIVE,/* (11) The logical drive number is invalid */掛載失敗。如果你也遇到這個問題建議改成res= f_mount(&fs,(TCHAR*)1,1);這種形式就行了,但是打開文件和讀文件內(nèi)容時還要這么寫

        res=exf_getfree("0:",&nCapacity,&free);//得到SD卡的總?cè)萘亢褪S嗳萘?br />res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
        res=f_read (
        &file, /* Pointer to the file object */
        buffer,/* Pointer to data buffer */
        512,/* Number of bytes to read */
        &br/* Pointer to number of bytes read */
        ) ;

        好了,廢話不多說,把main函數(shù)應(yīng)用層代碼粘貼出來FATFS fs;
        FIL file; //文件1
        FIL ftemp; //文件2.
        UINT br,bw;//讀寫變量
        FILINFO fileinfo;//文件信息
        DIR dir;
        FILINFO fileInfo;
        UINT br,bw;

        FRESULT res;
        u32 nCapacity;
        char buffer[512];
        int main(void)
        {
        u32 total,free;
        BspInit();
        res= SD_Init();

        if(res==0)
        {

        DebugOut(0, "sd卡初始化成功!");
        }

        res= f_mount(&fs,(TCHAR*)1,1); /* Mount a logical drive */;
        //f_mkfs(0,1,4096);
        res=exf_getfree("0:",&nCapacity,&free);//得到SD卡的總?cè)萘亢褪S嗳萘?br /> DebugOut(0,"總?cè)萘浚?dKB,剩余容量:%dKB",nCapacity,free);
        res=f_open(&file, "0:/test.txt", FA_OPEN_EXISTING|FA_READ);
        res=f_read (
        &file, /* Pointer to the file object */
        buffer,/* Pointer to data buffer */
        512,/* Number of bytes to read */
        &br/* Pointer to number of bytes read */
        ) ;
        DebugOut(0,"buffer:%s",buffer);
        res= f_mount(NULL,(TCHAR*)1,1);
        while(1);


        }


        上一頁 1 2 下一頁

        評論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 平陆县| 开阳县| 饶阳县| 大余县| 青神县| 丽江市| 新昌县| 时尚| 嘉兴市| 个旧市| 呼玛县| 古丈县| 武威市| 太原市| 漠河县| 丹阳市| 淳安县| 湖州市| 扬州市| 高邑县| 陇南市| 江口县| 万载县| 新民市| 永济市| 巴青县| 文登市| 南和县| 磴口县| 正宁县| 康定县| 翁牛特旗| 红河县| 德兴市| 玉门市| 本溪| 兰溪市| 淮滨县| 财经| 保德县| 满洲里市|