Forum: Mikrocontroller und Digitale Elektronik Eclipse Fehlermeldung


von Herbert (Gast)


Lesenswert?

Hallo,

ich habe mir ein Tutorial für die erstmalige Einrichtung von Eclipse für 
ein STM32 angeschaut. Das Einrichten lief problemlos, bis das folgende 
Programm ausgeführt wurde:

#include "stm32f407xx.h"

int main(void)
{
  RCC->APB2ENR |= 0x04;
  GPIOA->CRL = 0x200000;
  uint32_t check = 0;
  while(1)
  {
    GPIOA->BSRR = 0x20;
    for(check = 0; check < 2000000; check++)
                {
      ;
    }

    GPIOA->BRR = 0x20;
    for(check = 0; check < 2000000; check++);
  }
}

Der Code ist nicht von mir, sondern vom Tutorial, daher kann ich hierbei 
nicht auf Fragen eingehen.
Mein Problem ist nun, dass die Zeilen "GPIOA->CRL..." und 
"GPIOA->BRR..." unterstrichen sind und folgende Fehlermeldungen beim 
Ausführen generiert werden:
../src/main.c:8:7: error: 'GPIO_TypeDef {aka struct <anonymous>}' has no 
member named 'CRL'
../src/main.c:20:8: error: 'GPIO_TypeDef {aka struct <anonymous>}' has 
no member named 'BRR'
src/subdir.mk:18: recipe for target 'src/main.o' failed
make: *** [src/main.o] Error 1

Kann mir hierbei jemand weiterhelfen? Als Anfänger fühle ich mich gerade 
etwas überfordert und verstehe nicht an was es liegen kann.

Gruß Herbert

von STK500-Besitzer (Gast)


Lesenswert?

Herbert schrieb:
> Kann mir hierbei jemand weiterhelfen? Als Anfänger fühle ich mich gerade
> etwas überfordert und verstehe nicht an was es liegen kann.

Die beiden Felder gibt es nicht in der GPIO-Struktur.
Im Gegensatz zu AVR und Co erfordern arm-Controller etwas mehr Aufwand 
bei der Einarbeitung.
Du solltest dich mit dem "HAL and LL Driver Manual" von STM 
auseinandersetzen.

von nfet (Gast)


Lesenswert?

Das liegt daran, dass in der Datei, in der CRL im struct definiert ist, 
wahrscheinlich in einem #ifdef steht. Du musst per define wohl noch 
mitteilen, welchen Controller du verwendest.

von Dirk U. (Firma: ----) (dirk_u)


Lesenswert?

Also ich tippe drauf dass
"stm32f407xx_gpio.h" (ich glaube so in etwa geschrieben)
noch eingebunden werden muss für die GPIOx Makros
und Typendefinitionen der GPIO-Strukturen.
Gruss, Dirk

von Herbert (Gast)


Lesenswert?

Dirk U. schrieb:
> Also ich tippe drauf dass
> "stm32f407xx_gpio.h" (ich glaube so in etwa geschrieben)
> noch eingebunden werden muss

Das klingt einleuchtend, da alles mit GPIO nicht erkannt wird (z.B. auch 
folgendes nicht: gpio.GPIO_Pin = LEDS;).

Die Frage ist nun jedoch, wo bekomme ich die Header-Datei her und wo 
genau muss ich die einbinden.

von pegel (Gast)


Lesenswert?

Wenn du noch nichts für den F4 installiert hast, reicht die eine 
Header-Datei nicht aus.
Dann brauchst du eher so etwas:

http://www.st.com/en/embedded-software/stsw-stm32065.html

von pegel (Gast)


Lesenswert?

Ach Moment,

#include "stm32f407xx.h"

bringt keine Fehler? Dann ist es schon richtig installiert.

Es gibt in eclipse eine Suchfunktion. Da kannst du die Datei suchen.

von Dr. Sommer (Gast)


Lesenswert?

Der Code ist für einen STM32F1. Beim F4 gibts kein "CRL" Register. Da 
heißst es MODER und funktioniert anders.
Das Schreiben von blanken Zahlen ist super schlecht lesbar. Lieber 
symbolische Konstanten nutzen. Die Warte-Schleifen werden vom Compiler 
wegoptimiert.

