久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16406|回復: 3
收起左側

FAT32文件系統+SD卡實例

[復制鏈接]
ID:72008 發表于 2015-1-12 15:10 | 顯示全部樓層 |閱讀模式
     最近對FAT32文件系統的10來個 應用函數“溫故”了一下,比以前的認識提高了很多。FAT32文件系統作為一個大型軟件不比uc/os-ii操作系統簡單。個人認為,FAT32文件系統的難點就在于對存儲介質的理解比較難,如什么是扇區?什么是簇?什么是FAT表?它們都與FAT32文件系統中的幾個重要結構體和枚舉類型數據息息相關;如FATFS,FIL,DIR,FRESULT等等成員的意義是什么?那些重要的應用函數的形參的意義是什么?這些才是學習FAT32文件系統的重點和難點!看懂一兩個例程并不代表自己真正的學會了FAT32文件系統。

     這幾天一直在做 FAT32文件系統應用函數的實驗,現將其貼出來與同道中人分享。本程序將原子的思路運用在了野火的板子,將原子戰艦板的精華(如USMART串口助手移植到了野火的板子)完全與野火的板子和程序作了兼容處理,如原子的exfuns和fattest等文件都移植到了野火板。就是這么個簡單的軟硬件兼容處理耗費了本人不少的精力。常常夜不能寐。

    主程序的功能:1,檢測SD卡的總容量和空閑容量;2,實時時鐘功能;3,用到了f_gets(),f_typetell(),f_opendir()等等。
