Hier ein Projekt das nicht von mir ist, sondern das mir Nik und Joerg zugesendet haben.
Und zwar haben sie den HTML-Webserver so erweitert, das man die HTML-Files nicht in das Flash der CPU speichern muss, sondern diese von einer SD-Karte geladen werden.
Sie haben also die HTML-Webserver-Library und die FATFS-Library kombiniert.
Das ganze funktioniert einwandfrei, mann kann mit der beiliegenden Demo-Webseite die 4 LEDs vom Discovery-Board schalten und auf einer anderen Seite einen AD-Wert von Port PA3 anzeigen lassen.
Hinweis : die “Index.html” muss direkt im Root der SD-Karte liegen
Zusätzlich kann man noch per “#define F4D” in den Compiler-Settings den PHY auf “LAN8720″ umstellen (statt dem DP83848C den ich benutze)
Hinweis : als Detect-Pin wird in diesem Fall PB15 benutzt (siehe stm32_ub_sdcard.h)
Also nochmal Danke an Nik und Joerg für diese Arbeit ! und das sie hier für alle geteilt werden kann.
Bild :
hier der Define “F4D” für den LAN8720
Hier der komplette CooCox-Projektordner zum download :
Das klingt interessant.
Schade, dass nicht der ENC28j60 benutzt wird, den hätte ich noch hier.
Mal schauen ob man einen lauffähigen ENC Code mit diesem Projekt verknüpfen kann.
Du bekommst aus China für ca. 10 Euro eine passende PHY . Such auf ebay.com mal nach “DP83848″
Für #define F4D fehlt die Systick Konfiguration.
Ist es möglich, das ganze auf das STM32F429I-Discovery zu portieren, wenn man die bei genannten Hardware-Anpassungen macht?
Das Problem hat sich erledigt.
Auf meiner Adapterplatine zwischen STM32F4DIS-BB und STM32F429 kam es zu Fehlern in den RX-Leitungen. 10 pF Kondensator an eine der beiden Leitungen zu hängen hat schon gereicht.
Zugriff auf SD-Karte funktioniert auch schon, dazu habe ich PB15 auf dem STM32F4DIS-BB einfach über einen freien Pin des STM32F429 angesprochen.
3D-Sensor kann zwar auf diesem Board nun nicht mehr verwendet werden, aber das ist für meine Zwecke ausreichend.
Macht’s gut und danke für den Fisch
Danke für den Code, funktioniert perfekt. Tolle Arbeit!
Mal schauen was man da noch alles erweitern kann.
Als Hinweis für Andere:
Wenn man mit dem Define auf den “LAN8720″ umschaltet, dann wird automatisch ein anderer SD-Detect-Pin verwendet als in den SD-Card Projekten von UB. Man mussden Pin anpassen, dann lässt sich die Webseite auch aufrufen.
Danke für den Hinweis.
Hallo alle miteinander,
Habe mir auch mal diesen Code angesehen und getestet:
Funktioniert perfekt mit CoIDE.
Da ich Email (SMTP) und Zeitserver (SNTP) auch testen wollte, habe ich gleich auch lwip 1.4.1 eingebunden, anstatt der 1.3.1 die hier genutzt wurde.
Leider habe ich auf *.shtml-Seiten seit dem lwip Update ein Anzeige-Problem:
Ganz oben auf der *.shtml-Seite sind ca. 10 Zeilen mit irgendwelchen Zeichen gefüllt…sonst nix…..
*.html-Seiten funktionieren normal…
Um den Bug nachvollziehen zu können muss man nur die lwip ressourcen mit den lwip 1.4.1 Datein austauschen, kompilieren und dann die ADC-Seite aufrufen…..
Fall jemand das ganze Project mit lwip 1.4.1 haben möchte um es zu testen sendet mir einfach eine Mail:
luetheshoe (at) gmail (dot) com
Hat sonst noch jemand diesen Bug entdeckt und vielleicht beseitigen können?
Hi everybody.
Sorry for bad english.
I just downloaded this example.
I have a board: easymx pro for stm32
cpu: f407vg
lan phy: lan8720a
ide: coocox
what i need to do in this projct to run it success?
i didnt undertand where is it (In addition, you can still by “# define F4D” in the compiler settings the PHY to “LAN8720″ switch (instead of the DP83848C I use)
Note: Detect a pin is used in this case, PB15 (see stm32_ub_sdcard.h))
please help me. i am sitting on this problem about 2 weeks (i cant run lwip on this board)
you have to insert the define in coide. Open the project, go to “configuration/compile” and press the button “add” inside the “defined symbols”
than insert “F4D” and press “ok”. (see picture above) The detect Pin with this settings must be connectet to “PB15″ (you can change the pin in stm32_ub_sdcard.h)
Hello
I’m trying to change SD connection in projekt ( i mean CMD only from PD2 to something else), but i can’t. How to do this ?
you can’t change this pin. the SDIO pin “CMD” must be on “PD2″. but you
can remove the complete FATFS-SDIO part and replace it with the USB-MSC part in the projekt. that should work and you can then store your web-pages on an usb-drive.
Erstmal danke für den Code. bin
Hab versucht Werte von den Eingängen auf die SD-Karte zu übertragen.
Leider musste ich aber feststellen, das schon nach dem erstem Speichervorgang, der HTTP-Server den Pfad zu den HTML Seiten verliert und zeigt das die Seite nicht vorhanden ist.
Abgespeichert wird nach deinem beispiel:
void write_log_to_SD(void) {
// MMC-Media mounten
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
UB_Led_On(LED_RED);
// File zum schreiben im root neu anlegen
if(UB_Fatfs_OpenFile(&myFile, “0:/SD_File.txt”, F_WR)==FATFS_OK) {
// ein paar Textzeilen in das File schreiben
UB_Fatfs_WriteString(&myFile,”“);
sprintf ( STRING_BUF, “Jahr: 20%02d Monat: %02d Tag: %02d Stunde: %02d Min: %02d Sek: %02d”,
UB_RTC.jahr, UB_RTC.monat,UB_RTC.tag,
UB_RTC.std, UB_RTC.min, UB_RTC.sek );
UB_Fatfs_WriteString(&myFile,STRING_BUF);
sprintf(STRING_BUF,”%d”,wind);//auf DZ umwandeln
UB_Fatfs_WriteString(&myFile,STRING_BUF);
UB_Fatfs_WriteString(&myFile,”\n”);
// File schliessen
UB_Fatfs_CloseFile(&myFile);
}
// Media unmounten
UB_Fatfs_UnMount(MMC_0);
UB_Led_Off(LED_RED);
}
}
Hast du vielleicht paar Tipps für mich wie ich das beseitigen kann?
Ich nehm Uwe mal ein bisschen arbeit ab…
Lass mal,
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
und
UB_Fatfs_UnMount(MMC_0);
weg...
Ohne nachzuschauen glaube ich mal, das die SD karte für den http server dauerhaft gemountet ist.... Daher solltest du sie nicht unmounten sonst hat die Http Lib keinen zufriff mehr.
Kann aber auch falsch liegen.
Danke… danke…hab ausprobiert, http bleibt stabil
Aber… ich kann die sd-karte erst dann beschreiben nachdem ich die html seite einmal aufgerufen habe.
Dann lass
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
Doch drinnen….
-Falls die SD karte NOCH NICH von der http lib gemountet wurde dann wird sie von deiner funktion gemounted
So wird aber die HTML Seite erst nach 15 Sek. neu aufgebaut und nicht mal komplett… manchmal mit Bilder manchmal ohne (kleine png 13kb +gif 1kb) :/
Ohne:
if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
je 2-3 Sek. komplett
hab
UB_Fatfs_Mount(MMC_0);
In main hinzugefügt, jetz klappt auch mit 1-2 Sek.
Besten dank
Can I use PHP?
uhhh…sorry, i dont know..try it, or search in the LwIP-Forum for an answer .
Kompliment! Sehr schöne Library-Sammlung!
Ich habe eine Frage bezüglich der SSI-Includes:
Sobald ich den Tag mehrmals auf eine Seite einbinde, wird nur der erste Tag duch einen Include ersetzt. Wenn ich den Tag zum Beispiel 3 mal in mein Quellcode einfüge und im Anschluss das Debugging starte, wird der Handler nur 2 mal durchlaufen.
Auch wenn ich verschiedene Tags im Programmcode anlege habe ich damit kein Erfolg. Hat jemand damit schon Erfahrung gemacht?
Nach vielen Stunden verzweifeltem debugging würde ich mich über einen kurzen Ratschlag freuen.
Hallo,
ich habe das gleiche Problem und auch noch keine Lösung dafür gefunden. Hat Irgendjemand noch einen Tip woran es liegen könnte?
Gruß
Alex
Das Projekt “HTTP-Webserver mit SD-Karte” kann leider nur für Webseiten ohne Include-Tags problemlos verwendet werden!
Sobald ein Include-Tag enthalten ist, hängt es u.a. von der Position des Include-Tags im HTML-Quelltext ab, ob die Ersetzung funktioniert. Liegt dieser auf einer Grenze der von der SD-Karte gelesenen Blöcke funktioniert die Ersetzung zuverlässig nicht. Es ist also nur einem Zufall zu verdanken, dass die Beispielseite “STM32F4x7ADC.shtml” aus der Demo funktioniert. Und entsprechend “zufällig” ist es dann, ob in einer eigenen *.shtml-Seite die Ersetzung des Include-Tags klappt.
Dass mehrere (auch gleiche) Include-Tags in einer *.shtml-Datei nicht funktionieren, lässt sich bei mir zuverlässig reproduzieren. Hier weiss ich den Grund aber nicht (mehr) und will daher auch keinen, möglicherweise falschen, Hinweis geben.
Eine weitere Verschlimmerung tritt in bestimmten Fällen auf sobald die Ausgabe der SSI-Tags aktiviert wird (In Datei httpd.c: “#define LWIP_HTTPD_SSI_INCLUDE_TAG 1″).
Hallo.
Leider funktioniert dieses Projekt bei mir nicht.
Ich kann die Adresse 192.168.0.10 anpingen, aber nicht die Website anzeigen lassen (404: The requested file cannot be found.)
Die Dateien aus dem Ordner aaa_fuer_die_SD_Karte liegen direkt ohne weitere Verzeichnisse auf der SD-Karte.
Folgendes habe ich getestet:
Die Server-Lib 40 einzeln funktioniert bei mir, ebenso die SD-Lib (13).
Letztere habe ich erweitert. Die Datei index.html kann ich nicht öffnen um einige der ersten Zeichen testweise auszulesen. Bis zum Buchstaben l arbeitet die Überprüfung scheinbar korrekt, dann erfolgt ein Fehler. Die gleiche Datei umkopiert und als index.txt gespeichert kann ich auslesen.
Diesen Programmteil habe ich testweise in die main des Show-Projektes nach der Init UB_Fatfs_Init(); eingefügt. UB_Fatfs_CheckMedia funktioniert noch, innerhalb der UB_Fatfs_Mount erfolgt der Fehler FR_DISK_ERR nach dem check=f_getfree…
Vielleicht noch als Zusatz-Info:
Da ich keinen Card-Detection Pin an meiner SD-Karten-Halterung habe, habe ich die Überprüfung in der Funktion uint8_t SD_Detect(void) auskommentiert.
Hat jemand eine Idee / Lösung zu diesem Fehler?
Ich hoffe sehr und sag schonmal Danke
bitte zuerst das Projekt “ohne” Änderungen testen ob das funktioniert.
Hinweis : die enthaltene SD-Library unterscheidet sich in ein paar
Punkten von meiner SD-Lib.
z.B. im File “ffconf.h” sind die “LongFileNames” enabled
“#define_USE_LFN1″ wahrscheinlich ist dass auch der Fehler bei dir.
ohne LFN sind nur Filenamen vom Typ 8.3 erlaubt. also z.B. “Test.txt” aber nicht “Test.text”
Hi.
Ich hab mir jetzt nochmal das Projekt runtergeladen und entpackt. Die Dateien aus dem Ordner aaa_fuer_die_SD_Karte habe ich auf die SD-Karte kopiert.
Ohne eine Änderung im Projekt kann ich keine Verbindung zu 192.168.0.10 herstellen. Anpingen geht nicht, mit dem Browser erscheint die Fehlermeldung “Fehler: Verbindung unterbrochen”. Da ich keinen Card-Detect Pin habe, habe ich wieder in der Funktion uint8_t SD_Detect (void) die Überprüfung, sprich die if-Abfrage auskommentiert. Somit gibt diese Funktion immer den Wert SD_PRESENT zurück.
Mit dieser Änderung kann ich nun die Adresse 192.168.0.10 anpingen. Mit dem Browser erhalte ich die Fehlermeldung “404: The requested file cannot be found.”
Habt ihr eine Idee zu diesem Fehler?
komisch, das Projekt funktioniert bei mir.
Welcher PHY wird denn benutzt ?
Es gibt das gleiche Projekt nochmal ohne SD-Karte
(da liegen die Files fest im Flash). Eventuell erst
mal das probieren um die Funktion vom Netzwerk zu verifizieren. LINK : http://mikrocontroller.bplaced.net/wordpress/?page_id=1529
Hi.
Das Projekt hatte ich als erstes probiert. Dieses funktioniert einwandfrei. Wie auch schon geschrieben, das Anpingen funktioniert, nur das Öffnen der Website leider nicht.
Als Phy verwende ich den DP83848.
Dein SD-Karten-Projekt (Lib 13) funktioniert auch ohne Probleme.
Daher würde ich eigentlich die Hardware ausschließen, oder?
Beim Debuggen ist mir aufgefallen, dass scheinbar immer der Punkt TransferError = SD_DATA_CRC_FAIL; gesetzt wird.
Kann hier das Problem liegen?
Schau mal wie die Dateien auf der Karte gesetzt sind. Ich hatte mal das Problem, das die Dateien Read Only waren und das kann FAT FS nicht
Der Ordner war schreibgeschützt und überall war Archiv aktiv. Aber leider hat sich dadurch nichts geändert.
Mysteriös
1. Welches Revisions-Zeichen ist auf der CPU aufgedruckt “A” oder “Z” ?
(bei “A” gab es einen BUG, kann im “stm32_ub_sdcard.h” per define eingestellt werden)
2. Gib der “Index.html” mal den Namen “Index.htm”
3. Check die “ffconf.h” auf “_USE_LFN 1″
4. Probier eine andere SD-Karte (max 2GB).
mehr fällt mir dann auch nicht ein.
Ja, find ich auch mysteriös.
Zu 1.) Z ist aufgedruckt. Ich hab sicherheitshalber das Define mal umgestellt, hat nichts gebracht.
Zu 2.) mit dem Show-Projekt hat sich auch hier nichts geändert
Zu 3.) Define hab ich überprüft -> OK
Zu 4.) Ich werde morgen nach der Arbeit noch Alternative(n) SD-Karte besorgen. Komischerweise geht jetzt Lib13 nicht mehr. Keine Ahnung warum. Jetzt probier ich erst mal ne andere Karte, bevor ich weiter teste.
Warum eigentlich max. 2GB
in FAT16 sind eigentlich nur Speichergrößen bis 2GB spezifiziert.
(was nicht bedeuten soll, das größere Karten nicht funktionieren)
Eine kurze Erfolgsmeldung: Jetzt funktionierts!
Mit der ursprünglichen SD-Karte (16GB) und mit einer neuen (4GB).
Kurz noch zum Hintergrund:
Ich hatte ja gestern noch Probleme die Lib13 wieder zum Laufen zu bekommen (ist aber schonmal gelaufen). Ein Nachmessen der Leitungen ergab komischweise keine Probleme, aber auch die 4GB-Karte ging nicht.
Da ich neben dem Discovery-Board mit eigenem Adapter zur SD-Karte auch ein Olimex-Board zur Verfügung habe, habe ich dieses getestet.
Mit Versorgung über den Debugger hat Lib13 dort nicht funktioniert, mit externer Versorgungsspannung schon. Bei diesem Board sind übrigens auch Pull-Ups an D0, D1, D2 und CMD sowie ein Pull-Down an D3. Diese Änderung habe ich versucht auf meinen Aufbau zu übertragen. Das nachträgliche Rumlöten hat aber nicht so gut funktioniert, daher hab ich den Adapter nochmal neu aufgebaut mit folgenden Änderungen:
– etwas kürzere Leitungen (statt ca. 13cm jetzt 8cm)
– Pull-Ups (33k) an D0, D1, D2 und CMD
– Pull-Down (100M) an D3
– Versorgung weiter über 3V vom Discovery, jetzt aber zusätzlich zum 100nF einen 1µF-Kondensator
Danke auf jeden Fall für die Hilfe und die tollen Libs; die sind echt super
na also, geht doch
bei meinen aufbauten habe ich nie externe PullUps oder PullDown
aber deutlich kürzere Leitungen und IMMER 1uF||100nF
Ich löte einfach kurze Kabel an einen Micro SD Adapter und hatte auch noch nie Probleme. Ich denke 13 cm waren zu lang!
Moin moin,
Danke erstmal für die Lib’s.
Ich habe show04 am laufen, zusätzlich habe ich die USB_CDC eingebaut.
Die nutze ich für Ausgaben. Nun wollte ich mir den Inhalt der SD ausgeben lassen.
Beispiel dafür aus uBasic entnommen.
Das geht leider nicht, Software hängt sich im f_opendir() weg.
Ändere ich in ffconf.h _USE_LFN auf 0 geht das auslesen der SD aber die Files für den http_server werden nicht mehr gefunden.
_USE_LFN > 0 dann geht der http_server aber f_opendir()/f_readdir() gehen nicht.
Hast du irgendeine Idee dazu?
_USE_LFN muss auf jeden fall bei “1″ bleiben, weil die Filenamen nicht 8.3 sind. Warum f_opendir nicht funktioniert kann ich dir aber auch nicht sagen. sorry.
Das hilft nun nicht richtig weiter…….