Forum: Mikrocontroller und Digitale Elektronik Chan's FatFs Programm Beispiel?


von Florian (Gast)


Lesenswert?

Hallo zusammen,

nunja,
ich muss für die Uni recht kurzfristig für mein STM32 Board
eine SD Karten anbindung herstellen.

Nunja, hab mir Chan's FatFs "Beispielsprogram"
(bzw. die überarbeitete Version von M. Thomas) runtergeladen.

Abgesehen das man am Anfang vom Quelltext erschlagen wird,
hab ich noch nicht erkennen können,
wie man wirklich damit arbeitet.

Hat denn nicht jemand mal einen Mp3 Player auf Basis eines STM32,
oder irgendwas ähnliches gebastelt (z.B. GPS Logger) gebaut?

Würde mir gerne den Quelltext anschauen,
um daraus zu lernen.

Leider wurden viele Anfragen (ältere Threats von anderen)
unbeantwortet gelassen.
Hoffe dem passiert nicht so

Google überhäuft leider einem mit viel "Müll"

Grüße
Flo

von Olaf (Gast)


Lesenswert?

> ich muss für die Uni recht kurzfristig für mein STM32 Board
> eine SD Karten anbindung herstellen.

Und ich muss noch den Abwasch machen...

> Leider wurden viele Anfragen (ältere Threats von anderen)
> unbeantwortet gelassen.

...aber es klingelt keiner an meine Tuer der mir die Arbeit abnimmt. 
Dabei habe ich extra schon Pril besorgt.

> Hoffe dem passiert nicht so

Manchmal ist das Leben einfach hart.

Olaf

von Olaf II. (Gast)


Lesenswert?

Florian schrieb:
> Google überhäuft leider einem mit viel "Müll"
Das kommt einem nur so vor, wenn man nicht weiß, was wichtig ist und was 
nicht.

von Florian (Gast)


Lesenswert?

Ich sag ja nicht das ich was auf dem Silbertablet
präsentiert bekommen möchte,
nur reicht ja manchmal ein gutes Beispiel aus, um
etwas verständlich zu machen.

Sonst gib mir mal einen guten Hinweis Olaf,
weil meckern und motzen kann jeder.

von Arne F. (-arne-)


Lesenswert?

weiß nicht, ob's hilft: Ich hatte mal ein einfaches FAT16 für AVR 
implementiert, lediglich die SPI-Anbindung müsste an den STM32 angepasst 
werden:
Beitrag "GPX-/GPS-Logger"

von Olaf II. (Gast)


Lesenswert?

Dany Rosseel hat eine FAT32 Library für PICs geschrieben:
http://www.rosseeld.be/DRO/PIC/index.htm
Die habe ich mir für Atmels angepasst. Funktiniert besser, als was man 
sonst noch findet. Ist für SDMMC, HDD und Compact Flash. Ist allerdings 
in Pascal geschrieben(my favourite). Wenn du willst kannst du die ja 
abkupfern und in deine Sprache übersetzen. Das meiste ist 
hardwareunabhängig, bis auf das direkte Ansprechen der Hardware und das 
timing.

von Matthias K. (matthiask)


Lesenswert?

Florian schrieb:
> Nunja, hab mir Chan's FatFs "Beispielsprogram"
> (bzw. die überarbeitete Version von M. Thomas) runtergeladen.

Was besseres als die STM32 Version von M. Thomas bekommst Du nicht ohne 
Gegenleistung.

http://gandalf.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html#chanfat_stm32

Falls Du das Thema als Einstieg in die STM32 Welt sieht, dürfte das 
nicht klappen. Ist schon etwas komplexer.

von Florian (Gast)


Lesenswert?

Das ist irgendwo das Problem.
Bin ziehmlich frisch dabei, nur wie gesagt wird es von mir gefordert.