von Dr. Sommer (Gast)


Lesenswert?

Dirk U. schrieb:
> Also ich tippe drauf dass
> "stm32f407xx_gpio.h" (ich glaube so in etwa geschrieben)
> noch eingebunden werden muss für die GPIOx Makros
> und Typendefinitionen der GPIO-Strukturen.

Nein. Nur für die SPL und HAL Initialisierung. Die wird hier aber gar 
nicht genutzt.

Herbert schrieb:
> z.B. auch
> folgendes nicht: gpio.GPIO_Pin = LEDS;
Du kannst nicht einfach irgendwas hinschreiben wo "GPIO" drin vorkommt 
und sagen "Das ist Code der auf GPIO zugreift". Dieser Code hat nix mit 
dem vom Anfang zu tun. Könnte vielleicht Teil einer Initialisierung mit 
SPL sein,  aber wenn das nicht geht geht vorher schon einiges anderes 
nicht. Ist aber egal, da du ja offenbar sowieso erstmal per Register 
arbeiten willst.

Bei deinem Wissensstand würde ich dir dazu raten einfach das Atollic 
Studio zu installieren, das ist mittlerweile gratis. Da werden alle 
benötigten Header automatisch mit eingebunden.

von Herbert (Gast)


Lesenswert?

Es stimmt, ich bin aus Versehen davon ausgegangen, dass der Code vom 
STM32F1 auch für den STM32F4 verwendet werden kann. Danke hierfür für 
dich Richtigstellung.
Das Problem bleibt jedoch erhalten, auch wenn ein für den STM32F4 
korrekter Code verwendet wird:
#include "stm32f4xx.h"
#include "stm32f407xx.h"

int main()
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OTYPE_PP;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

  GPIO_Init(GPIOD, &GPIO_InitStruct);

  GPIO_SetBits(GPIOD, GPIO_Pin_14);

  return 0;
}

Letztendlich wird mir alles davon markiert und als fehlerhaft angezeigt, 
daher würde ich eben auch darauf schließen, dass eine weitere Bibliothek 
eingebunden werden muss. Das Problem ist, dass ich nirgends den 
genannten Header "stm32f407xx_gpio.h" finde.

Und natürlich ist mein Wissensstand in dieser Materie nicht besonders 
hoch, jedoch will ich nicht direkt beim ersten Problem aufgeben und mich 
nach einer neuen Entwicklungsumgebung umschauen.

von Dr. Sommer (Gast)


Lesenswert?

Herbert schrieb:
> Das Problem ist, dass ich nirgends den
> genannten Header "stm32f407xx_gpio.h" finde.

Dann schau doch mal in die SPL:
http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32-standard-peripheral-libraries/stsw-stm32065.html

Oder natürlich gleich mit der aktuellen STM32CubeF4 Library anfangen:

http://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-mcu-packages/stm32cubef4.html

Die wird auch noch weiterentwickelt.

von Tobias T. (ignoty)


Lesenswert?

Dr. Sommer schrieb:
> Dann schau doch mal in die SPL:

Ah vielen Dank, das ist genau das, nachdem ich gesucht habe. Kannst du 
mir vielleicht noch sagen, wie genau ich nun die 
STM32F4xx_StdPeriph_Driver einbinde? Bzw wo ich es hin kopieren muss?

von Dr. Sommer (Gast)


Lesenswert?

Tobias T. schrieb:
> Kannst du mir vielleicht noch sagen, wie genau ich nun die
> STM32F4xx_StdPeriph_Driver einbinde? Bzw wo ich es hin kopieren muss?

Wenn du es eh nicht selbst hinbekommst, warum nimmst du nicht eine IDE 
die es automatisch macht?
Du musst diesen Ordner in dein Projekt kopieren. Alle Ordner die .h 
Dateien enthalten musst du zu deinen Include Pfaden hinzufügen.
Warum muss es die veraltete StdPeripheral Lib sein? Kannst du nicht die 
aktuelle CubeF4 nehmen und einen dafür passenden Beispielcode suchen?

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.