Forum: Mikrocontroller und Digitale Elektronik Code-Strukturen in stm32f4xx_hal_eth


von Michael S. (stroggi)


Lesenswert?

Hallo zusammen,

ich habe mich gefragt warum in der HAL-Bibliothek für den STM32F4 
beispielsweise folgende Funktion genau so geschrieben ist wie sie es 
ist:
1
static void ETH_MACTransmissionEnable(ETH_HandleTypeDef *heth)
2
{ 
3
  __IO uint32_t tmpreg1 = 0U;
4
  
5
  /* Enable the MAC transmission */
6
  (heth->Instance)->MACCR |= ETH_MACCR_TE;
7
  
8
  /* Wait until the write operation will be taken into account:
9
     at least four TX_CLK/RX_CLK clock cycles */
10
  tmpreg1 = (heth->Instance)->MACCR;
11
  ETH_Delay(ETH_REG_WRITE_DELAY);
12
  (heth->Instance)->MACCR = tmpreg1;
13
}

Ganz genau geht es mir um folgendes:
In der Zeile
1
(heth->Instance)->MACCR |= ETH_MACCR_TE
 wir das Register MACCR bearbeitet und direkt beschrieben. Anschließend 
wird mit
1
tmpreg1 = (heth->Instance)->MACCR
 der geschriebene Wert ausgelesen, nur um ihn nach einer kurzen 
Wartezeit mit
1
(heth->Instance)->MACCR = tmpreg1
 erneut in das Register zu schreiben.

Ich habe keine Ahnung warum das so geschrieben ist wie es ist und was 
das genau soll. Hat jemand von euch eine plausible Erklärung dafür?

Viele Grüße
Michael

von Stefan F. (Gast)


Lesenswert?

Sieht für mich danach aus, dass ein backup von dem Register angelegt 
wird, für den Fall dass es zwischendurch (ungewollt?) verändert wird.

von Tassilo H. (tassilo_h)


Lesenswert?

Das ist ein Workaround fuer ein Erratum des Ethernet-Peripherals:

2.10.5
Successive write operations to the same register might not be fully 
taken into account

Falls mehrere Schreiboperationen direkt hintereinander in bestimmte 
Ethernet-Register erfolgen, uebernimmt das Ethernet-Peripheral die neuen 
Werte nicht, obwohl beim Auslesen des Registers der richtige Wert 
ausgelesen wird.

Daher: Schreiben (beliebig oft), letzten Wert auslesen, 4 
Ethernet-Clocks warten, gelesenen Wert nochmal schreiben.

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.