Ich denke mir die zwei Herren Chan und Thomas
mit Ihrer Entwicklung, eine Entwicklungsumgebung geschaffen haben,
wo es nur noch geht, mit einfachen Funktionen
mit einer SD Karte zu arbeiten.

Nur wie?
Z.B. wie mounte ich eine SD Karte und öffne eine bestimmte Datei?

Kann mir schlecht vorstellen das es so schwer ist,
nur ich als Anfänger hänge natürlich in der Luft.

Ich weiß das es nervtötend ist, einem Newbie etwas zu erklären,
nur komme ich leider nicht vorran -_-

von fdssd (Gast)


Lesenswert?

auf der webseite is eine doku für die LIB

ebenso gibt es eine .rar oder .zip  so etliche beispiele für msp , avr , 
sh drin sind
wer damit nich  klarkommt ...
tja pech gehabt .. programmieren lernen


ich habe die lib auf einem blackfin am laufen
die einzigste datei die hardwarespezifisch angepasst werden muss ist die 
diskio.c
die xmit funktionen

wie man die das ganze initialisiert und so ...

alles aus den vorhandenen beigefügten beispielen und aus der doku 
rauszulesen

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> Nur wie?
> Z.B. wie mounte ich eine SD Karte und öffne eine bestimmte Datei?
>
> Kann mir schlecht vorstellen das es so schwer ist,
> nur ich als Anfänger hänge natürlich in der Luft.


Traurig genug.

Wenn ein Beispiel dabei ist, dann sieht man halt einfach mal in die 
main.c rein und dort wieder im Speziellen, welche Header Files 
inkludiert werden. Eines davon ist das richtige. Dabei kann man ruhig 
mal nach dem Namen gehen. Ein Include alle "#include uart.h" wird wohl 
kaum etwas mit einem Dateisystem zu tun haben.

Hab mir mal das Zip-File für den AT91SAM geholt.
at91sam_chanfat_mthomas_20090915c.zip

In main.c wird ein
#include "diskio.h"
refernziert. Klingt gut. Also mal das File im Zip File gesucht und 
angesehen.
Fast richtig. Das sind Low-Level Disk Funktionen.

Aber im gleichen Verzeichnis gibt es ein ff.h
Und am Ende dieser ff.h findet sich
1
FRESULT f_mount (BYTE, FATFS*);            /* Mount/Unmount a logical drive */
2
FRESULT f_open (FIL*, const XCHAR*, BYTE);      /* Open or create a file */
3
FRESULT f_read (FIL*, void*, UINT, UINT*);      /* Read data from a file */
4
FRESULT f_write (FIL*, const void*, UINT, UINT*);  /* Write data to a file */
5
FRESULT f_lseek (FIL*, DWORD);            /* Move file pointer of a file object */
6
FRESULT f_close (FIL*);                /* Close an open file object */
7
FRESULT f_opendir (DIR*, const XCHAR*);        /* Open an existing directory */
8
FRESULT f_readdir (DIR*, FILINFO*);          /* Read a directory item */
9
FRESULT f_stat (const XCHAR*, FILINFO*);        /* Get file status */
10
FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**);  /* Get number of free clusters on the drive */
11
FRESULT f_truncate (FIL*);              /* Truncate file */
12
FRESULT f_sync (FIL*);                /* Flush cached data of a writing file */
13
FRESULT f_unlink (const XCHAR*);            /* Delete an existing file or directory */
14
FRESULT  f_mkdir (const XCHAR*);            /* Create a new directory */
15
FRESULT f_chmod (const XCHAR*, BYTE, BYTE);      /* Change attribute of the file/dir */
16
FRESULT f_utime (const XCHAR*, const FILINFO*);    /* Change timestamp of the file/dir */
17
FRESULT f_rename (const XCHAR*, const XCHAR*);    /* Rename/Move a file or directory */
18
FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*);  /* Forward data to the stream */
19
FRESULT f_mkfs (BYTE, BYTE, WORD);          /* Create a file system on the drive */
20
FRESULT f_chdir (const XCHAR*);            /* Change current directory */
21
FRESULT f_chdrive (BYTE);              /* Change current drive */

