Forum: Mikrocontroller und Digitale Elektronik STM32 Fehler in Webserver Software von STM


von Uwe B. (derexponent)


Lesenswert?

Hallo,

ich habe in den letzten Tagen "versucht" die Standalone Webserver Demo
von STM auf dem Discovery-Board mit dem STM32F4 zum laufen zu bekommen
(PHY = DP83848C von TI)

(in den Beispielen unter "STM32F4x7_ETH_LwIP_V1.0.0")

während der Implementierung hab ich einen Fehler bei mir gesehen,
den (laut Internet suche) auch andere schon hatten

Im File "stm32f4x7_eth_bsp.c" wird ein Software Reset gestartet :
1
ETH_SoftwareReset();

und dann in der Zeile darunter wird gewartet, bis das Reset-Flag 
zurückgesetzt wird :
1
while (ETH_GetSoftwareResetStatus() == SET);

nun kommt es ab und zu vor, das dieses Flag NIE zurückgesetzt wird
und damit die Software in einer Endlosloop hängt

im Internet hab ich keine abschließende Lösung für dieses Problem 
gefunden und hoffe das sich hier jemand meldet, der sich damit auskennt

als Workaround gibt es folgende vorschläge von Usern :
1. den "Enable ETHERNET clock" nach dem Software Reset machen
2. den Pin PA8 als MCO konfigurieren (obwohl der nicht benutzt wird)

Mit dem Punkt-2 funktioniert es bei mir, nur warum weiss ich nicht :-(

Gruss Uwe

von Bastler (Gast)


Lesenswert?

Frage: Hast du das Projekt in Coocox gebracht?
Ich scheitere nämlich daran.

Wäre Super ein Ethernet Projekt in Cooocox zu bekommen.

von vampire (Gast)


Lesenswert?


von vampire (Gast)


Lesenswert?

@Uwe B. (derexponent)
Ich habe seinerzeit auch die Standalone Webserver Demo
von STM auf dem Discovery-Board
Beitrag "Re: ST-Discovery-Net-IO Anfang"
benutzt.
Die GUI(Display-Init) wäre nicht gestartet ohne erfolgreiche LAN-Init;

Uwe B. schrieb:
> nun kommt es ab und zu vor, das dieses Flag NIE zurückgesetzt wird
> und damit die Software in einer Endlosloop hängt

Das kann ich daher so nicht bestätigen ?!

von vampire (Gast)


Angehängte Dateien:

Lesenswert?

habe deine Soft auf CoIDE1.5.1 und "Open407V-C" mit stat.IP für meinen 
Router umgeschrieben.
Klappt wunderbar(mit deiner Anpassung)!

von vampire (Gast)


Lesenswert?

Demo_40_HTTP_Server\ub_lib\http_server\stm_lolevel\fsdata.c
vom Build excluden --

von Uwe B. (derexponent)


Lesenswert?

>mit stat.IP für meinen
>Router umgeschrieben

kannst auch DHCP aktivieren

>Das kann ich daher so nicht bestätigen ?!

der Fehler ist ja auch nicht immer da
aber mach mal zum spass die Initialisierung
vom PA8 raus...dann hab ich bei mir den Fehler immer

IDE ist CooCox 1.7.0 (optimierung = NONE)
ARM GCC ist 4.7-2012-q4
(falls das noch eine Rolle für den Fehler spielt)

von Torsten S. (tse)


Lesenswert?

Uwe B. schrieb:
> nun kommt es ab und zu vor, das dieses Flag NIE zurückgesetzt wird
> und damit die Software in einer Endlosloop hängt

Die Antwort steht im Reference Manual RM0090 unter 28.4.4

"The application has to set the MII/RMII mode while the Ethernet
controller is under reset or before enabling the clocks."

Also ist das Beispiel von ST falsch.

von vampire (Gast)


Lesenswert?

Torsten S. schrieb:
> or before enabling the clocks.

Also, zumindest das nützt wohl nichts.
Ohne dieses -ominöse- ( PA8 muss aktiviert werden, obwohl unbenutzt)
habe auch ich diesen "Fehler" !

von Torsten S. (tse)


Lesenswert?

vampire schrieb:
> Also, zumindest das nützt wohl nichts.
> Ohne dieses -ominöse- ( PA8 muss aktiviert werden, obwohl unbenutzt)
> habe auch ich diesen "Fehler" !

Bei mir schon sonst geht gar nichts. (Wir sprechen doch vom 
Waveshare-Modul mit RMII-Interface?) Also:
1
  /* Reset ETHERNET on AHB Bus */
2
  ETH_DeInit();
3
4
  /* Software reset */
5
  ETH_SoftwareReset();
6
7
  /* Wait for software reset */
8
  while (ETH_GetSoftwareResetStatus() == SET);
9
10
  /* Enable ETHERNET clock  */
11
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC |
12
                     RCC_AHB1Periph_ETH_MAC_Tx |
13
                         RCC_AHB1Periph_ETH_MAC_Rx,
14
                         ENABLE);
