Forum: Mikrocontroller und Digitale Elektronik Problem mit #define in C


von Timo 75 (Gast)


Lesenswert?

Hallo C-Experten :)

Beim einbinden der Standard Peripherals Library für einen STM32F3 
Controller in meine GCC-Compiler Umgebung habe ich folgendes Problem. 
DIE IDE setzt für diesen Compilertyp noch die Präprozessor-Definition 
'STM32F30X', die aktuelle Library erwartet aber 'STM32F303xC'. Soweit 
kein Problem, denn in der Datei 'stm32f30x.h' ist folgendes enthalten:
1
#if defined(STM32F30X) 
2
  #define STM32F303xC
3
#endif
Allerdings tritt dann in der gleichen Datei weiter unten an folgender 
Stelle ein Compiler-Fehler auf:
1
typedef enum IRQn
2
{
3
  NonMaskableInt_IRQn         = -14,
4
  ...
5
  #ifdef STM32F303xC 
6
  WWDG_IRQn                   = 0,
7
  ...
8
  FPU_IRQn                    = 81
9
  #endif /* STM32F303xC */
10
  #ifdef STM32F334x8 
11
  WWDG_IRQn                   = 0,  //expected ',' or '}' before 'WWDG_IRQn'
12
  ...
13
} IRQn_Type;
Füge ich händisch die Präprozessor-Definition 'STM32F303xC' hinzu, so 
tritt der Fehler nicht auf, allerdings an allen möglichen Stellen 
'"STM32F303xC" redefined [enabled by default]'.

Woher kommt das Verhalten, dass sich die beiden genannten Fälle 
unterscheiden und wie könnte ich es hinkriegen, dass der Compilerfehler 
mit der Definition aus der Datei nicht auftritt?

Vielen Dank für Antworten,

Florian

von Noch einer (Gast)


Lesenswert?

Da fehlt doch schlicht und einfach ein Komma hinter der 81. Bzw. die 
Zeile mit der 81 ist nicht mehr das letzte Element der enum.

von Yalu X. (yalu) (Moderator)


Lesenswert?

... worauf der Compiler sogar noch freundlich hinweist :)

von Timo 75 (Gast)


Lesenswert?

Doch, prinzipiell ist das schon das letzte Element, denn wenn er in 
'#ifdef STM32F303xC' reinspringt, dann sollte er in keines der darauf 
folgenden ifdefs mehr reinspringen. Der Code ist korrekt, so denke ich, 
da er von STMicro direkt stammt. Das verwirrende ist ja, dass der Code 
kompiliert wenn ich das #Define in den Präprozessor-Direktiven setze, 
aber nicht mehr wenn das #define in der Quellcode-Datei geschieht. Und 
zwar in der gleichen Datei, wo der Fehler auftritt.

von Irgendwer (Gast)


Lesenswert?

und wo ist das #endif für das zweite #ifdef?

von (prx) A. K. (prx)


Lesenswert?

Vmtl ist STM32F334x8 ebenfalls definiert.

von Noch einer (Gast)


Lesenswert?

Beim gcc kann man nur den Preprozessor laufen lassen. Erzeugt eine 
source.i Datei, wenn ich mich richtig errinnere. Einfach mal schauen, ob 
der STM32F334x8 Teil eingebaut wird.

von Timo 75 (Gast)


Lesenswert?

A. K. schrieb:
> Vmtl ist STM32F334x8 ebenfalls definiert.

Danke, dass ich da nicht drauf gekommen bin. Ganz oben im File steht 
(gekürzt):
1
#if !defined (STM32F303xC) && !defined (STM32F334x8) && ...
2
 /* #define STM32F303xC */  
3
 #define STM32F334x8    
4
 /* #define STM32F302x8 */ 
5
#endif

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.