Bingo.

Da muss man halt mal eben die Augen aufmachen und ein wenig suchen. Hat 
mich 20 Sekunden gekostet und ich hab die Funktionen gefunden gehabt. 
Und ich muss das nicht für die Uni kurzfristig machen.

von Matthias K. (matthiask)


Lesenswert?

Florian schrieb:
> Ich weiß das es nervtötend ist, einem Newbie etwas zu erklären,
> nur komme ich leider nicht vorran -_-

Das ist kein NewBie Thema. Hast Du schon mal eine LED auf dem STM32 
Board blinken lassen? Das ist in der Regel der Einstieg und dann 
arbeitet man sich schrittweise weiter vor.


Der Ablauf für Dateiinhalt einlesen ist in etwas so:
1
  
2
   ... [snip]
3
4
    f_mount(0, &fs[0]);
5
6
    f_open(&fsrc, f_fname, FA_OPEN_EXISTING | FA_READ);
7
    
8
    for (;;) {
9
10
        // Datei zeilenweise einlesen und anzeigen
11
        filestatus = f_gets((char*)buffer_sd, sizeof(buffer_sd), &fsrc);     
12
        if (filestatus == NULL) break;    // File-Ende erreicht
13
    }
14
15
    f_close(&fsrc);
16
17
    f_mount(0, NULL);
18
19
    ...

Dazu müssen natürlich vorab alle Low-Level Funktionen, wie SPI und GPIOs 
tadellos funktionieren.

von Florian (Gast)


Lesenswert?

@fdssd

du meintest "sd_spi_stm32.c" um hardwarespezifische Einstellungen zu 
ändern.
diskoio.c finde ich zumindest nicht (mehr) in dem Paket.

@Buchegger, Danke
habs schlicht weg übersehen.

@Matthias
Ja Blinken von LEDs und Uart sind kein Ding.
Bzw. verstanden und hinbekommen.

Danke für den Code.
Das ist in etwa, das was ich gesucht habe,
um Verständnis zu entwickeln.

von fdssd (Gast)


Lesenswert?

Florian schrieb:
> du meintest "sd_spi_stm32.c" um hardwarespezifische Einstellungen zu
> ändern.
> diskoio.c finde ich zumindest nicht (mehr) in dem Paket.

ich rede auch von der original lib von chan
was wer irgdnwann wo verändert hat interessiert mich dann nicht wirklich

ich hab auch für meinen LPC  die sachen angepasst um mit SPI-DMA zu 
arbeiten
dafür musste ich zwar einiges anpassen aber es geht nun

auch wenn man anfänger ist ..
versuch das zu verstehen !!

code lesen ... nicht bis ins kleinste detail ..
aber gerade das was in der diskio.c und .h steht ist das wichtigste von 
allen

der rest ist das Dateisystem und ist zumindest zum benutzen einfach da
dort rumzupfuschen wäre nicht sinnvoll

