【STM32+cubemx】0019 HAL庫開發:SDIO接口和FATFS文件系統訪問TF、SD卡


在實際的項目中,很多情況下需要保存大量的測試數據,這時我們就需要用到TF/SD卡,這兩種卡的接口是基本兼容的,只是外形不同。

stm32的部分型號有SDIO接口,cubemx也可以生成TF/SD卡的工程,同時cubemx的中間件甚至集成了FATFS文件系統,幾乎可以說一站式解決了所有TF/SD卡的使用問題。

本節我們使用Cubemx生成TF/SD卡的工程,並且使用上FATFS文件系統,使得stm32寫入TF/SD卡的數據可以直接通過讀卡器在計算機上訪問。

本節的例子使用的開發環境是cubemx 6.1.0,pack版本是1.8.0;硬件使用的是stm32f103VET6,它帶有SDIO接口。

1)cubemx工程配置

首先我們看一下硬件電路圖,這是標准的SDIO接口:

在cubemx中設置SDIO接口的時候,如下圖:

選擇SDIO接口;

因為硬件上我們連接的是D0~D3,所以選擇SD 4bits Wide bus,使用4bit寬度的SDIO總線;選擇之后,右側圖中的SDIO相關引腳被選中(變綠),與連接TF卡的引腳對應;

接着設置SDIO的時鍾分頻,這里我們選擇8分頻(注意這和存儲卡的速率有關,時鍾太快的話有可能無法訪問存儲卡,這里可以先設置為大一點的值,程序成功后再調整得快一些)。

設置SDIO中斷使能:

配置中間件FATFS,如下圖所示:

選擇FATFS中間件,勾選SD Card;

然后設置文件名為英文、緩存在堆(STACK)中(設置為英文是為了節省內存);

注意一下下面的兩個512,設置的是扇區的大小,默認是最大和最小都是512不修改;這是因為大部分的TF/SD卡的扇區大小是512字節(512字節一個扇區是在存儲卡出廠時就確定了,不能更改,我們在計算機上格式化時,選擇的“分配單元大小”一般是簇大小,和扇區大小無關)。

配置FATFS文件系統主要是為了能方便地在計算機上訪問存儲卡的內容,如果沒有文件系統,我們回收存儲卡中的數據時,需要使用一些特殊的軟件,將卡里的原始數據(十六進制數)全部讀出,再找出需要的那一部分,是非常麻煩的。

而使用了文件系統后,stm32可以在存儲卡里建立文件,在文件中記錄數據;多次記錄可以建立不同的文件名;這樣我們回收數據時,只需使用讀卡器把存儲卡連接到計算機上,像訪問u盤一樣打開對應的那個文件,就能獲取數據了。

接着,設置監測引腳,這個引腳是為了檢測有無存儲卡插入使用的。這個引腳如果硬件上沒有,也需要設置一下,否則會報警告;可以先設置一個不使用的硬件作為輸入,然后選擇該引腳,這里用的是PC5:

最后,需要把堆棧設置得大一些,如下圖,因為FATFS文件系統會占用較多的內存,否則會溢出:

到這里,cubemx里的設置就已經完成了,現在可以生成keil的代碼工程了。

2)keil中的代碼編寫

打開生成的keil工程,可以看到已經生成了SDIO和FATFS相關的庫函數。

現在我們來改寫代碼。

首先是監測存儲卡是否存在的函數,由於我們硬件上沒有連這個,只是設置了一個沒有使用的引腳作為監測引腳,所以要屏蔽它的影響。

在fatfs_platform.c文件中添加一行,使得返回值一直為SD_PRESENT,讓程序認為存儲卡始終存在:

改完上面這一句,就可以使用FATFS文件系統和TF/SD卡了。

我們來編寫測試函數,如下圖,關鍵語句都有注釋,就不詳細解釋了:

(完整的工程代碼可以在文末關注公眾號留言獲取)

主函數中,循環調用測試函數,至此,測試代碼編寫完畢:

3)運行測試程序

先將TF/SD卡在計算機上格式化為FAT32文件系統(分配單元大小如果有4096字節選項盡量選擇這個):

將存儲卡安裝到開發板上,keil工程編譯、下載、運行;

串口調試助手的打印內容如下,說明運行成功了:

斷電,取出存儲卡,用讀卡器連接存儲卡到計算機上,打開卡內的文件test1.txt,可以看到內部的文件內容,與預期寫入的一致,所以寫入存儲卡成功了:

4)注意事項

a) 關於不同TF/SD卡的速率

不同TF/SD卡的速率,可以依據存儲卡上的標識來簡單區分,如下圖所示:

在使用速率比較低的存儲卡時,需要在cubemx中第一步配置SDIO的時鍾分頻系數時設置得大一些,否則可能會通信失敗;如果是高速卡,可以試着調高時鍾頻率,以獲取更快的讀寫速率;

b) TF/SD卡也可用通過SPI接口訪問,沒有SDIO接口的一些型號的單片機,可以通過SPI接口來讀寫存儲卡;但是需要先通過SPI接口寫指令,才能通信,操作要復雜一些;

c) FATFS是一套開源程序,cubemx中已經移植好了所有的函數接口,所以我們可以直接使用;文中的例程使用的是f_printf()實現的向文件寫入,實際上,它還有更一般化的寫入函數如f_write()等等,這些函數都在ff.c/ff.h文件中定義,可以直接看FATFS的源碼;如果系統要求運行效率要求較高,也可以自行裁剪,比如,如果只使用讀存儲卡功能,則可以裁剪掉寫功能等等。

好了,本節使用SDIO和FATFS訪問TF/SD的內容就講到這里了。

歡迎關注我的公眾號,可留言“資料”獲取相關資料和軟件:


免責聲明!

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



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