Eclipse Fehlermeldung

Gast #5376376
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
Gast #5376379
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.
Gast #5376399
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.
Gast #5376407
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.
Gast #5376415
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.
Gast #5376420
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.
Gast #5376421
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.
Gast #5376436
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren