CH32 portiertes Fatfs-Dateibetriebssystem (Qinheng RISC-V-Kernel)

In diesem Artikel verwendeter Chip: CH32V307VCT6

Verwenden Sie SDIO, um SD-Karten zu lesen und zu beschreiben, und übertragen Sie Fatfs, um Dateien zu verwalten

1. Erstellen Sie zunächst ein neues Projekt in MounRiverStudio (später MRS genannt)Bildbeschreibung hier einfügen

Wählen Sie das Modell Ihrer MCU aus und klicken Sie auf Fertig stellen.Bildbeschreibung hier einfügen

Als nächstes suchen wir die offizielle Routine von Qinheng und öffnen den Ordner EVT->EXAM->SDIO->User in der Routine

Bildbeschreibung hier einfügenKopieren Sie sdio.c und sdio.h und fügen Sie Bildbeschreibung hier einfügendiese beiden Dateien in Ihr Projekt ein.

Gehen Sie dann auf die offizielle Fatfs-Website, um die neueste Datei-Download-URL herunterzuladen: elm-chan.org/fsw/ff/00in…

Scrollen Sie zum Ende der Seite, Sie können Download sehen, wählen Sie die Option, die ich eingekreist habe, der Bildbeschreibung hier einfügenBrowser beginnt automatisch mit dem Download, nachdem der Download abgeschlossen ist, entpacken Sie die Datei, öffnen Sie den Ordner und Sie können sehen: Bildbeschreibung hier einfügenWir wählen die Quelle aus, die ist den Quellcode von Fatfs, bis auf die beiden txt-Endungen Die Dateien von Bildbeschreibung hier einfügenwerden auch in unser Projekt kopiert. Dann erstellen wir im Projekt eine neue Headfile.h-Datei, um Header-Dateien zu verwalten, also gibt es insgesamt Bildbeschreibung hier einfügenPs im Projekt: Es ist nicht sehr gut, .h-Dateien und .c-Dateien direkt im Benutzer hinzuzufügen. Ich bin hier Zur bequemeren Demonstration Bei der tatsächlichen Verwendung ist es am besten, Ihren eigenen Code in einem neuen Ordner abzulegen.

Gehen Sie dann zurück zu MRS (Schüler, die selbst Ordner hinzufügen, denken Sie daran, den Ordnerpfad hinzuzufügen). Lassen Sie uns zuerst den Bildbeschreibung hier einfügenOrdner und die .h-Dateien definieren, die später verwendet werden. Die Transplantation von Fatfs findet hauptsächlich in diskio.c statt, also öffnen wir diese Datei zuerst

Der erste Schritt besteht darin, die Funktion der Anwendungsschicht anzupassen

Fügen Sie die Datei headfile.h in diskio.c ein (diskio.h ist auch verfügbar) Bildbeschreibung hier einfügenund dann schauen wir nach unten, wir können 3 #define sehen, was die Definition des Gerätetyps ist. Die SD-Karte, die wir dieses Mal transplantiert haben, gehört zu der MMC-Typ. Damit wir die Definition in der Quelldatei direkt verwenden können, denken Sie daran, dass DEV_MMC eine Definition von 1 hat und unsere nächste Operation hauptsächlich darin besteht, damit zu konkurrieren. Da wir hier die standardmäßigen 3 Typen verwenden, gehen wir besser zu ff_conf.h, um Bildbeschreibung hier einfügendie Anzahl der verwendeten Volumes zu ändern, wir ändern sie zuerst auf 3 und kehren dann zum ursprünglichen Ort zurück

Wenn Sie weiter nach unten schauen, können Sie mehrere Funktionen sehen. Es gibt nur 5 Funktionen, disk_status, disk_initialize, disk_read , disk_write, disk_ioctl, um die Datei nach unten zu verschieben. Alles, was wir tun müssen, ist, diese 5 Funktionen anzupassen.

Wir arbeiten von oben nach unten, um die erste Funktion zu sehen

1. disk_status

Wir können auch aus dem Namen wissen, dass dies die Funktion ist, um den Status des Disk-Laufwerks zu erhalten, aber wir können diese Funktion nicht verwenden. Qinhengs offizielle SD-Karten-Initialisierung hat bereits den Status der SD-Karte beurteilt, also geben wir direkt an diese Funktion auf. Ändern Sie die Optionen im Funktionsschalter mit Ausnahme von DEV_MMC , um direkt zu brechen (da wir nur die SD-Karte in dieser Transplantation verwenden, werden andere Geräte nicht erkannt und das Gerät wird gezwungen, in den nicht initialisierten Zustand zurückzukehren), und die Option DEV_MMC wird direkt auf 0 zurückgesetzt werden (d. h. die Initialisierung ist erfolgreich. Zustand).Bildbeschreibung hier einfügen

2. disk_initialize

我们还是先看名字,就能知道这个函数是磁盘初始化函数,所以我们要在这个函数中初始化我们的磁盘也就是SD卡初始化。 同样的我们将函数switch中的除了DEV_MMC的选项直接改成break(因为我们本次移植只用到了SD卡,所以其他设备一律不检测,强制返回设备未初始化),然后对DEV_MMC选项进行SD卡初始化,沁恒官方的SD初始化函数为SD_Init();函数原型在sdio.c中可以查看,有兴趣的同学可以去了解下SD初始化的过程(自己移植非常的痛苦,我们就先享受下便利),SD_Init() 返回值为0代表初始化成功(刚好0在Fatfs中也是成功),所以我们直接返回就好了。这个函数移植结束,我们看下一个。 Bildbeschreibung hier einfügen

