04-Show (HTTP-Webserver mit SD-Karte)

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 :

http_sd

 

f4d hier der Define “F4D” für den LAN8720

Hier der komplette CooCox-Projektordner zum download :

Show_04_Webserver_SD


39 Antworten auf 04-Show (HTTP-Webserver mit SD-Karte)

  1. Cortex-Einsteiger sagt:

    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.

    • Joerg sagt:

      Du bekommst aus China für ca. 10 Euro eine passende PHY . Such auf ebay.com mal nach “DP83848″

  2. holger sagt:

    Für #define F4D fehlt die Systick Konfiguration.

  3. Sven sagt:

    Ist es möglich, das ganze auf das STM32F429I-Discovery zu portieren, wenn man die bei genannten Hardware-Anpassungen macht?

  4. Sven sagt:

    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

  5. Cortex-Einsteiger sagt:

    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.

    • admin_ub sagt:

      Danke für den Hinweis.

  6. Lucas sagt:

    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?

  7. Pavel sagt:

    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)

    • admin_ub sagt:

      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)

  8. Lukas sagt:

    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 ?

    • admin_ub sagt:

      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.

  9. andreas sagt:

    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?

    • Lucas sagt:

      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.

      • andreas sagt:

        Danke… danke…hab ausprobiert, http bleibt stabil :)
        Aber… ich kann die sd-karte erst dann beschreiben nachdem ich die html seite einmal aufgerufen habe.

        • Lucas sagt:

          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

  10. andreas sagt:

    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

    • andreas sagt:

      hab
      UB_Fatfs_Mount(MMC_0);
      In main hinzugefügt, jetz klappt auch mit 1-2 Sek.
      Besten dank :)

  11. Lukas sagt:

    Can I use PHP?

    • admin_ub sagt:

      uhhh…sorry, i dont know..try it, or search in the LwIP-Forum for an answer .

  12. Urmel sagt:

    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.

    • Alex sagt:

      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

      • Benno sagt:

        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″).

  13. Sabrina sagt:

    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

    • admin_ub sagt:

      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”

      • Sabrina sagt:

        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?

        • admin_ub sagt:

          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

          • Sabrina sagt:

            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?

  14. Joerg B. sagt:

    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

    • Sabrina sagt:

      Der Ordner war schreibgeschützt und überall war Archiv aktiv. Aber leider hat sich dadurch nichts geändert.

  15. admin_ub sagt:

    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.

    • Sabrina sagt:

      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

      • admin_ub sagt:

        in FAT16 sind eigentlich nur Speichergrößen bis 2GB spezifiziert.
        (was nicht bedeuten soll, das größere Karten nicht funktionieren)

  16. Sabrina sagt:

    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

    • admin_ub sagt:

      na also, geht doch :-)
      bei meinen aufbauten habe ich nie externe PullUps oder PullDown
      aber deutlich kürzere Leitungen und IMMER 1uF||100nF

  17. Joerg B. sagt:

    Ich löte einfach kurze Kabel an einen Micro SD Adapter und hatte auch noch nie Probleme. Ich denke 13 cm waren zu lang!

  18. tyros sagt:

    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?

    • admin_ub sagt:

      _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.

      • tyros sagt:

        Das hilft nun nicht richtig weiter…….


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.