IO Pins anteuern mit Keil uVision Problem

OP #3009645
Lesenswert?

Hallo,
ich habe mir das STM32f4Discovery board besorgt. Ich habe versucht 
meinen ersten Quellcode zu schreiben. In diesen sollen
1
#include <stm32f4xx_gpio.h>
2
#include <stm32f4xx_gpio.c>
eingebunden werden. Diese sind von der Downloadseite von ST.

Nur habe ich wenn ich das Programm Compilieren möchte folgende 
Fehlermeldungen:

uebung.axf: Error: L6218E: Undefined symbol RCC_AHB1PeriphResetCmd 
(referred from main.o).
uebung.axf: Error: L6218E: Undefined symbol assert_param (referred from 
main.o).
uebung.axf: Error: L6218E: Undefined symbol main (referred from 
entry8.o)

mein Quellcode ist derzeit dieser:
1
#include <stm32f4xx.h>
2
#include <stm32f4xx_gpio.h>
3
#include <stm32f4xx_gpio.c>
4

5
void MAIN (void)
6
{
7
  
8
}

Danke im vorraus,
mfg
Julian Klein
OP #3009666
Lesenswert?

Danke für den Hinweis ;) komme aus der Basic Ecke und vergesse das 
immoment sehr häufig ;)
Jetzt sind es nur noch 2 Fehlermeldungen ;)


uebung.axf: Error: L6218E: Undefined symbol RCC_AHB1PeriphResetCmd 
(referred from main.o).
uebung.axf: Error: L6218E: Undefined symbol assert_param (referred from 
main.o).
OP #3009709
Lesenswert?

SO also Problem behoben alle ERROR MEssages sind weg ;)

Nur wüsst ich ger warum ;)

Ich habe meinen Code nun so verändert:
1
#include <stm32f4xx.h>
2
#include <stm32f4xx_gpio.h>
3
#include <stm32f4xx_rcc.h>
4

5

6
int main (void)
7
{
8
  
9
}

Das Einzige was ich hinzugefügt habe ist:
1
#include <stm32f4xx_rcc.h>

danke
Julian
Gast #3009743
Lesenswert?

Julian Klein schrieb:
> Nur wüsst ich ger warum ;)
>
> Ich habe meinen Code nun so verändert:
> #include <stm32f4xx.h>
> #include <stm32f4xx_gpio.h>
> #include <stm32f4xx_rcc.h>
>
>
> int main (void)
> {
>
> }
>
>
> Das Einzige was ich hinzugefügt habe ist:#include <stm32f4xx_rcc.h>

Du hast die unbekannten Bezeichner mit dem neuen Include bekannt 
gemacht.

Fabian V. schrieb:
> Du hast#include <stm32f4xx_gpio.c> entfernt.
> In C includiert man nur Header (*.h) Dateien, nicht den richtigen Code.

Man muss aber die *.c im Projekt einbinden, sonst kann man es nicht 
linken.
#3009757
Lesenswert?

> Fabian V. schrieb:
>> Du hast#include <stm32f4xx_gpio.c> entfernt.
>> In C includiert man nur Header (*.h) Dateien, nicht den richtigen Code.
>
> Man muss aber die *.c im Projekt einbinden, sonst kann man es nicht
> linken.
Aber nicht als Include.
Die Includes sind dafür da, dass der Compiler weiß, wie genau die 
Funktionen aussehen.
Beim Linken werden dann die Funktionen mit den anderen aus den anderen 
Code-Dateien verknüpft (->Linken)
Gast #3009803
Lesenswert?

Fabian V. schrieb:
> Aber nicht als Include.
> Die Includes sind dafür da, dass der Compiler weiß, wie genau die
> Funktionen aussehen.
> Beim Linken werden dann die Funktionen mit den anderen aus den anderen
> Code-Dateien verknüpft (->Linken)

Man muss schon lesen können. ;-)

Ich schrieb

Linker schrieb:
> die *.c im Projekt einbinden

Schau einmal bei Keil vorbei und lerne, was ein Projekt ist.

Und der Linkerlauf macht ein wenig mehr, als nur die übersetzten Module 
(*.obj) zusammen zu fassen. Er setzt auch die Adressen ein! Keil nennt 
ihn auch Linker/Locator.
OP #3010848
Lesenswert?

Hallo,
also ich habe noch etwas weiter experimentiert: Aber trotzdem bleibt die 
Fehlermeldung erhalten:
uebung.axf: Error: L6218E: Undefined symbol assert_param (referred from 
misc.o).

Das heisst ja soweit ich weiß, dass die Funktion assert_param nirgends 
deklariert ist aber auf sie zugegriffen wird oder?

Ich habe mir das Beispiel IO_Toggle von ST mal angeschaut, aber dort 
finde ich auch nirgends die Deklaration davon. Aber das lässt sich 
Problemlos compilen. Was mache ich falsch?

Danke für eure Hilfe,
mfg
Julian Klein
Gast #3011181
Lesenswert?

Julian Klein schrieb:
> dass die Funktion assert_param nirgends..

Hör mal, du mußt bei C unterscheiden lernen, was nach einer Funktion 
aussieht und was keine ist:
"Error: L6218E: Undefined symbol assert_param"

Das läßt schlicht und einfach darauf schließen, daß dies ein Symbol 
ist und daß selbiges nirgendwo in einer der Quellen definiert ist, 
sondern quasi auf der Kommandozeile. C-Leute machen das gern so.

Also schreib vor alle deine Includes einmal ein

#define assert_param 0

und gucke, ob damit die Fehlermeldung verschwunden ist. Sie ist  m.E. 
mit ziemlicher Sicherheit weg, aber das sollte dich dazu anspornen, in 
der betreffenden Datei nach dem eigentlichen Sinn dieser Definition 
nachzuschauen.

Ganz generell mein Tip: Inkludiere zum Anfang möglichst wenig, am besten 
bloß die .h, wo die eigentlichen Hardwareregister des verwendeten uC 
definiert sind. Ich weiß, daß das bei ST bereits ne krötige Sache ist, 
denn die Burschen ziehen sich mit Begeisterung innerhalb der STM32xxx.h 
einen riesigen Sack anderer .h mit rein, insbesondere den ganzen 
Cortex-Header-Kram. Ich hab genau aus diesem Grunde mir schon seit eh 
und je meine Headerdateien anhand des Usermanuals vom uC selber 
zusammengestellt. Das mag auf den allerersten Blick frontal gegen die 
angeborene Faulheit fast aller Programmierer gehen, sichert mir aber, 
daß meine Quellen relativ frei sind von überflüssigem Zeugs, das einem 
irgendwann mal auf die Füße fällt.

W.S.
OP #3011220
Lesenswert?

Oh ich vergessen vorhin auf Senden zudrücken ;)
Ich habe vorhin schon den Fehler gefunden und ihn ausgebssert wollte das 
auch eigentlich schreiben habe aber dann vergessen das abzusenden ;)

Naja auf jeden Fall Problem gelöst, ST hat in einem von den Libaries 
vergessen, einen Header zu inkludieren.

Danke nochmal an alle die mir weitergeholfen haben ;)

mfg
Julian Klein

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