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
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.
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.
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
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.
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
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.
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.
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.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.