Wenn man sich genau ans Manual hält könnte

SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);

zwischen ETH_SoftwareReset();
und
while (ETH_GetSoftwareResetStatus() == SET);

möglicherweise besser funktionieren.

von vampire (Gast)


Lesenswert?

Ja, -das- ist ja richtig!

Torsten S. schrieb:
> /* Wait for software reset */
>   while (ETH_GetSoftwareResetStatus() == SET);

.nur hier hängt es, wenn PA8 nicht als
/* Configure MCO (PA8)*/
  // possible BUG ?? UB (PA8 muss aktiviert werden, obwohl unbenutzt)
configuriert wird.
Habe ich in der weiter oben erwähnten Software ebenfalls drin. Da 
allergings wird noch je nach

Auszug:***********************************************************
  /* MII/RMII Media interface selection 
--------------------------------------*/
#ifdef MII_MODE /* Mode MII with STM324xG-EVAL  */
 #ifdef PHY_CLOCK_MCO

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Output HSE clock (25MHz) on MCO pin (PA8) to clock the PHY */
  RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1);
 #endif /* PHY_CLOCK_MCO */

  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);
#elif defined RMII_MODE  /* Mode RMII with STM324xG-EVAL */

  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
#endif
******************************************************************

MII/RMII unterschieden;

von vampire (Gast)


Lesenswert?

Soll heissen, PA8 muß config. werden, auch wenn dann, je nachdem 
MII/RMII
die tatsächliche Nutzung als  MCO (PA8) entschieden wird;

von Torsten S. (tse)


Lesenswert?

bei mir nicht.
Hast Du vielleicht vergessen die #defines richtig zu setzen?
1
/* MII and RMII mode selection, for STM324xG-EVAL Board(MB786) RevB ***********/
2
#define RMII_MODE  // User have to provide the 50 MHz clock by soldering a 50 MHz
3
                     // oscillator (ref SM7745HEV-50.0M or equivalent) on the U3
4
                     // footprint located under CN3 and also removing jumper on JP5.
5
                     // This oscillator is not provided with the board.
6
                     // For more details, please refer to STM3240G-EVAL evaluation
7
                     // board User manual (UM1461).
8
9
10
//#define MII_MODE

von Torsten S. (tse)


Lesenswert?

vampire, dachte bei Dir läuft alles?

MCO und Eth_Link_EXTI sind genau wie ein WLAN-Kabel: nicht vorhanden und 
deswegen überflüssig. Habs rausgeschmissen.

Vielleicht ist es genauso wichtig, nur die Pins zu initialisieren die 
auch gebraucht werden und nicht einfach alle so wie im Beispiel. Soll 
heißen:
1
  /* Configure PA1, PA2 and PA7 */
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
3
  GPIO_Init(GPIOA, &GPIO_InitStructure);
4
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
5
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
6
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);
7
8
  /* Configure PB11, PB12 and PB13 */
9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;
10
  GPIO_Init(GPIOB, &GPIO_InitStructure);
11
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_11, GPIO_AF_ETH);
12
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_12, GPIO_AF_ETH);
13
  GPIO_PinAFConfig(GPIOB, GPIO_Pin_13, GPIO_AF_ETH);
14
15
  /* Configure PC1, PC4 and PC5 */
16
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
17
  GPIO_Init(GPIOC, &GPIO_InitStructure);
18
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH);
19
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH);
20
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH);

Das funktioniert bei mir, kann mit dem DP83848 erstmals kommunizieren.

von vampire (Gast)


Lesenswert?

@ Torsten S. (tse)

Torsten S. schrieb:
> vampire, dachte bei Dir läuft alles?
Ja. Ich bezog mich hier auf die Frage von:

Uwe B. schrieb:
> nun kommt es ab und zu vor, das dieses Flag NIE zurückgesetzt wird
> und damit die Software in einer Endlosloop hängt
>
> im Internet hab ich keine abschließende Lösung für dieses Problem
> gefunden und hoffe das sich hier jemand meldet, der sich damit auskennt
>
> als Workaround gibt es folgende vorschläge von Usern :
> 1. den "Enable ETHERNET clock" nach dem Software Reset machen
> 2. den Pin PA8 als MCO konfigurieren (obwohl der nicht benutzt wird)

wobei ich spez. den Punkt2 betrachtete;

von Torsten S. (tse)


Lesenswert?

dann hab ichs falsch verstanden.. mea culpa

von Uwe B. (derexponent)


Lesenswert?

Hi ihr beiden, hier nochmal mein Fehlerbild

>Vielleicht ist es genauso wichtig, nur die Pins zu initialisieren die
>auch gebraucht werden

genau das hab ich gemacht...ich hab aus dem Beispiel von STM alles
rausgelöscht was nicht notwendig ist beim Discovery-Board
(u.a. auch den MII-Mode)

damit bleibt übrig :

im ETH_GPIO_Config :
1
  Clock-Enable (A,B,C)
2
  Clock-Enable (SYSCFG)
3
  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
4
  Config (PA1, PA2, PA7)
