找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3573|回復(fù): 3
收起左側(cè)

移植UCOSIII和FATS到IAR工程,芯片STM32F407,最終可以在串口打印寫入SD卡文件

[復(fù)制鏈接]
ID:443686 發(fā)表于 2018-12-10 22:22 | 顯示全部樓層 |閱讀模式
步驟:(1)從ST官網(wǎng)下載stm32F4例程(自帶有USOIII3.04)。           (3)根據(jù)芯片手冊修改部分底層BSP。
            (4)添加任務(wù),配置任務(wù)參數(shù)(優(yōu)先級、堆棧等)。
             (5)書寫主函數(shù)。
             (6)編譯,串口調(diào)試。
0.png

單片機(jī)源程序如下:
  1. #include"myfatapp.h"

  2. /****************************************************************************
  3. * Function Name  : FATFS_GetFree
  4. * Description    : 讀取總磁盤大小和空閑磁盤大小
  5. * Input          : drv:磁盤編號
  6. *                * total:保存讀取到的總磁盤大小
  7. *                * free:保存讀取到的空閑磁盤大小
  8. * Output         : None
  9. * Return         : res:讀取狀態(tài)。0:成功;其他則是其他相應(yīng)的錯(cuò)誤信息。
  10. ****************************************************************************/

  11. uint8_t FATFS_GetFree(uint8_t *drv, uint32_t *total, uint32_t *free)
  12. {
  13.         FATFS *fs1;
  14.         u8 res;
  15.     DWORD fre_clust=0, fre_sect=0, tot_sect=0;

  16.     /* 得到磁盤信息及空閑簇?cái)?shù)量 */
  17.     res = f_getfree((const TCHAR*)drv, &fre_clust, &fs1);

  18.     if(res == 0)  //表示讀取成功
  19.         {                                                                                          
  20.             tot_sect = (fs1->n_fatent-2) * fs1->csize;        //得到總扇區(qū)數(shù)
  21.             fre_sect = fre_clust * fs1->csize;                        //得到空閑扇區(qū)數(shù)
  22.                            
  23. #if _MAX_SS!=512                        //扇區(qū)大小不是512字節(jié),則轉(zhuǎn)換為512字節(jié)
  24.                 tot_sect *= fs1->ssize/512;
  25.                 fre_sect *= fs1->ssize/512;
  26. #endif         

  27.                 *total = tot_sect >> 1;        //單位為KB
  28.                 *free = fre_sect >> 1;        //單位為KB
  29.         }

  30.         return res;        
  31. }

  32. /****************************************************************************
  33. * Function Name  : FATFS_ScanFiles
  34. * Description    : 讀取指定文件下所有文件的名字和后綴
  35. * Input          : dir:掃描的文件路徑
  36. *                * file:用來存放所有文件的名字和后綴的地址
  37. * Output         : None
  38. * Return         : res:返回讀取的狀態(tài)
  39. ****************************************************************************/

  40. uint8_t FATFS_ScanFiles(uint8_t *dir, FileNameTypeDef *file)
  41. {
  42.         FRESULT res;
  43.         FILINFO  fileInfo;
  44.         DIR dirs;
  45.         char *fn, i = 0;

  46. #if _USE_LFN
  47.     static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
  48.     fileInfo.lfname = lfn;
  49.     fileInfo.lfsize = sizeof(lfn);
  50. #endif
  51.         /* 打開文件夾 */
  52.         res = f_opendir(&dirs, (const TCHAR*)dir);
  53.         
  54.         if (res == FR_OK)    //成功打開文件夾
  55.         {   
  56.                 while (f_readdir(&dirs, &fileInfo) == FR_OK)   //按照順序讀文件夾
  57.                 {         
  58.                         if(!fileInfo.fname[0])           //如果文件名為0,結(jié)束
  59.                         {
  60.                                 break;     
  61.                         }         
  62.                         
  63.                         /* 判斷文件屬性 */                                                               
  64.                         if((fileInfo.fattrib == AM_ARC)|(fileInfo.fattrib == AM_DIR))
  65.                         {

  66. #if _USE_LFN        //為長字符串名準(zhǔn)備
  67.                     fn = *fileInfo.lfname ? fileInfo.lfname : fileInfo.fname;
  68. #else
  69.                             fn = fileInfo.fname;
  70. #endif

  71.                                 /* 讀取名字 */
  72.                                 i = 0;
  73.                                while((*fn != '.') && (*fn != '\0')) //有一個(gè)成立就跳出循環(huán)
  74.                                 {
  75.                                         file->name[i] = *fn;
  76.                                         i++;
  77.                                         fn++;        
  78.                                 }

  79.                                 /* 讀取后綴 */
  80.                                 i = 0;
  81.                                 while(*fn != '\0')
  82.                                 {
  83.                                         file->type[i] = *fn;
  84.                                         i++;
  85.                                         fn++;
  86.                                 }
  87.                                 file++;
  88.                         }//end of 文件屬性判斷呢
  89.                 } //end of while (f_readdir(&dirs, &fileInfo) == FR_OK)//按照順序讀文件夾
  90.         }
  91.         return res;
  92. }
復(fù)制代碼

所有資料51hei提供下載:
FATS.rar (3.08 MB, 下載次數(shù): 63)


回復(fù)

使用道具 舉報(bào)

ID:355227 發(fā)表于 2019-4-8 22:36 | 顯示全部樓層
很棒的范例 謝謝
回復(fù)

使用道具 舉報(bào)

ID:229137 發(fā)表于 2022-7-5 09:58 | 顯示全部樓層
正在尋找,fats版本是0.8的
回復(fù)

使用道具 舉報(bào)

ID:340817 發(fā)表于 2023-3-23 18:59 | 顯示全部樓層
很棒的范例 謝謝
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表