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
> 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
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.
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.
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"
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.
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.
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 -_-
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
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.
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.
@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.
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.