5
  Config (PB11, PB12, PB13) 
6
  Config (PC1, PC4, PC5)

danach im ETH_MACDMA_Config :
1
  Clock-Enable (ETH_MAC, ETH_MAC_Tx, ETH_MAC_Rx)
2
  ETH_SoftwareReset();
3
  while (ETH_GetSoftwareResetStatus() == SET);

  und dann kommt es bei mir zu dieser Endlosloop !!


wenn ich das ganze abändere bei der GPIO-Config in :
1
  Clock-Enable (A,B,C)
2
  Clock-Enable (SYSCFG)
3
  Config (PA8) <<<<<<<<<<<<< einzigste Änderung !
4
  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
5
  Config (PA1, PA2, PA7)
6
  Config (PB11, PB12, PB13)
7
  Config (PC1, PC4, PC5)

funktioniert alles ...komisch oder ?!

Gruss Uwe

von vampire (Gast)


Lesenswert?

@ Uwe B. (derexponent)
Es ist sogar noch krimineller:
-habe dein timeout rausgenommen und dies in ETH_GPIO_Config(void):

  /* Configure MCO (PA8)*/
  // possible BUG ?? UB (PA8 muss aktiviert werden, obwohl unbenutzt)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
//  GPIO_Init(GPIOA, &GPIO_InitStructure);  <------------ hier

also den PA8 Pin nur in der InitStructure;
wird auch hier nicht angesprochen(etwas weiter unten)
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_7;
für diese Pins wird die AF ja ausgewählt mit:
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH);

-während für PA8 die AF als MCO wohl festgelegt ist, so das mit der
GPIO_Init(GPIOA, &GPIO_InitStructure);
in diesem Block auch PA8 --> MCO inititiert wird(aber nicht 
aktiviert!!!);

Wenn ich <-- hier  drinlasse, habe ich die MCO Frequ. auf dem PA8;

von Torsten S. (tse)


Lesenswert?

Uwe B. schrieb:
>   und dann kommt es bei mir zu dieser Endlosloop !!

Probier mal:
1
Clock-Enable (A,B,C)
2
Clock-Enable (SYSCFG)
3
Config (PA1, PA2, PA7)
4
Config (PB11, PB12, PB13)
5
Config (PC1, PC4, PC5)
6
ETH_SoftwareReset();
7
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
8
while (ETH_GetSoftwareResetStatus() == SET);
9
Clock-Enable (ETH_MAC, ETH_MAC_Tx, ETH_MAC_Rx)

Die Leitungslänge zum PHY ist kritisch und sollte möglichst kurz sein. 
Bei mir hab ich jeder Datenleitung noch 47R in Reihe spendiert um das 
s.g. ringing zu reduzieren.

Merkwürdigerweise muß bei mir ETH_BSP_Config() gleich an erster Stelle 
in der main aufgerufen werden. Mach ich das nicht, schmiert das ext. 
SRAM und LCD ab. Mag sein das der PHY nach der Initialisierung 
ordentlich Saft braucht und die Spannungsregler kurz einknicken.

von Uwe B. (derexponent)


Lesenswert?

Hi Torsten,

>Clock-Enable (A,B,C)
>Clock-Enable (SYSCFG)
>Config (PA1, PA2, PA7)
>Config (PB11, PB12, PB13)
>Config (PC1, PC4, PC5)
>ETH_SoftwareReset();
>SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
>while (ETH_GetSoftwareResetStatus() == SET);
>Clock-Enable (ETH_MAC, ETH_MAC_Tx, ETH_MAC_Rx)

hab ich gerade ausprobiert...geht auch nicht :-(

wenn ich PA8 wieder mit reinmache :
1
Clock-Enable (A,B,C)
2
Clock-Enable (SYSCFG)
3
Config (PA8) <<<<<<<<<<<<<<<<
4
Config (PA1, PA2, PA7)
5
Config (PB11, PB12, PB13)
6
Config (PC1, PC4, PC5)
7
ETH_SoftwareReset();
8
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
9
while (ETH_GetSoftwareResetStatus() == SET);
10
Clock-Enable (ETH_MAC, ETH_MAC_Tx, ETH_MAC_Rx)

geht wieder alles ...ich glaube man muss nicht alles verstehen :-)

Danke trotzdem, ich werde jetzt einfach drüber hinwegsehen
und PA8 halt mit drin lassen


Gruss Uwe

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Habe Uwes Beispiel für den KS8721 auf dem Olimex STM32F4-E407 
modifiziert.
Wichtig: Mein E407 hat einen 8MHz-HSE-Quartz.
Wesentliche Änderungen: PA8 rausgeschmissen, Pins für das andere Gehäuse 
angepasst und Interrupt-Handling deaktiviert (größter Unterschied 
zwischen den beiden PHYs). Ich war angenehm überrascht, dass der Server 
anlief und auch auf CGI reagiert. Toller Ausgangspunkt für verschärfte 
Tests...

-> Vielen Dank an Uwe für das Coocox-Projekt! <-

von Uwe B. (derexponent)


