STM32使用FatFs


1、定義一些變量
在我們代碼開始的部分,先定義一些變量供我們使用。這里選擇幾個來解析一下。
第一個FIL file;這個變量是文件的結構體變量,記錄了我們打開的文件的信息。使用f_open等函數的時候都要用到。
第二個Words變量是一個字符串指針,我用這個指針來存儲讀取的字符信息。這里我們就使用了malloc函數來分配內存,我們通過修改啟動代碼提供了更多的堆內存所以這里就可以分配一些給我們使用。
第三個是Path這個字符串,這里保存的是文件所在的路徑。關於文件路徑的寫法,請參考FatFs的官方文檔 網站
  FIL file;  uint8_t Status = 0;  char* Words = malloc(256);  char* String = "\nWrite some words to this file by STM32F407 MCU.\n";  UINT Number = 0;  char Path[16] = "/File/test.txt";
2、使用f_open
關於f_open函數的具體用法和詳細說明,參見FatFs官方文檔 網站。這里可以看看我在下方貼出的代碼作為參考來使用。
3、使用f_read
關於f_read沒有特別的說明,詳細的用法去看看FatFs官方文檔 網站。這里只想說一下第三個和第四個參數。這里的第三個參數是給定的要讀取的字節數,而第四個參數是最后讀取了的字節數的存儲指針。這里要說明的是,不一定你要讀取128個字節就一定會讀取這么多,如果遇到了文件尾符號就會停止讀取。停止讀取的時候就會把讀取的字節數寫入到第四個參數指定的存儲空間里。所以我們可以通過返回的讀取字節數來發送到串口,不需要自己數讀取了多少個字節。
if(!f_open(&file, Path, FA_READ | FA_OPEN_EXISTING | FA_WRITE))  {  f_read(&file, Words, 256, &Number);  HAL_UART_Transmit(&huart1, (uint8_t *)Words, Number, 500);  }
4、使用f_lseek
我在調用f_write函數之前,調用了一下f_lseek函數來移動文件指針。不過在這里並不需要,你們參考我的完整工程文件就知道。在這之前我已經進行了文件讀取的操作,文件指針已經定位在了文件的最后一個字節這里。不過我還是調用了一下,因為有時候需要用到這個函數。這個函數的詳細用法請參考FatFs的官方文檔 網站
5、使用f_write
f_write的用法和f_read非常相似,這里就不在贅述。第三個參數和第四個參數的含義也是大同小異。想了解這個函數的詳細說明,請參考FatFs的官方文檔 網站
  f_lseek(&file, Number);  Status = f_write(&file, String, 49, &Number);
6、使用f_close
f_close這個函數的用法就非常的簡單了,這里在寫入操作之后要調用一次這個函數。調用了這個函數之后,寫入的信息才可以保存在SD卡的上面,下一次才可以讀取出來。如果沒有使用這個函數的話,文件就會存儲在緩沖區中,只有這一次讀取可以成功。到了下一次復位的時候,讀取的還是原先的文件內容。
f_close(&file);
7、再次讀取文件內容
現在我們有寫入了一些信息到了我們的文件里面,再次讀取一下看看寫入成功了嗎。下面的代碼實現了這一功能,大家參考一下。
f_open(&file, Path, FA_READ | FA_OPEN_EXISTING);  if(!Status)  {  f_read(&file, Words, 256, &Number);  HAL_UART_Transmit(&huart1, (uint8_t *)Words, Number, 500);  }  f_close(&file);
五、上電測試
代碼我們都准備好了,只要編譯通過下載到我們的開發板上就行了。如果你的硬件連接都非常的正確,而且按照前面的步驟來的話就可以開始測試讀取SD卡了。
我在SD卡的根目錄下建立了/File/test.txt
初始的文件內容如下:
This is a test file to confirm the library of FatFs.
Don't support Chinese in this file.
Wish you a good luck!
測試結果

觀察兩次的輸出結果可以看得出來,第二次復位的時候文件的末尾又多了一行文字。這一現象符合我們的程序邏輯。大家可以對比一下這里的結果,自己做一個參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM