在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

    
    
    <address id="vxupu"><td id="vxupu"></td></address>

      <pre id="vxupu"><small id="vxupu"></small></pre>
      <dfn id="vxupu"></dfn>
      <div id="vxupu"><small id="vxupu"></small></div>
    1. 新聞中心

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

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

      作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
      開始移植fatfs遇到了諸多問題,很是苦惱啊,移植成功思來之不易,特分享一下經(jīng)驗(yàn)。硬件是STM32F103RBT6內(nèi)存只有20kB,Flash只有128KB,考慮到內(nèi)存有限,就不能支持長文件名了,在原子論壇上下載的所以要改動,在此感謝原子論壇給我?guī)淼膸椭€有安富萊論壇http://bbs.armfly.com/read.php?tid=3601給我?guī)淼膯⑹尽A硗庥布€有一個大的相機(jī)的SD卡,網(wǎng)上買的模塊當(dāng)然也可以自己焊接一個,采用SPI接口,SPI1和SPI2都行,看圖

      本文引用地址:http://www.biyoush.com/article/201611/322277.htm

      移植前做了大量準(zhǔn)備,在網(wǎng)上尤其是原子論壇翻看各種其他人移植的心得,去fatfs的官方網(wǎng)站下載0.10版本的程序,看各種相關(guān)的移植心得,文檔版本眾多,眼花繚亂,花了點(diǎn)時間看了看一些函數(shù)。看得差不多了,就直接把0.10的版本考到自己的工程目錄下開始make,經(jīng)過大量的翻閱和實(shí)踐,要動的地方只有diskio.c和ffconfig.h,第一個需要把底層驅(qū)動函數(shù)sd_inti();添加進(jìn)去。sd卡的讀單塊和讀多塊,寫單塊寫多塊填進(jìn)去,ffconfig.h里邊需要改幾個宏定義的值參照別人的例程就可以實(shí)現(xiàn)很簡單。

      DSTATUS disk_initialize (
      BYTE drv/* Physical drive nmuber (0..) */
      )
      {


      u8 state;
      state=SD_Init();
      if(!state){
      return STA_NODISK;
      }
      return 0;
      }

      /*-----------------------------------------------------------------------*/
      /* Return Disk Status */

      DSTATUS disk_status (
      BYTE drv/* Physical drive nmuber (0..) */
      )
      {return 0;
      }

      /*-----------------------------------------------------------------------*/
      /* Read Sector(s) */

      DRESULT disk_read (
      BYTE drv,/* Physical drive nmuber (0..) */
      BYTE *buff,/* Data buffer to store read data */
      DWORD sector,/* Sector address (LBA) */
      BYTE count/* Number of sectors to read (1..255) */
      )
      {
      u8 res=0;


      if(count==1) //1個sector的讀操作
      {
      res = SD_ReadSingleBlock(sector, buff);
      //res= SD_ReadDisk(buff,sector,count);
      }
      else //多個sector的讀操作
      {
      res = SD_ReadMultiBlock(sector, buff, count);
      }

      //處理返回值,將SPI_SD_driver.c的返回值轉(zhuǎn)成ff.c的返回值
      if(res == 0x00)
      {
      return RES_OK;
      }
      else
      {
      return RES_ERROR;
      }
      }

      /*-----------------------------------------------------------------------*/
      /* Write Sector(s) */

      #if _READONLY == 0
      DRESULT disk_write (
      BYTE drv,/* Physical drive nmuber (0..) */
      const BYTE *buff,/* Data to be written */
      DWORD sector,/* Sector address (LBA) */
      BYTE count/* Number of sectors to write (1..255) */
      )
      {
      u8 res;

      // 讀寫操作
      if(count == 1)
      {
      res = SD_WriteSingleBlock(sector, buff);;
      }
      else
      {
      res = SD_WriteMultiBlock(sector, buff, count);
      }
      // 返回值轉(zhuǎn)換
      if(res == 0)
      {
      return RES_OK;
      }
      else
      {
      return RES_ERROR;
      }
      }
      #endif /* _READONLY */

      /*-----------------------------------------------------------------------*/
      /* 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)存管理機(jī)制,所以卡了好幾天,一直以為是底層問題,可是讀sd卡絕對沒有問題,還能播放MP3呢。找不到問題所在頭就大,后來在論壇上留言終于網(wǎng)友點(diǎn)醒了我,原來在定義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;


      上一頁 1 2 下一頁

      評論


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

      關(guān)閉