Lesenswert?

kein problem

von Torsten S. (tse)


Lesenswert?

Marcus H. schrieb:
> Wesentliche Änderungen: PA8 rausgeschmissen, Pins für das andere Gehäuse
> angepasst und Interrupt-Handling deaktiviert (größter Unterschied
> zwischen den beiden PHYs). Ich war angenehm überrascht, dass der Server
> anlief und auch auf CGI reagiert. Toller Ausgangspunkt für verschärfte
> Tests...

Gut zu wissen das ich nicht der einzige bin der PA8 nicht braucht ;)

Marcus, meinst Du mit dem rausgeschmissenem Interrupt-Handling dieses 
Link-Status-Detection Zeugs? Das geht auf Grund des nicht vorhandenem 
INT-Pins im RMII-Mode onehin nicht.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

@Torsten S.: Olimex ist so freundlich Ihre Schaltpläne als PDF und 
EAGLE-Files ins Netz zu stellen. Und da ist der MDINT an den STM32 
angesclossen. Im Datenblatt habe ich auch keinen Hinweis gefunden, dass 
die PHY im RMII-Betrieb keine Interrupts kann.

Die Stabilität des Codes muss sich nun zeigen. Hardwaremäßig dreht's mir 
beim E407-Board den Magen um - 2 Lagen für solche Signale. Ist aber 
marginal vorhersagbarer als z.B. eine Fädellösung. ;)

von Bastler (Gast)


Lesenswert?

Hat jemand mit einem LAN8710 gearbeitet?
Ich würde den gerne einsetzen bzw. hab noch ein paar hier.

Eigendlich dürfte im RMII dieser PHY gleich funktionieren oder sehe ich 
das falsch?
Was müsste geändert werden?

von Bastler (Gast)


Lesenswert?

Im ersten Test hängt die Softwere ebenfalls bei
> while (ETH_GetSoftwareResetStatus() == SET);

von Bastler (Gast)


Lesenswert?

push

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

@bastler: Aua, schubs net so.
Uwes Demo ist unter ausschließlicher Verwendung von PHY 
Standardregistern zum Laufen zu bringen. Die komplette Parametrierung 
läuft über Bootstrap-Widerstände. Weiterführende Funktionen (z.B. 
Interrupt) kann man erstmal beiseite legen.
Vergleiche Deinen (fliegenden?) Aufbau mit einem funktionierenden (z.B. 
Olimex STM32F4-E405, mit KS8721).
Ich hatte Uwes Code und die Datenblätter von DP/KS offen und bin die 
Init im Debugger durchgesteppt und habe den Code Stück für Stück 
angepasst.

von Bastler (Gast)


Lesenswert?

Danke Marcus!

>Uwes Demo ist unter ausschließlicher Verwendung von PHY
>Standardregistern zum Laufen zu bringen.

Das wollte ich hören bzw. lesen.

Mein Aufbau ist momentan (Halb-) fliegend.
Aber eine Antwort vom PHY hätte ich vorerst mal erwartet, wenn auch 
keine Verbindung zur Außenwelt.

Das Olimex-Board hab ich mir gestern bestellt, bei den Preisen kann man 
ja nicht meckern.
Vermutlich muss ich eh umschwenken auf den KS8721, da der LAN8710 in 
QFN32 zwar lörbar ist, aber das Exposed Pad mach Probleme.

Nochmals Danke an die Forumseinträge, damit müsste es gelingen.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

@Bastler: dann mal viel Spass mit dem E407.
Zu dem Board ein Hinweis: das Teil ist "kostenoptimiert". Ein genialer 
Layouter entflocht hier einen 144-Pinner auf zwei Lagen. Das hat zur 
Folge, dass alle Messungen auf diesem Board quasi ein 
worst-case-Scenario darstellen.
Das Board funktioniert digital auf dem Labortisch. Analogsignale sind 
mit Vorsicht zu betrachten.
Ich nehme diese Boards nur als Demonstratoren, danach geht es ASAP auf 
Multilayer-PCB weiter.
Wenn man das so im Hinterkopf behält, ist das Preis-Leistungsverhältnis 
mehr als gut. Die sogar in EAGLE gelieferten Schaltungsunterlagen haben 
bei der Einarbeitung sehr geholfen.

Mein kompletter Versuchsaufbau zum Webserver-Test ist:
- E407 mit 8MHz HSE-Quartz (auf allen meinen STM32-Boards vom 
F100..F407)
- USB-Kabel für E407 Power
- JTAG-Debugger
- USB-Kabel für Debugger

von Bastler (Gast)


Lesenswert?

Mein Ziel ist es letztenendes den Webserver auf einem F107 zum laufen 
zum bringen.
Ich bräuchte ein paar kleine Ethernet Module für Ansteuerungen.

Die STM Familie ist ja relativ kompatibel untereinander von daher bin 
ich ganz zuversichtlich was die Machbarkeit angeht.

Ich hatte für erste Versuch den LWIP Stack von der ST Homepage 
runtergeladen da dieser für den F107 angepasst ist.

Ich bin aber momentan zu blöd das Projekt in Coocox zu bekommen.

von Uwe B. (derexponent)


Lesenswert?

>Ich bin aber momentan zu blöd das Projekt in Coocox zu bekommen.

woran scheitert es denn genau ?

ich habe am LwIP-Stack so gut wie keine Ändereungen vornehmen müssen,
nur ein paar Kleinigkeiten um die Warnings zu beseitigen

der Rest lief dann sofort

Gruss

von Bastler (Gast)


Lesenswert?

Das Projekt von hier lässt sich ohne Probleme compilieren nur das 
Beispiel von der ST Hompage macht Probleme.

Vermutlich liegt es an den Pfadangaben.
Ich hatte noch keine Zeit (und Lust mehr) mich damit genauer zu 
befassen.

CooCox hat einige Header nicht gefunden und al ich die entsprechenden 
Ordner zugelinkt hatt gab es andere Fehler (weiß momentan nicht 
auswendig).

Darum bin ich echt sehr dankbar ein "fertiges" Projekt hier gefunden zu 
haben.

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Uwe,
da sprichst Du ein sehr heißes Thema an: Die Umsetzung von Keil/IAR 
Projekten nach Coocox. Ich stolpere regelmäßig über Nuancen bei den 
ST-Bibliotheken und Coocox Bibliotheken. Ich glaube nicht, dass das nur 
Pfadeinstellungen sind.

Man kann den Frust von unserem "Bastler" nachvollziehen.

Genau das macht Deine Website so wertvoll - Du gibst uns übersetzbare 
Coocox Projekte.

Wenn Du zu Deiner Vorgehensweise was erzählen möchtest - das wäre ein 
Thread den ich gespannt verfolgen würde. Vielleicht kann ich dazu auch 
noch was beitragen, was eher Coocox/GCC betrifft. (Beispiel für 407er 
Linkerskript Stack im CCM, Stack anpassen, Aligment für DMA).

Oder haben wir irgendwo einen passenden Thread "STM32 Coocox"?

Cheerio...

von Bastler (Gast)


Lesenswert?

Hallo nochmals.

Ich hänge immernoch in
> while (ETH_GetSoftwareResetStatus() == SET);

Pins wie bereits hier erwähnt geändert, Ethernet Clock nach Reset, aber 
nichts ...

Gibt es sonst noch was zu beachten?

Achso: Habe das STM32F4-Discovery und ein DP83848 Board von Waveshare.
Verdrahtet laut Anleitung.

von Bastler (Gast)


Lesenswert?

Hat keiner einen Tip!

von Marcus H. (mahpong)


Lesenswert?

Hallo Bastler,
ich schätze, irgendwas in Deiner Verdrahtung passt nicht. Die 
verschiedenen RMII-PHY's laufen ansonsten wie ein Uhrwerk.

Oder ist es die PHY-Adresse?

Ich weiß nicht wie teuer Du Deine begrenzte Lebenszeit einschätzt.
Mein Tipp wäre, auf eine Hardware zu wechseln, die einfach tut.

Nur als Beispiel: STM32-E407 von Olimex. Derzeit begrenzt erhältlich 
z.B. bei Farnell für ca. 60€. Sonst 40€ bei Olimex.

Grüße,
 Marcus

P.S.: denk Dir doch mal einen Namen aus - dann ist das Gespräch nicht so 
semi-anonym.

von Torsten S. (tse)


Lesenswert?

Schon wieder Werbung für Olimex.

Das Discovery + WaveShare-Modul tuns bei vielen anderen und bei mir 
auch. Für kleines Geld und zuverlässig.

Bastler

Die Strippen zum PHY müssen so kurz wie möglich sein, sonst geht gar 
nichts. Außerdem braucht AutoNegotiation eine ganze Weile. Probiers doch 
mal fest auf 100M zu setzen:
1
eti.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable;
2
eti.ETH_Speed = ETH_Speed_100M;
3
eti.ETH_Mode = ETH_Mode_FullDuplex;

von Marcus H. (mahpong)


Lesenswert?

Oh Torsten,

ich schrieb doch "nur als Beispiel".
Es geht doch nur darum, die Anzahl der möglichen Fehlerquellen 
einzuschränken. Und dazu ist es halt schön, wenn man wenigstens eine 
bekannte Ausgangsplattform hat. Das Entscheidende ist - auf dem E407 
läuft der lwIP.

Aber ich freue mich, dass Du Bastlers Hardware kennst. Ich bin gespannt 
zu verfolgen, wie Ihr beiden das Teil zum Rennen bekommt. Dann lernen 
wir alle was draus.

Grüße,
 Marcus

von Bastler (Gast)


Lesenswert?

Das Olimex liegt schon hier, ich wollte es trotzdem mal so testen.

Aber Verständnisshalber:
Ist " while (ETH_GetSoftwareResetStatus() == SET);"
nicht auf den internen MAC bezogen?
Findend hier schon ein Austausch mit dem PHY statt?

