RT-Thread Studio驅動SD卡

Z_Tam發表於2020-11-18


前言

硬體平臺:RT-Thread ART-Pi STM32H750XBH6開發板 H750開發板
開發軟體:RT-Thread Studio
相關元件:elm FatFs虛擬檔案系統、SPI驅動、SD裝置驅動和SDIO
參考部落格:RT-Thread Studio使用SDIO驅動SD卡掛載檔案系統
官方資料:虛擬檔案系統
實驗目的:使用開發板上的SD卡介面,實現對SD卡資料的讀和寫。
ART-Pi


一、建立基本工程

1、建立Bootloader

 開啟RT-Thread Studio,按 “檔案 -> 新建 -> RT-Thread專案” 路徑新建Bootloader工程。
具體配置如下所示:
在這裡插入圖片描述
 點選完成後即可得到一個Bootloader程式。
在這裡插入圖片描述

  • 開啟該程式點選編譯在這裡插入圖片描述
  • 編譯完成後再帶點選下載。、
    在這裡插入圖片描述

 BootLoader主要用於使用外掛Falsh儲存程式碼時 初始化外掛的Flash、對映實體地址及地址跳轉。ART - Pi使用QSPI連線8M的W25Q64。

2、建立專案工程

 開啟RT-Thread Studio,按 “檔案 -> 新建 -> RT-Thread專案” 路徑新建led工程。
具體配置如下所示:
在這裡插入圖片描述
  點選完成後即可得到一個led閃爍程式。
在這裡插入圖片描述

  • 開啟該程式點選編譯在這裡插入圖片描述
  • 編譯完成後再帶點選下載。、
    在這裡插入圖片描述
  • 效果演示:

在這裡插入圖片描述


二、配置RT-Thread Settings

 雙擊左側專案資源管理器下led工程的“RT-Thread Settings”開啟視覺化配置。
在這裡插入圖片描述
 開啟後如下圖所示。
在這裡插入圖片描述
 滑鼠左鍵單擊開啟Fatfs、SDIO元件,Ctrl + s儲存。
在這裡插入圖片描述
 直接編譯發現有報錯,沒有開啟BSP_USING_SDIOx。
在這裡插入圖片描述
 既然沒開啟,那就開啟它就好了。SDIO屬於晶片外圍硬體,所以應開啟硬體配置。
在這裡插入圖片描述
 使能SDIO,選擇SDIO1。
在這裡插入圖片描述
 為什麼是SDIO1而不是SDIO2呢?看開發板的原理圖就能確定,SD卡接入了SDIO1中。
在這裡插入圖片描述
 重新儲存配置並編譯,發現沒有報錯。但是到這裡只是成功配置元件,要實現對SD卡資料的讀寫還需要先掛載檔案系統。
在這裡插入圖片描述
 因為sd卡使用的dfs屬於部件,因此使用”部件自動初始化“函式對其完成註冊。在終端輸入”list_device“指令可以檢視已經掛載的裝置。
在這裡插入圖片描述
 掛載檔案系統程式碼:

#include "dfs_fs.h"

int sd_init(void)
{
    rt_thread_mdelay(100);//這段延時必須加上,系統上電過程中存在延時,否則會出現先掛載後註冊塊裝置sd0的情況
    //mkfs("elm","sd0");//掛在前需格式化
    if(dfs_mount("sd0","/","elm",0,0)==0) //掛載檔案系統,引數:塊裝置名稱、掛載目錄、檔案系統型別、讀寫標誌、私有資料0
    {
        rt_kprintf("dfs mount success\r\n");
    }
    else
    {
        rt_kprintf("dfs mount failed\r\n");
    }
    return 0;
}
INIT_COMPONENT_EXPORT(sd_init);

 讀寫SD卡資料
在這裡插入圖片描述
 讀寫資料程式碼:

#include "dfs_posix.h"

void SD_RW(void)
{
    char wbuf[] = "hello world!", rbuf[30] = {0};
    int rsize = 0;
    int fd = 0;                                 //檔案描述符

    //寫入資料
    fd = open("/a.txt", O_WRONLY | O_CREAT);    //開啟檔案,如果不存在就新建一個
    if(fd>0)
    {
        write(fd, wbuf, sizeof(wbuf));
        close(fd);
        rt_kprintf("write success\r\n");
    }

    //讀取資料
    fd = open("/a.txt", O_RDONLY);              //使用只讀格式開啟
    if(fd>0)
    {
        rsize = read(fd, rbuf, 100);
        close(fd);
        if(rsize>0)
        {
            rt_kprintf("READ(%d): %s",rsize,rbuf);
        }
    }
}

 (tips:如果要將資料追加在檔案末尾而非覆蓋資料,開啟檔案時按位或上 O_APPEND 引數)
在這裡插入圖片描述


三、程式碼分析

 因為選用的硬體平臺是RT-Thread官方釋出的,所以元件包對硬體已經做好了相容無需自己去配置板上資源。
 若是使用其他硬體平臺,可在 ”HAL_SD_MspInit“ 中配置具體使用到的GPIO和模式配置。(可使用CubeMx配置後替換)
在這裡插入圖片描述
 ART-Pi SDMMC1的IO分配:
在這裡插入圖片描述


四、效果驗證

  • 插到電腦上直接看
    在這裡插入圖片描述

  • 在終端輸入”cat + 檔名“
    在這裡插入圖片描述


總結

 當前只是實現了最基本SD卡資料的讀和寫,後續再繼續研究檔案目錄的相關操作並把log存到SD卡中。

相關文章