4,用按鈕控制,將實驗結果通過串口助手打印出來,同時顯示在LCD上。不足之處就是對文件索引號的處理不靠譜。即便如此,還是沒有實現將實時數據存儲到文本文件的功能,真他媽愚鈍。至此,已經很憔悴了,苦逼的代碼難民!
FIL fnew;                                /* file objects */
//FATFS fs;                /* Work area (file system object) for logical drives */
FRESULT res;
UINT br, bw;                    /* File R/W count */
BYTE buffer[4096]={0};                         /* file copy buffer */
BYTE textFileBuffer[] = "Welcome to use Wildfire iso stm32 Development Board today is a good day";
//FILINFO fileinfo;        //文件信息
//DIR dir;                          //目錄
TCHAR* buf;
//u8 *fatbuf;                        //SD卡數據緩存區
int main(void)
{               
          u32 i,total,free;
          u8 t=0;               
          u8 m,n,j=0;               
          exfuns_init();                //                                 
         uart_init(9600);
          delay_init();
          mem_init(SRAMIN);
          LCD_Init();       
        LCD_Clear(0, 0, 240, 320, WHITE);               
        Key_init();
          LED_GPIO_Config();
          NVIC_Configuration();
          RTC_Init();
          usmart_dev.init(SystemCoreClock/1000000);
       
          LCD_DispEnCh(10, 20, "實時時鐘+FAT32文件系統實驗", RED);
       LCD_DispEnCh(100, 270, (uint8_t *)"2014-06-05", MAGENTA );
        LCD_DispEnCh(30, 240, "沉著--厚積--低調", RED);                    
          LCD_DispStrCH(20, 270, "王衍制作", RED);  

        while(RTC_Init())               
           {
                    LCD_DispStr(60,60,"RTC ERROR! ",RED);       
                     delay_ms(200);
                    LCD_DispStr(60,60,"RTC Trying...",RED);       
           }
        LCD_DispStr(30,120,"    -  -  ",RED); //顯示:年_月_日
          LCD_DispStr(10,140,"      :  :  ",RED); //顯示格式時分秒
          Sd_fs_init();       

         while(exf_getfree("0",&total,&free))        //得出SD卡的容量
           {
                LCD_DispStr(60,170,"Fatfs Error!",BLUE);
                delay_ms(200);
                LCD_DispStr(60,170,"Fatfs Error!",WHITE);
                LED2_TOGGLE;
           }                                                                                                         
        LCD_DispStr(60,170,"Fatfs OK!",BLUE);   
       LCD_DispStr(10,190,"SD Total Size:     MB",BLUE);
       
        LCD_DispStr(10,210,"SD Free Size:      MB",BLUE);          
                    
        LCD_DisNum(160,190,total>>10,RED);                                        //
        LCD_DisNum(160,210,free>>10,RED);
        if(t!=calendar.sec)
                   {
                           t=calendar.sec;
                           LCD_DisNum(30, 120, calendar.w_year, BLUE);
                           LCD_DisNum(85, 120, calendar.w_month, BLUE);
                           LCD_DisNum(110, 120, calendar.w_date, BLUE);
                         
                          switch(calendar.week)
                          {
                                case 0:
                                        LCD_DispEnCh(150, 120, "星期天", BLUE);
                               
                                        break;
                                case 1:
                                        LCD_DispEnCh(150, 120, "星期一", BLUE);
                                        break;
                                case 2:
                                        LCD_DispEnCh(150, 120, "星期二", BLUE);
                                        break;
                                case 3:
                                        LCD_DispEnCh(150, 120, "星期三", BLUE);
                                        break;
                                case 4:
                                        LCD_DispEnCh(150, 120, "星期四", BLUE);
                                        break;
                                case 5:
                                        LCD_DispEnCh(150, 120, "星期五", BLUE);
                                        break;
                                case 6:
                                        LCD_DispEnCh(150, 120,"星期六", BLUE);
                                        break;  
                          }
                        LCD_DisNum(50, 140, calendar.hour, BLUE);
                        LCD_DisNum(80, 140, calendar.min, BLUE);
                        LCD_DisNum(110, 140, calendar.sec, BLUE);
                       
                }         
                 
while(1)                 
{
        if( Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON )       
         {       
                 if(Key_Scan(GPIOA,GPIO_Pin_0) == KEY_ON)delay_ms(10);
                 {                  j=dir.index;j++;delay_ms(10);
                                LCD_DisNum(50,40,j,BLUE);
                                 f_open(&fnew, "0:newfile.txt", FA_OPEN_EXISTING | FA_READ);
                                buf=f_gets((TCHAR*)fatbuf,sizeof(buf),&fnew);
                                printf("文件字符  :%s\r\n",buf);
                               
                           m=        f_typetell("sub");//在這里sub是文件夾名而不是文件名,所以輸出0xff
                                printf("文件屬性  :%d\r\n",m);
                                 n=        f_typetell("wildfire.bmp");  printf("文件后綴名:%d\r\n",n);
                                /*打印出來的n(十進制)等于80,將80轉換成16進制就是0x50,正好是bmp文件,
                                由u8 *FILE_TYPE_TBL[6][13]可知 */
                   if(f_opendir(&dir, "sub") == FR_OK) //
                    {
                            while (f_readdir(&dir, &fileinfo) == FR_OK) //按順序讀取文件夾sub內的文件名信息
                            {
                                  if(!fileinfo.fname[0]) break; //文件名為0,說明文件里已經沒有文件了  
                                   {
                                        f_open(&fnew, "0:newfile.txt", FA_OPEN_EXISTING | FA_READ);
                                         buf=f_gets((TCHAR*)fatbuf,150,&fnew);
                                      /*  在 "0:newfile.txt" 文本文件里讀出150個字符,注意函數的用法       */               
                                         printf("文件字符名字 :%s\r\n",buf);//注意:*buf 數據類型不能搞錯
                                         LCD_DispStr(50,60,"readdir ok!",BLUE);
                                         if(fileinfo.fattrib == AM_ARC) //??????
                                          printf("文件名:%s\r\n",fileinfo.fname);
                                   }
                             printf("文件索引號: %d\r\n",j);//注意:j是u8類型,所以printf里只能是“d”類型!
                       }  
                 }  f_close(&fnew);                         
           }
   }                 
        if( Key_Scan(GPIOC,GPIO_Pin_13) == KEY_ON ) // KEY2=PC13
                  {         
                     if(Key_Scan(GPIOC,GPIO_Pin_13)== KEY_ON) delay_ms(10);
                      res = f_open(&fnew, "0:newfile.txt", FA_CREATE_ALWAYS | FA_WRITE );
                 
                     if ( res == FR_OK )
                      {
                              res = f_write(&fnew, textFileBuffer, sizeof(textFileBuffer), &bw);
                              f_close(&fnew);      
                      }

                      res = f_open(&fnew, "0:newfile.txt", FA_OPEN_EXISTING | FA_READ);          
                      res = f_read(&fnew, buffer, sizeof(buffer), &br);

                      printf("\r\n %s ", buffer);
                      f_close(&fnew);         
                                       
                LCD_DispStr(50,80,"hello world!",BLUE);       
                  }   
       
                 i++;
                if((i%60)==0)
                {
                       
                  LED3_TOGGLE;
                }
                delay_ms(10);                                                                  
       }
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

回復

使用道具 舉報

ID:139910 發表于 2016-9-20 14:15 | 顯示全部樓層
謝謝,看看能不能學習
回復

使用道具 舉報

ID:171696 發表于 2017-3-18 10:35 | 顯示全部樓層
我是來學習的,謝謝樓主發代碼
回復

使用道具 舉報

ID:829222 發表于 2024-7-30 22:38 | 顯示全部樓層
留下個腳印,看看將來是否有用。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品a免费一区久久电影 | 亚洲444kkkk在线观看最新 | 天天干天天干 | 亚洲精品白浆高清久久久久久 | 日韩美女爱爱 | 91色啪| 欧美日韩综合精品 | 久久国产精品无码网站 | 国产精品久久久久久久久久久新郎 | 国产欧美日韩精品一区二区三区 | 国产自产21区 | 久久综合久 | 日韩精品在线观看一区二区三区 | 91文字幕巨乱亚洲香蕉 | av在线影院 | 亚洲一区二区三区免费观看 | 九九精品在线 | 久久最新| 日韩av免费在线电影 | 国产欧美在线观看 | 久久久久无码国产精品一区 | 伊人影院在线观看 | 视频一二区 | 久久国产亚洲 | 视频在线一区二区 | 久久精品国产免费看久久精品 | 成人午夜精品一区二区三区 | 国产精品国产精品国产专区不卡 | 久久精品色欧美aⅴ一区二区 | 水蜜桃久久夜色精品一区 | 久久精品a | 精品国产91乱码一区二区三区 | 黑人中文字幕一区二区三区 | 奇米四色在线观看 | 国产一区二区三区 | pacopacomama在线 | 一区二区三区欧美在线 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 国产一区二区三区免费视频 | 欧美精品在线免费观看 | 欧美自拍一区 |