3.disk_read

磁盘读取函数,我们先找到sdio.c中对应磁盘读取函数SD_ReadDisk(),复制到DEV_MMC选项下面,然后我们看SD_ReadDisk函数需要的参数(数据地址,扇区,数量),再看我们disk_read函数的传参(驱动器编号,数据地址,扇区,数量)这不是巧了嘛,我们直接复制粘贴就好了 Bildbeschreibung hier einfügen 这个函数我们也移植好了。

4.disk_write

磁盘写入函数,同理找到sdio.c中的磁盘写入函数SD_WriteDisk(),依样画葫芦。 Bildbeschreibung hier einfügen 但是会有一个警告,原因是传入参数 const BYTE *buff 带有const类型,传入SD_WriteDisk 后 const 就被丢弃了,这个不影响,我们先不管。

5.disk_ioctl

这个函数主要是用来获取磁盘的各种信息

Bildbeschreibung hier einfügen GET_SECTOR_SIZE是获取磁盘扇区大小,就保存在sido.c中的SDCardInfo结构体下CardBlockSize GET_BLOCK_SIZE是用来指定擦除的最小单位,就是SDCardInfo结构体下CardBlockSize 这里有的同学可能就要疑惑了,为什么这两个是一样的,这个Fatfs中,块是大于等于扇区的,和SD卡里刚好相反(为什么会这样我也不知道,有大佬指点迷津吗) GET_SECTOR_COUNT是获取扇区个数 按照FatFs官网的驱动中还有几个指令,但是用不上我们就先不写了。 Bildbeschreibung hier einfügen 好了,我们移植5个函数完成。 大功告吉,点击编译。 没有报错。我们开始愉快的写代码。 我们先来挂载下磁盘。

我们现在main.c文件最上方注释了变量定义区的地方定义

FATFS fs;                     /* FatFs文件系统对象 */
FIL fnew;                     /* 文件对象 */
UINT fnum;                    /* 文件成功读写数量 */
FRESULT res_sd;               /* 文件操作结果 */
BYTE    work[FF_MAX_SS];
BYTE WriteBuffer[] = {"txt.test\r\n"};/* 写缓冲区*/
复制代码

Bildbeschreibung hier einfügen 然后在main函数中我们开始挂载磁盘

    res_sd = f_mount(&fs,"1:",1);

    if(res_sd == FR_NO_FILESYSTEM)
    {
        printf("formatting\r\n");
        res_sd=f_mkfs("1:",0,work, sizeof(work));
        res_sd = f_mount(NULL,"1:",1);
        /* 重新挂载	*/
        res_sd = f_mount(&fs,"1:",1);
    }
复制代码

Bildbeschreibung hier einfügen 点击编译,然后我们就发现,报错了,原因是f_mkfs未定义(不能创建文件系统这怎么能忍) 但是我们点击转跳发现这个函数在ff.c中已存在 Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen 我们可以看到灰色的f_mkfs,这是编译器屏蔽编译的提示,我们往上翻就可以看到,有两个判断条件 FF_FS_READONLY = 0,!FF_FS_READONLY == 1 所以我们看另一个FF_USE_MKFS ,看名字叫使用mkfs,不就是我们要用的函数吗,我们进去把他改为1 Bildbeschreibung hier einfügen 这下应该好了把,都改完了,点击编译。 又报错了 Bildbeschreibung hier einfügen 提示没有get_fattime函数(获取文件时间),我们点一下,发现这个函数真的没有,那没办法了,我们只能自己创建了,因为我们用不到这个函数(要用的话需要上RTC)

我们在diskio.c最下面定义这个没啥用的函数

DWORD get_fattime (void)
{
    return 0;
}
复制代码

Bildbeschreibung hier einfügenVergessen Sie nicht, es in diskio.h zu deklarieren. Bildbeschreibung hier einfügenAn diesem Punkt klicken wir erneut auf Kompilieren, es wird kein Problem geben.

Ein Schritt ist getan, wir haben bereits Fatfs transplantiert und können glücklich damit beginnen (ich werde nicht lehren, wie man es benutzt, jeder kann es selbst Baidu machen)

Beachten Sie, wenn das Öffnen/Erstellen der Datei immer noch fehlschlägt, nachdem alles abgeschlossen ist, kann es sein, dass der Dateiname zu lang ist.Ändern Sie FF_USE_LFN in ffconf.h auf 1 (langen Dateinamen aktivieren), aber es wird trotzdem nicht empfohlen, die Datei Name ist zu lang. Bildbeschreibung hier einfügenPS: Ich habe kürzlich Chips der CH32-Serie von Qinheng verwendet, die recht einfach zu bedienen sind. Sie sind fast identisch mit der ST-Standardbibliothek. Die Leistung und der Preis der Chips sind relativ gut (Qinheng zahlt dafür). Das wird geschätzt In Zukunft wird es Tutorials für die CH-Serie geben. Danke fürs Zuschauen.

Guess you like

Origin juejin.im/post/7193618591453806651