Ich glaub ich hab da was verwechselt...

von Torsten S. (tse)


Lesenswert?

> Findend hier schon ein Austausch mit dem PHY statt?

Ja.

Das ist kein Hexenwerk. Man kann sich in stm32f4x7_eth.c angucken was 
dort passiert.

von Bastler (Gast)


Lesenswert?

Hatte mehrere Baustellen, das ist nicht gut, da weiß man nicht mehr wo 
was ist...

Ich schau es mir mal in RUHE an, bzw. passe ich die Pins aufs Olimex 
Board an.
Ziel ist sowieso eine eigens Layout.

von Torsten S. (tse)


Lesenswert?

> Ich schau es mir mal in RUHE an, bzw. passe ich die Pins aufs Olimex
> Board an.
> Ziel ist sowieso eine eigens Layout.

Aha.

Marcus, Du bist wieder dran. ;)

von Marcus H. (mahpong)


Angehängte Dateien:

Lesenswert?

@Torsten: Danke!

@Whoevermightbeinterested:
Im Anhang ein Schaltungsauszug, für eine KS8721 am STM32F407VG.
Basiert auf dem E407_RevB. Die beschriebenen Bauteile sind für den 
Fertiger gut erhältlich.
Für das Layout geben die F407- und die KS8721-Doku Tipps, damit man weiß 
weiß, welche Besonderheiten die einzelnen Signale haben (HF, Strom, 
Rauschen, etc...).

von Bastler (Gast)


Lesenswert?

Vielen vielen Dank an alle hier!

Eine Leitung war nicht dran.

Es geht, es geht, es geht!


...nun kommt die eigentliche Entwicklung. ;-)

von Marcus H. (mahpong)


Lesenswert?

Danke für die Rückmeldung.
Freut mich. Marcus

von Kazza (Gast)


Lesenswert?

Ich habe mir bei Ebay ein DP8xxxx Board bestellt und mit kurzen 
Leitungen und einer >Lochraster an das STM32f4 Discovery rangelötet. 
Alle Verbindungen sind richtig (mehrmals überprüft), Kontakt ist da, die 
Leitungen sidn kurz und trotzdem bekomme ich es nicht zum 
Laufen.....Habe es mit einer statischen IP und mit DHCP probiert. Bin 
schon am Verzweifeln, mit stm32f107 ging es damals auf Anhieb. Weiß 
jemand, wo man eine 100% funktionsfähige Demo für stm32f4discovery und 
dp83848 bekommt?

von Torsten S. (tse)


Lesenswert?

Na die Demo gibts bei Uwe auf der Homepage, wer hätte das gedacht ;) 
Funktionierte auf Anhieb, danke noch mal dafür!

Eine Alternative habe ich hier vorgestellt:
Beitrag "[ARM]DiscoverF4 CycloneTCP Stack Webserver/Client Demo mit CoIDE"

von Marcus H. (mahpong)


Angehängte Dateien:

Lesenswert?

mmax hat mich per PM nach meinem E407 Code gefragt:

