<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

          將FATFS移植STM32RBT6遇到的掛載不成功和返回值問(wèn)題

          作者: 時(shí)間:2016-11-27 來(lái)源:網(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ù)錯(cuò)誤
          }

          //FATFS目前版本僅需處理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三個(gè)命令
          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)然原子的也沒(méi)有問(wèn)題。只要底層沒(méi)有問(wèn)題基本上,應(yīng)用層就不會(huì)有問(wèn)題。如何判別底層函數(shù)呢?在不加fatfs前跟蹤調(diào)試一下看是否初始化能成功和其他的寄存器值是否能讀成功。

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

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

          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 */
          ) ;

          好了,廢話不多說(shuō),把main函數(shù)應(yīng)用層代碼粘貼出來(lái)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);


          }


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();