Hallo, ich versuche in die STM32 Welt einzusteigen und am STM32F429 Discovery Board die LED am Port PG13 zum blinken zu bringen. Das funktioniert auch mit folgendem Code, allerdings ist in den meisten Tutorials die Portkonfiguration anders beschrieben, nämlich mit den auskommentierten Zeilen. Macht Keil da irgendwas anderes? Fehler z.B. -> main.c(11): error: #20: identifier "GPIO_InitTypeDef" is undefined #include "STM32F4xx.h" #include "GPIO_STM32F4xx.h" void Delay(__IO uint32_t nCount) { while(nCount--) { } } int main (void) { // GPIO_InitTypeDef GPIO_InitStructure; // RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_PortClock (GPIOG, true); GPIO_PinConfigure(GPIOG, 13, GPIO_MODE_OUTPUT, GPIO_OUTPUT_PUSH_PULL, GPIO_OUTPUT_SPEED_50MHz, GPIO_PULL_DOWN); while(1) { GPIO_PinWrite(GPIOG, 13, 1); // GPIO_WriteBit(GPIOG, GPIO_Pin_13, Bit_SET); Delay(1000000L); GPIO_PinWrite(GPIOG, 13, 0); // GPIO_WriteBit(GPIOG, GPIO_Pin_13, Bit_RESET); Delay(1000000L); } }
Du musst es erst definieren...
1 | /* Private typedef ------------------------------------------*/
|
2 | GPIO_InitTypeDef GPIO_InitStructure; |
Greez Ert
Nils P. schrieb: > Du musst es erst definieren... > /* Private typedef ------------------------------------------*/ > GPIO_InitTypeDef GPIO_InitStructure; Das mache ich doch in der ersten Zeile in "int main(void)", ist im geposteten Code allerdings auskommentiert! Wenn ich es rein nehme gibt es ja den Fehler: main.c(11): error: #20: identifier "GPIO_InitTypeDef" is undefined Nur in welche Datei ist GPIO_InitTypeDef normalerweise definiert? André
Warum macht ihr das nicht direkt mit Registerzugriffen? Dann spart man sich den ganzen Kram...
Andre S. schrieb: > > Nur in welche Datei ist GPIO_InitTypeDef normalerweise definiert? > > André
1 | #include "stm32f4xx_gpio.h" |
2 | #include "stm32f4xx_rcc.h" |
@ Random ... (thorstendb) >Warum macht ihr das nicht direkt mit Registerzugriffen? Dann spart man >sich den ganzen Kram... Weil es komfortaber ist und man nicht die Bits einzeln zusammenfummeln muss. Für einfach, zeitunkritische Dinge ist das besser. Bei zeitkritischen Dingen macht man direkte old school Registerzugriffe.
Uwe B. schrieb: > Andre S. schrieb: >> >> Nur in welche Datei ist GPIO_InitTypeDef normalerweise definiert? >> >> André > >
1 | > #include "stm32f4xx_gpio.h" |
2 | > #include "stm32f4xx_rcc.h" |
3 | > |
Scheints nicht zu geben... Ich hatte das Projekt in Keil folgendermaßen angelegt: Neues Projekt mit Prozessor STM32F429ZI angelegt, dann bei "Manage Run-Time Environment" folgendes ausgewählt: CMSIS -> Core Device -> GPIO Device -> Startup Code läuft ja auch wie oben gepostet - LED blinkt - nur die Portkonfiguration ist halt nicht so wie in den meisten Tutorials beschrieben. Verwendet Keil da andere Header Dateien bzw. eine andere Lib? André
Andre S. schrieb: > Verwendet Keil da andere Header Dateien bzw. eine andere > Lib? Ja. Was du da verwendest ist ein eigener Treiber von ARM (GPIO_STM32Fxx.c). Zukünftige Versionen des Device Family Pack fuer die ST-Derivate verwenden vielleicht die ST Library stattdessen.
Du verwendest den Peripheral Treiber von ARM, das ist nicht die Treiber Lib von ST. Wenn du die von ST einfügst, dann würde es auch funktionieren. Mein Tip: Downloade dir die Std. Periph. Lib von ST und benutz den Masterworkspace von dort. Ausserdem hat das nix mit Zeitkritisch unkritisch zu tun. Der Keil compiler ist so schlau und sieht was du da mit den Befehlen tust und macht daraus eh einen optimierten Registerzugriff.
Andre S. schrieb: > GPIO_PinConfigure(GPIOG, 13,... Wenn ich sowas lese, wird mir regelmäßig übel davon - und das ist schlecht, denn ich will heute noch meinen Chateau Bel Air genießen. Ich frag mich besorgt, warum denn nur so viele Möchtegern-Programmierer als allererstes versuchen, mit dieser ST-Schaumschläger-Lib herumzudaddeln. Ist es die schiere Faulheit, sich selbst ein an die eigenen Zwecke sinnvoll angepaßtes Setup zu schreiben? Ist es die Blödheit, für das simple Beschreiben eines Konfigurationsregisters einen Struct im RAM zu erzeugen, dessen Inhalte zum Schluß ja doch miteinander verodert werden, bevor sie in's Konfigregister geschrieben werden? Ist es schiere Ignoranz, die solche Leute davon abhält, ins RefManual zu schauen und sich stattdessen dann über Diskrepanzen von Headerdateien verschiedener Herkunft zu beklagen? Ich häng mal ein Beispiel dran, wie man sowas weitaus sinnvoller machen kann. Ist zwar für nen anderen STM32, aber die prinzipielle Herangehensweise sollte beim Lesen klar werden. Da ist dann mit einem Rutsch der ganze µC initialisiert, was die allerunterste Ebene betrifft: Takt, Pins, externer Bus. W.S.
> mit dieser ST-Schaumschläger-Lib
Die Lib ist schon recht gut. Ich verwende sie regelmäßig zum
Initialisieren von Peripherie und hatte noch nie Probleme damit. Alles
geht zügig vorran und ich muss nicht dauernd im Datenblatt stupide nach
Registern/Bits suchen.
Ferner ist die Lib getestet und die Richtigkeit verifiziert. Das macht
den Code sicher. Zudem ist meine Zeit zu wertvoll sie für Dinge zu
verschwenden, für die schon andere Zeit investiert haben.
Allerdings nutze ich, sofern es um zeitkritische Sachen geht, häufig
dann direkte Zugriffe auf Register (zb. um einen Pin maximal schnell zu
schalten).
W.S. schrieb: > Andre S. schrieb: >> GPIO_PinConfigure(GPIOG, 13,... > > Wenn ich sowas lese, wird mir regelmäßig übel davon - und das ist > schlecht, denn ich will heute noch meinen Chateau Bel Air genießen. nix für ungut, aber wenn ich sowas sehe :-( while (L) { --L; if (RCC->CR & (1<<17)) goto _hse_rdy; } /* wenn ext. Oszi ready */ _hse_rdy: PS: ich meine das "goto" :-)
:
Bearbeitet durch User
Gegenfrage: Wieso break? Goto ist ein einfaches, eindeutiges und gutes Grundstatement von C, also warum hat hier jemand was gegen goto? W.S.
hans schrieb: > Zudem ist meine Zeit zu wertvoll sie für Dinge zu > verschwenden,... Ach, du bist einer von den besonders wertvollen Mitarbeitern, denen ihre Zeit viel zu kostbar ist, um sie zum Lesen des Referenzmanuals des Chips zu verschwenden. Stattdessen verschwendest du deine Zeit und die Ressourcen deiner Firma lieber zum Lesen der Dokumentation der ST-Lib und zum Nachschauen im Referenzmanual, was denn welcher Aufrufparameter in der Einstellung der Peripherie bewirkt und ob er für deinen Zweck auch nützlich ist. Ich ziehe es vor, selbst zu wissen, wie der Hase läuft. W.S.
W.S. schrieb: > gutes > Grundstatement von C, also warum hat hier jemand was gegen goto? Wer mit goto programmiert, sollte zu BASIC wechseln. In C braucht man kein goto. Das Beispiel zeigt es sehr gut. Gemeint ist ein break aber der laienhafte BAISICer nimmt das goto. Und dann dicke Fr... über die STLIB. Man, man, man, ...
goto -> No! schrieb: > Wer mit goto programmiert, sollte zu BASIC wechseln. In C braucht man > kein goto. Was meinst du, weswegen goto überhaupt im Sprachumfang von C enthalten ist? Ich sehe solche völlig unbegründeten Ansichten genauso, wie die vollmundigen Ansichten von Lötfrieden, die frisch aus der Berufsschule kommen und mir verkünden, daß man heutzutage zum Löten gar kein Flußmittel mehr braucht, weil sowas ja nur früher verwendet wurde. Der Grund für derartige Ansichten ist, daß die Leute in ihrer Ausbildung nicht zum eigenständigen Denken gebracht worden sind, sondern schlichtweg gedrillt oder sagen wir mal dressiert worden sind. So etwa wie "goto ist nicht zu benutzen, denn es bedeutet Spaghetticode und der ist grottenschlecht, lernen Sie das jetzt auswendig und verinnerlichen Sie das!" Und dann kommt mir so ein NoName-Gast daher und meint, wer goto oder Flußmittel verwendet, sollte zu Basic wechseln, was klingt wie "Kreuzigt ihn! oder vertreibt ihn wenigstens in die Wüste". Fanatismus anstelle Durchblick. Ja, das Bildungssystem hier in Deutschland ist immer noch ziemlich kritikwürdig, denn es fördert bei dem Nachwuchs leider viel zu wenig das selbständige Denken und so enden viele Ausbildungen nicht im Verstehen der Materie, sondern in schlichtem Imperativ: "Man macht das SO und nicht anders, basta!" und keiner der derart ausgebildeten Kleingeister erhebt die Frage "aber warum eigentlich? und geht das denn nicht auch anders?" W.S.
W.S. schrieb: > wer goto oder > Flußmittel verwendet Wie kommst du vom schlechten Programmierstil auf Löttechnik? Selbstverständlich gibt es mehrere verschiedene Wege zu einem Ziel. Und genauso läßt sich eine Aufgabenstellung mit unterschiedlichen Programmabläufen lösen. Es gibt nicht die Lösung, aber es gibt gute und weniger gute. Ein goto in C zählt zu den weniger guten, nein zu den schlechten Lösungen. Warum benutzt du unterschiedliche Datentypen, warum benutzt du Unterprogramme, ..., ... ??? Es geht doch auch ohne. :-( Einfach mal drüber nachdenken, ein paar Mal tief durchatmen und dann erst antworten. ;-) p. s. W.S. schrieb: > so ein NoName-Gast Ich wollte dir eine PN schicken. Geht nicht, du bist nur ein NoName-Gast. ;-D
W.S. schrieb: > Ja, das Bildungssystem hier in Deutschland ist immer noch > ziemlich kritikwürdig, denn es fördert bei dem Nachwuchs leider viel zu > wenig das selbständige Denken und so enden viele Ausbildungen nicht im > Verstehen der Materie, sondern in schlichtem Imperativ: "Man macht das > SO und nicht anders, basta!" und keiner der derart ausgebildeten > Kleingeister erhebt die Frage "aber warum eigentlich? und geht das denn > nicht auch anders?" > > W.S. Fall nicht von deinem Roß. Nach deiner gequirlten Eingabe zur STLib kannst du so gut mit Kritik umgehen? Goto ist schlichtweg einfach unnötig in C und verschlechtert die Lesbarkeit. Ausserdem ist für den Compiler die Registernutzung schlechter abschätzbar (gleiches gilt allerdings auch für break und continue). Grob gesagt ist goto ein annehmbares Werkzeug für "Fred-in-the-Shed", aber wenn Code von mehreren Entwicklern gewartet wird eher ein unnötiges Risiko. Daran ist das Bildungssystem ausnahmsweise nicht schuld.
Dr. M schrieb: > Goto ist schlichtweg einfach unnötig in C und verschlechtert die > Lesbarkeit. Linus Torvalds widerspricht dir da: >Albeit deprecated by some people, the equivalent of the goto statement is >used frequently by compilers in form of the unconditional jump instruction. >The goto statement comes in handy when a function exits from multiple >locations and some common work such as cleanup has to be done. If there is >no cleanup needed then just return directly. Quelle: https://www.kernel.org/doc/Documentation/CodingStyle
Davis schrieb: > Hast du keine eigene Meinung? Doch. Ich denke aber, dass die Meinung eines Linus Torvalds interessanter ist. Wenn du aber so daran interessiert bist, kann ich aber gerne auch noch einmal meine Meinung zum Besten geben.
Immerhin ist es ein GOTO und kein COMEFROM. Sparsam und am richtigen Platz gesetzt gehört es einfach dazu. Und deswegen ist es ja auch da. Viel interessanter ist die Meinung von Herrn Torvalds zu C++.
Hey W.S., dein Code ist grausam. Da versteht man keine Zeile deines Codes, soll das Hochsprache sein? Ich muss ja jede Zeile im RefManual nachlesen. RCC->CFGR = (7<<24) (Welches Bit wird hier wohin geschrieben, und warum?) alter, mit dem Stock zwischen die Beine!!! Der Code ist absolut nicht wartbar, schau den doch mal in einem 1/2 Jahr wieder an. Da wirst du dann das RefManual unters Kopfkissen packen müssen. Kommentare die den Code erklären??? Seit wann ist sowas Programmierung? Kommentare sind doch allgemein dafür da das "warum" zu erklären und nicht das "was". Code muss sich selbst erklären. Beste Grüße dein Lehrer
Der Code ist schon sehr kompakt, er benutzt halt direkt die Register und nicht über die Abstraction layer von ST oder CMSIS. Meiner Meinung nach hats da ST sowieso übertrieben. Man muss eine Seite coden damit mal ein Pin aktiviert wird. Wieso die keinen Treiber gemacht haben der das dann automatisch macht ... das gleiche beim SPI und erst recht SPI mit DMA SetGPIO(Port Pin UP 50) ... irgendwie so aber naja bei der Konfigurationsvielfalt die der Cortex bietet eigentlich kein Wunder. Vielleicht gibts irgendwann ein grafisches Tool im Kompiler um den cortex zu programmieren. Ich finde nämlich konfiguration tippen altmodisch. ahh moment gibts ja sogar bei Keil ..aber läuft leider nur mit der CMSIS / ARM Lib. und nicht mit der Std Periph. Lib.
Ersan G. schrieb: > Der Code ist schon sehr kompakt, er benutzt halt direkt die Register und > nicht über die Abstraction layer von ST oder CMSIS. Meiner Meinung nach > hats da ST sowieso übertrieben. > Man muss eine Seite coden damit mal ein Pin aktiviert wird. Wieso die > keinen Treiber gemacht haben der das dann automatisch macht ... das > gleiche beim SPI und erst recht SPI mit DMA Das muß so sein. Ist doch viel einfacher als bei AVR & Co. an W.S.-Rumnörgler schrieb: > dein Code ist grausam. Da versteht man keine Zeile deines Codes, soll > das Hochsprache sein? Ich muss ja jede Zeile im RefManual nachlesen. Also bitte. Eleganter als mit C gehts nun wirklich nicht!
Ich finde den Ansatz von W.S. nicht schlecht. Natürlich muß man mal ins Ref-Manual sehen, aber eigentlich nur einmal zu Beginn der Arbeit. Die CMSIS-Geschichten und was da so in den StdLib zu finden ist, ist ja ganz nett, aber in der Regel viel zu überladen. Ins Ref-Manual muß man auch sehen, allein schon, weil die STM32 eine sehr abstruse Peripherie haben. Der Vorteil hingegen liegt für den Anfänger wohl darin, dass er sich viele Sachen zusammenklicken kann, egal ob deren Funktion verstanden wurde oder nicht, wobei ich eher auf Letzteres tippe. Um auf das 'goto' im oben gezeigten Code zu kommen: ein while(--L && xyz); hätte es auch getan, um anschließend auf L != 0 zu testen.
Antimedial schrieb: > Davis schrieb: >> Hast du keine eigene Meinung? > > Doch. Ich denke aber, dass die Meinung eines Linus Torvalds > interessanter ist. Wenn du aber so daran interessiert bist, kann ich > aber gerne auch noch einmal meine Meinung zum Besten geben. Wenn deine Meinung uninteressanter ist, als das Geschwafel von Torvald, dann doch lieber nicht. Aber es ist schön, dass du deinen Rang in der Welt gefunden hast.
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.