Das von mir damals verwendete E407 gibt es in der Form nicht mehr.
Olimex hat eine neue Version mit einer anderen PHY rausgebracht. :(
Zum Glück verhalten sich die PHYs ziemlich ähnlich, mit 
Herstellerspezifischen Sonderfunktionen.

Uwe hat damals eine sehr gute Vorlage gemacht, die nur gering angepasst 
werden muss:

- Schaltplan / Pinout vergleichen und anpassen
- PHY-Datenblatt: ID, Register, Adressen vergleichen und anpassen
- Interruptverhalten? (im Zweifelsfal weg damit...)

Damit bekommst man Uwes Code auf so ziemlich jeder PHY zum laufen.

Grüße,
 Marcus

P.S.: Und im Anhang, wie gewünscht, ein paar Codeschnippsel

von Bastler (Gast)


Lesenswert?

Hallo,

nochmals die Nachfrage:
Gibt es auch ein Coocox Projekt mit dem STM32F107 statt 407?

von Arfi (Gast)


Lesenswert?

Ich kriege mein discovery board mit der DP Phy einfach nicht zum laufen.
Die Software ist von hier: 
Beitrag "Re: STM32 Fehler in Webserver Software von STM" und läßt sich 
wunderbar kompilieren. Nach der Initialisierung bleibt die rote LED an 
und das Board läßt sich nicht anpingen. Wenn ich netscan laufen lasse, 
blinkt die grüne LED vom DP und die orange LED ist immer an (sieht erst 
mal gut aus). Die Leutungen zw. der MCU und dem DP mehrmals überprüft. 
Keine Leitung ist länger als 5cm. Trotzdem keine Chance... Jemand eine 
Idee, was man machen könnte?

von Arfi (Gast)


Lesenswert?

Ach ja ETH_BSP_Config liefert: HTTP_SERVER_ETH_MACDMA_ERR :(

von Arfi (Gast)


Lesenswert?

So, der Server läuft. Weiß jemand wieso ST noch die recht alte LWIP 
Version verwendet? Habe gesehen, es gibt bereit V 1.4.1

von Fabian (Gast)


Lesenswert?

Hallo,
der Thread ist zwar schon etwas älter, aber da ich das selber Problem 
hatte, muss ich die Lösung noch einmal preisgeben:

Bei mir lief die Software auch nicht durch. Nach den Tipps aus diesem 
Thread habe ich dann PA8 auch wieder aktivert (was mir eigentlich nicht 
passt, da dort ein anderes Signal drauf liegt). Aber siehe da: Auch bei 
mir funktioniert es nun.

Die Lösung ist aber so einfach, dass sie wieder zu trivial war.

Ich hatte den folgenden Block auskommentiert:
1
//  /* Configure MCO (PA8) */
2
//  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
3
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
4
//  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
5
//  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
6
//  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
7
//  GPIO_Init(GPIOA, &GPIO_InitStructure);

Das Problem ist nun aber nicht das Signal auf A8, sondern das 
GPIO_InitStructure hier für die folgenden Ports eingerichtet wird.

Fazit:
1
  /* Configure MCO (PA8) */
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
3
  GPIO_Init(GPIOA, &GPIO_InitStructure);

rausschmeissen und es rennt. :)

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Ich durfte gerade eine Webserverdemo für eine fremde Baugruppe mit 
STM32F207 und KSZ8863MLL aufsetzen, unter Atollic TrueStudio 5.4.0.
Im Nachhinein alles kein Drama, muss nur die Resetschaltung und die 
Pinstrappings passen.
Anschließend noch die F207 spezifischen Treiber auf die Hardware 
anpassen und gut ist.

Fabian schrieb:
> Das Problem ist nun aber nicht das Signal auf A8, sondern das
> GPIO_InitStructure hier für die folgenden Ports eingerichtet wird.

Dieses Stück trickreiche Programmierung hat wahrscheinlich schon 
Mannjahre gekostet - bin heute Nachmittag auch wieder zu viele Minuten 
an der Stelle gehangen...

von Bernd (Gast)


Angehängte Dateien:

Lesenswert?

Alter Thread, ich weiß es, passt aber hier her.

Das ST Beispiel STM32F107_ETH_LwIP_V1.0.0 (stsw-stm32026.zip) als CoIDE 
1.7.8 Projekt für ein Olimex STM32-P107 Board Rev.D mit STM32F107VC und 
LAN8710A PHY im RMII mode geclockt vom MCO Pin des Controllers. Das 
Programm startet im Webserver Modus mit DHCP. Über die Webseite können 
die beiden LEDs des Boards geschaltet werden, eine Rückmeldung gibt es 
aber nicht. Auf der ADC Seite wird der Wert 123 (etwa 1/4 des Balkens, 
der auf 1/8 von 4096 = 512 (width=520) skaliert ist) angezeigt. Display, 
ADC und SD-Karte, sowie die Auswertung der IRQ-Leitung vom PHY aus dem 
Beispiel habe ich rausgeworfen. Ein fertig compiliertes HEX-File liegt 
bei.

Kein Hexenwerk, aber vielleicht für jemanden hilfreich.

Gruß
Bernd

von Bernd (Gast)


Lesenswert?

Was mich momentan beschäftigt, ist der enorme RAM Bedarf des lwIP 
stacks.
Im obigen Beispiel sind insgesamt ca. 55 kb (von 64kb) belegt.

Ich habe mittlerweile von dem vorher geposteten Beispiel ausgehend auf 
die "aktuelle" lwIP Version 1.4.1 umgestellt und mit freeModbus V1.5 
einen kleinen Modbus Server laufen.

Bei meiner aktuellen Konfiguration sind insgesamt ca. 53kb RAM belegt.

Der RAM Bedarf des lwIP stacks hängt stark von der konfigurierten 
Bufferanzahl und Größe ab. Es ist ein Kompromiss zwischen möglicher 
Netzwerkgeschwindigkeit und RAM Verbrauch. Da neben anderen Effekten bei 
zu kleinen Buffern u.a. eine zerwürfelte Übertragung aus mehreren 
Datenpaketen nicht mehr zusammen gesetzt werden kann und ggf. neu 
übertragen werden muss.

Die low level Empfags- und Sendebuffer (Rx_Buff (4x1520 Byte, Tx_Buff 
(2x1520 Byte) in ethernetif.c belegen zusammen alleine etwa 9kb RAM. 
1520 Byte sind dabei (so wie ich das verstanden habe) genug Platz für 
einen kompletten Ethernetframe. Diese Einstellung stammt aus dem 
Beispiel von ST.
In diese Buffer kopiert der DMA Daten.

Im lwIP Stack sind zwei große RAM Bereiche reserviert. Das ist auch 
schön im Map file zu sehen.
Es wird eine dynamische Speicherverwaltung, im Prinzip ein Heap, 
verwendet.
Im Beispiel wird dazu in mem.c das Array ram_heap der Größe MEM_SIZE 
(definiert in lwipopts.h) verwendet. Hier sind das stolze 20 kb.
TCP_MSS steht auf 1460. Was recht großzügig ist.

Der zweite große RAM Bereich kommt aus ..\obj\memp.o
Mit PBUF_POOL_BUFSIZE = 1514 und PBUF_POOL_SIZE = 10 sind es gute 16 kb.
Die pbuf Buffer scheinen hier zu liegen.

Hier ist mir nun nicht ganz klar was in welchem der beiden Bereiche 
liegt.
Vielleicht ist es mit den low level Buffern aus ethernetif.c auch etwas 
doppelt gemoppelt.

Kann mir jemand einen Hinweis zu den beiden großen Speicherbereichen von 
lwIP geben, was wo liegt?
Kann mir hier auch jemand Tipps zu vernünftigen Buffergrößen geben?
Am Ende sollen zwei Geräte miteinander Modbus TCP sprechen.
Da habe ich also eine gute Chance den vorhandenen Datenverkehr zu 
analysieren bzw. zu bestimmen. Das sollte doch helfen?!

von Marcus H. (Firma: www.harerod.de) (lungfish) Benutzerseite


Lesenswert?

Hi Bernd,
ich finde es schön, dass Du in der heutigen Zeit 55kB als "enorm" 
bezeichnest. ;)

Du hast eine Besonderheit der lwIP Speicherverwaltung schon beschrieben 
- das Teil baut sich seine eigene Pufferverwaltung auf und läuft daher 
auch auf Systemen ohne "malloc". Die maximale Speicherbelegung ist zur 
Compilezeit bekannt, das macht die Firmware pflegeleichter.
Du kannst übrigens auch eine andere Speicherverwaltung verwenden.

lwIP reicht Paketpuffer durch alle seine Schichten durch. D.h. was die 
DMA in den Empfangspuffer kopiert, wird nacheinander von 
Headerinformationen befreit, bis z.B. das Paket beim HTTP-Handler 
landet.

Wie groß die Puffer in Deiner Applikation sein müssen, kannst nur Du 
wissen. Stichwort Datenrate und Paketverlust.
Für "Hello Worlds" kommst Du auch mit 20kB und weniger zurecht, in dem 
o.g. F207 Beispiel hingen aber noch 256kB externes RAM dran.

Modbus TCP Applikation? Das sollte eher was kompaktes werden. Wenn's Dir 
um Stabilität geht, dann versuche doch mal im "worst case"-Betrieb die 
Pufferauslastung zu berechnen oder zu messen.
Oder ggf. bei verschiedenen Puffergrößen mit Wireshark die Performance 
kontrollieren (Reaktionszeit, Datenrate, Paketverluste, Resend).

Grüße,
 Marcus

von Bernd (Gast)


Lesenswert?

Marcus H. schrieb:
> Hi Bernd,
> ich finde es schön, dass Du in der heutigen Zeit 55kB als "enorm"
> bezeichnest. ;)
Bei 64kb vorhandenem RAM ist das schon viel, wenn alleine der Ip Stack 
über 40kb braucht. Ich vermute nur, dass es wahrscheinlich auch mit 
weniger in meinem Fall funktionieren würde.


> Du hast eine Besonderheit der lwIP Speicherverwaltung schon beschrieben
> - das Teil baut sich seine eigene Pufferverwaltung auf und läuft daher
> auch auf Systemen ohne "malloc". Die maximale Speicherbelegung ist zur
> Compilezeit bekannt, das macht die Firmware pflegeleichter.
> Du kannst übrigens auch eine andere Speicherverwaltung verwenden.
Ja, das ist mir auch bekannt, aber wie du schon sagst, hat es so den 
Vorteil, dass man den maximalen Bedarf kennt.

> lwIP reicht Paketpuffer durch alle seine Schichten durch. D.h. was die
> DMA in den Empfangspuffer kopiert, wird nacheinander von
> Headerinformationen befreit, bis z.B. das Paket beim HTTP-Handler
> landet.
Mir ist nur noch nicht ganz klar geworden, was in welchem der beiden 
beschriebenen Bereiche landet. Der pbuf pool ist wohl in dem Array in 
memp.o Aber warum muss der heap dann noch so groß sein?

> Wie groß die Puffer in Deiner Applikation sein müssen, kannst nur Du
> wissen. Stichwort Datenrate und Paketverlust.
> Für "Hello Worlds" kommst Du auch mit 20kB und weniger zurecht, in dem
> o.g. F207 Beispiel hingen aber noch 256kB externes RAM dran.
>
> Modbus TCP Applikation? Das sollte eher was kompaktes werden. Wenn's Dir
> um Stabilität geht, dann versuche doch mal im "worst case"-Betrieb die
> Pufferauslastung zu berechnen oder zu messen.
> Oder ggf. bei verschiedenen Puffergrößen mit Wireshark die Performance
> kontrollieren (Reaktionszeit, Datenrate, Paketverluste, Resend).
Ja an sowas habe ich gedacht. Die Durchführung ist mir noch nicht ganz 
klar. Aber ich probiere da erstmal.

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.