Forum: Mikrocontroller und Digitale Elektronik STM32 und Keil MDK-ARM Einsteiger Frage


von Andre S. (andre-s)


Lesenswert?

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);
  }
}

von Nils P. (ert)


Lesenswert?

Du musst es erst definieren...
1
/* Private typedef ------------------------------------------*/
2
GPIO_InitTypeDef         GPIO_InitStructure;


Greez Ert

von Andre S. (andre-s)


Lesenswert?

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é

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Warum macht ihr das nicht direkt mit Registerzugriffen? Dann spart man 
sich den ganzen Kram...

von Uwe B. (derexponent)


Lesenswert?

Andre S. schrieb:
>
> Nur in welche Datei ist GPIO_InitTypeDef normalerweise definiert?
>
> André
1
#include "stm32f4xx_gpio.h"
2
#include "stm32f4xx_rcc.h"

von Falk B. (falk)


Lesenswert?

@ 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.

von Andre S. (andre-s)


Lesenswert?

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é

von Matthias (Gast)


Lesenswert?

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.

von Ahajasoso (Gast)


Lesenswert?

> Was du da verwendest ist ein eigener Treiber von ARM
>(GPIO_STM32Fxx.c).

Aha.

von Volker I. (vilex)


Lesenswert?

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.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

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.

von hans (Gast)


Lesenswert?

> 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).

von Andreas W. (geier99)


Lesenswert?

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
von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

"goto"? Wieso nicht einfach "break"?

von W.S. (Gast)


Lesenswert?

Gegenfrage: Wieso break? Goto ist ein einfaches, eindeutiges und gutes 
Grundstatement von C, also warum hat hier jemand was gegen goto?

W.S.

von W.S. (Gast)


Lesenswert?

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.

von goto -> No! (Gast)


Lesenswert?

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, ...

von W.S. (Gast)


Lesenswert?

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.

von goto -> No! (Gast)


Lesenswert?

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

von Dr. M (Gast)


Lesenswert?

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.

von Antimedial (Gast)


Lesenswert?

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

von Davis (Gast)


Lesenswert?

Antimedial schrieb:

> Linus Torvalds widerspricht dir da:

Hast du keine eigene Meinung?

von Antimedial (Gast)


Lesenswert?

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.

von GOTO-user (Gast)


Lesenswert?

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++.

von an W.S.-Rumnörgler (Gast)


Lesenswert?

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

von Ersi (cell85)


Lesenswert?

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.

von Moby (Gast)


Lesenswert?

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!

von m.n. (Gast)


Lesenswert?

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.

von hihi (Gast)


Lesenswert?

ähm, warten auf GOTO

von Davis (Gast)


Lesenswert?

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