Forum: Mikrocontroller und Digitale Elektronik Olimex STM32E407, FreeRTOS und lwip


von Dirk N. (wassertraeger)



Lesenswert?

Guten Abend!

Das ist mein erster Beitrag hier. Ich habe schon ein Weilchen 
mitgelesen, bisher traute ich mich aber nicht, auch mal was zu fragen. 
Na, heute gehts los:
Ich habe hier ein Olimex STM32E407-Development-Board. Und ich versuche, 
eine TCP-Kommunikation mit lwip aufzubauen. Ich verwende FreeRTOS und 
die lwip-netconn-API. Ausgegangen bin ich vom TCP-Echo-Server-Beispiel 
von ST:
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906
Das ist für das Discovery-Board mit MII und DP83848 PHY.

Ich habe gesehen, dass es einige gleiche Fragen hier im Forum schon 
gibt, und habe mir darin Anregungen geholt, um das Beispiel anzupassen 
auf RMII und LAN8710A PHY auf dem Olimex. Das war also konkret dieses 
Thema hier:
Beitrag "STM32-E407 Ethernet / UDP"
und dieses:
Beitrag "STM32 - Fragen zum Einstieg"
Und das Beispiel habe ich mir auch noch reingezogen:
http://mikrocontroller.bplaced.net/wordpress/?page_id=1529

Nun sollte man meinen, da kann ja nichts mehr schiefgehen, immerhin 
endet es immer mit "Klasse, jetzt läufts!". Aber so ist das Leben.

Was versuche ich also zu tun? Ich habe nun diesen Echo-Server, und 
versuche in echo.c an der Stelle
1
  err=netconn_bind(conn,NULL,50002);