von W.S. (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Da muss man halt mal eben die Augen aufmachen und ein wenig suchen.

Naja.. Ich hatte auch erstmal einiges an ChaN's Quellen umarbeiten 
müssen, weil ich eben nicht mit Warnungen wegen mehrdeutiger Codestellen 
"if (x=aFunc(y,z))" oder unerreichbarem Code usw. leben will.

Ansonsten ist die "Oberseite" von FatFs auch nicht so abstrahiert wie 
man es gern hätte, so daß man Dinge wie ein wirkliches FindFirst, 
FindNext usw. selbst auf die gebotenen Funktionen draufsetzen muß. Da 
ist EFSL ein Stück besser, allerdings eben ohne LFN. Ach ja, auf die Art 
der Pfade (nix mit C:\) muß man sich auch erst mal einstellen.

Was mir beim STM32 den heftigsten Ärger bereitet hatte, ist das 
SD-Interface. Eigentlich ist es ja recht geradlinig und wäre auch von 
Anfang an einfach zu benutzen, aber die Doku im RefManual ist mistig und 
diese unsägliche Treiberbibliothek ist noch mistiger. Ich hab's sehr 
zusammengekürzt und umgemodelt und entschlackt - es läuft seitdem auch 
gut, aber ich bin mit dem Zusammenkürzen noch lange nicht fertig.

Kurzum, FatFs kann man nach Korrektur einiger Schlamperfehler recht bald 
benutzen, aber mit der Hardwareseite wird unser Studiosus Florian sich 
noch recht heftig befassen müssen - aber das übt. (und so soll es 
sein..)

W.S.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Meine Beispielanwendung sieht möglicherweise auf den ersten Blick etwas 
überfrachtet aus (ja, auf den zweiten wohl auch noch), ist aber im 
Grunde nur eine Umsetzung von ChaNs Beispielen für andere Controller auf 
STM32 mit einem kleinen "Extramenü" für Tests und z.B. auch als 
Beispielanwendung der "EEPROM-Emulation" nach STM-Appnote.

Die Funktionen der FAT-Bibliothek sind auf ChaNs Webseite detailliert 
erklärt. Die "Kommandozeile" entspricht der in den Beispielen von ChaN 
für die anderen Controller. Wurde beides ja bereits oben geschrieben. 
Die Befehle, die diese "Eingabeaufforderung" kennt, sind aus dem Code 
ersichtlich (z.B. fo für file open) und man kann daran die Anwendung der 
einzelnen Funktionen nachvollziehen.

Wenn vorher noch gar nichts mit STM32 entwickelt wurde, kann das 
Beispiel ein Grundgerüst bieten, denn viel low-level-"Drecksarbeit" ist 
integriert (Startup, Linkerscript, UART I/O, HW-RTC, System-Tick, 
EEPROM-"Emulation", "Lebenszeichen"-LED). Erstmal alles so zum Laufen 
bringen (evtl. Pins anpassen, "make all", flashen) und dann einfach den 
eigenen Code dazwischen schreiben. Wenn man erstmal ein wenig 
herumgespielt hat, kann man später alles für die Anwendung überflüssige 
entfernen. (Machen einige Leute so, auch STM32-Einsteiger, erhalte 
gelegentlich E-Mails die das belegen.)

Mein Beispiel nutzt nur die SPI-Schnittstelle (ich habe hier nur 
"kleine" STM32 ohne SD-Interface). Falls die verwendete Hardware die 
Speicherkarte über das STM32 SD-Interface anbindet, funktioniert mein 
Beispiel nicht. Es gibt aber im Netz auch zumindest ein Beispiel mit 
FatFs und STM32 SD/"MCI"-Interface. Wenn richtig erinnert, verlinkt ChaN 
auch auf eine japanische Seite mit einem solchen Beispiel.

Ja, ich nutze Funktionen der "unsäglichen" STM32-Bibliothek zur 
Ansteuerung der SPI Schnittstelle zusammen mit DMA. Ja, sd_spi_stm32.c 
entspricht diskio.c in vielen anderen Anwendungen inkl. derer von ChaN.

von fdssd (Gast)


Lesenswert?

schwer ist das ganze nicht
hab selbst erst einsteigererfahrungen mit C und NXP LPC17xx

aber trotzdem den uIP stack + chan FAT lib + SD karte + DMA-SPI in 
wenigen stunden zum laufen gebracht
( also webseite von SD karte )

wenn man den code liest und zumindest das ansatzweise versteht wie das 
funzt kommt man recht gut klar

von Archie F. (archie)


Lesenswert?

GPIO_PuPd_NOPULL; Sind da externe Pull-Ups dran?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.