2
  if(err==ERR_OK){
3
    while(1){
4
    //Grab new connection
5
    accept_err=netconn_accept(conn,&newconn);
6
   [...]
7
  }
auf eine neue Verbindung zu warten. PC-seitig versuche ich, diese 
Verbindung mit
[code]
$ nmap -p 50002 192.168.2.105
[code]
zu initiieren. Leider kommt netconn_accept nicht zurück. Etwas weiter 
verfolgt, lande ich in sys_arch.c in der Funktion sys_arch_mbox_fetch
an der Stelle
1
while( pdTRUE != xQueueReceive( *mbox, &(*msg), portMAX_DELAY ) ){} // time is arbitrary
Aha! Nichts in der Input-Queue. Nun bin ich ratlos. In der inzwischen 
allseitig bekannten Datei stm32f4x7_eth_bsp.c habe ich nun schon x-mal 
rumgestöbert, hier und da etwas geändert (in Anlehnung an die Beispiele) 
- nichts ändert sich. Ein lustiger Effekt ist mir noch aufgefallen: wenn 
ich in der Funktion ETH_GPIO_Config schreibe
1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
2
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
dann scheint der FreeRTOS-Scheduler nicht mehr zu laufen. Lösung und 
Grund habe ich hier gefunden:
https://rowley.zendesk.com/entries/47825063-TCP-IP-Library-and-RMII

Vertausch man also die beiden Zeilen, läuft der Scheduler wieder. Eine 
TCP-Nachricht kriege ich allerdings immer noch nicht. Nun meine 
Kernfrage: Was übersehe ich? Die inkriminierten Dateien hänge ich mal 
mit, da stehts bestimmt für alle gut sichtbar in fettem Rot. Nur ich 
habe die Filzbrille auf.

Einen schönen guten Abend,

Dirk.

von noreply@noreply.com (Gast)


Lesenswert?

Verwende mal ein anderes Tool auf PC-Seite. Weis jetzt aber nicht, ob es 
daran liegt.

von DD4DA (Gast)


Lesenswert?

Kannste mal das ganze Projekt hochladen? Ich würde  mal schauen ob ich 
es testen kann. Welche IDE nutzt du ? Wie sind die Tasks aufgehangen?

von Dirk N. (wassertraeger)


Angehängte Dateien:

Lesenswert?

Das Angebot, mal ins Projekt zu schauen, kann ich einfach nicht 
ausschlagen!
Das ist ein Eclipse/Makefile-Projekt. In der
1
main()
 gibt es 2 Tasks, einen Blink-Task (den nehme ich zum Debuggen: Blinkts, 
läuft der Scheduler, Blinkts schnell, habe ich eine bestimmte Codezeile 
erreicht) und den lwip-Task, gestartet mittels
1
sys_thread_new()
 von
1
echo_init()
 in der Datei echo.c
Was müsste denn eigentlich passieren, wenn eine Ethernet-Nachricht 
einläuft? Der
1
ETH_IRQHandler()
 ausgeführt werden?

von Dirk N. (wassertraeger)


Lesenswert?

Ein Problem liegt im ETH_SoftwareReset(), das Reset-Bit
1
ETH->DMABMR |= ETH_DMABMR_SR
 bleibt stehen, und damit gehts auch mit
1
ETH_GetSoftwareResetStatus() == SET
 in der stm32f4x7_eth_bsp.c nicht weiter.

von Detlef _. (detlef_a)


Lesenswert?

Hallo Dirk,

ich habe keine Antwort auf Deine Fragen, aber ich möchte auch lwip auf 
dem E407 zum Fliegen bringen, allerdings standalone.

Das Beispiel
http://www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257906
ist für den DP83848 als phy.

Woher hast Du denn Deine Modifikationen für den LAN8710A phy auf dem 
E407 board, in den zitierten threads sehe ich die nicht?

Es muss ja mit den Modifikationen vom DP83848 zum LAN8710A 
zusammenhängen, wo z.B. ist PHY_MICR oder braucht man das für RMII nicht 
?! Clock richtig, 50MHz?

Fragen über Fragen
stay tuned
Cheers
Detlef

PS: die beiden einzigen download Deines Projekts sind von mir, das 
Interesse der ARM community scheint ja nicht so ausgeprägt zu sein, oder 
sind die woanders?

von Dirk N. (wassertraeger)


Lesenswert?

Hallo Detlef,

die LAN8710A-Modifikationen sind von Katastrophenheinz aus dem 2. 
Thread. Derzeit habe ich das Problem, dass ich (oder besser der 
Prozessor) nicht aus dem Ethernet-Reset rauskommt. Im Manual für den 
STM32F4 lese ich z.B. auf Seite 913 (29.4.4), dass man den RMII-Mode im 
Reset oder vor den MAC-Clocks setzen sollte. So habe ich das also mal 
hochgezogen und schalte die MAC-Clocks auch erst nach dem Reset an:
1
static void ETH_MACDMA_Config(void)
2
{ 
3
  uint32_t timeout=0;
4
  uint8_t sw_reset_ok=0;
5
6
  /* Reset ETHERNET on AHB Bus */
7
  ETH_DeInit();
8
9
  /* Software reset */
10
  ETH_SoftwareReset();
11
12
  // Select the RMII interface.  The STM32F4 manual says that this must
13
  // be performed whilst the module is under reset or before enabling
14
  // the MAC clocks... (29.4.4)
15
  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
16
  /* Enable SYSCFG clock */
17
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
18
19
  /* Enable ETHERNET clock  */
20
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx |
21
                         RCC_AHB1Periph_ETH_MAC_Rx, ENABLE);
22
23
  /* Wait for software reset */
24
  while (ETH_GetSoftwareResetStatus() == SET);
25
26
  ...
 Bringt aber nichts. Software Reset status bleibt immer SET.
Damit geht also alles, was danach kommt (ETH-DMA-Initialisierungen usw) 
natürlich auch nicht.

In der Tat sind die Register für den LAN8710A etwas anders. Der Dank 
geht hier auch an Katastrophenheinz fürs Zusammensuchen der 
stm32f4x7_eth_bsp.h aus dem LAN8710A-Datenblatt.

Falls du jetzt planst, mein Projekt als Vorlage zu nehmen, muss ich dir 
davon abraten (was du natürlich ignorieren kannst), denn: Es 
funktioniert ja nicht.

Gruß,

Dirk.

von Dirk N. (wassertraeger)


Lesenswert?

Heieiei, da habe ich ja was schönes angerichtet. Der Hinweis 29.4.4 
bezog sich doch nur auf die MAC-Clocks, nicht auf Sysconfig-Clock. Wenn 
man also statt
1
  // Select the RMII interface.  The STM32F4 manual says that this must
2
  // be performed whilst the module is under reset or before enabling
3
  // the MAC clocks... (29.4.4)
4
  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
5
  /* Enable SYSCFG clock */
6
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
schreibt
1
/* Enable SYSCFG clock */
2
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
3
  // Select the RMII interface.  The STM32F4 manual says that this must
4
  // be performed whilst the module is under reset or before enabling
5
  // the MAC clocks... (29.4.4)
6
  SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII);
dann kommt man zumindest aus den Ethernet-Reset raus. Dafür hängts dann 
woanders, wo, das muss ich erst noch rausfinden.

von rmu (Gast)


Lesenswert?

Dirk Neumann schrieb:
> PC-seitig versuche ich, diese
> Verbindung mit
> [code]
> $ nmap -p 50002 192.168.2.105
> [code]

wirklich mit nmap? sollte das nicht nc für netcat sein?

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.