Forum: Mikrocontroller und Digitale Elektronik IO Pins anteuern mit Keil uVision Problem


von Julian K. (darksoldier)


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

von holger (Gast)


Lesenswert?

>mein Quellcode ist derzeit dieser:
>
>void MAIN (void)

Na dann mach da mal main draus. C ist Case sensitiv.

von Julian K. (darksoldier)


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

von Julian K. (darksoldier)


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

von Fabian V. (vogtinator)


Lesenswert?

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

von Linker (Gast)


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.

von Fabian V. (vogtinator)


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)

von Julian Klein (Gast)


Lesenswert?

Hallo Fabian,
Danke für deine antwort. Könntest du mir mal bitte sagen wie ich das 
anstellen muss? ;) Weil ich bin Basic verwöhnt ;)

Danke
Julian

von Fabian V. (vogtinator)


Lesenswert?

Dazu bräuchten wir noch ein paar mehr Informationen:
-Welches Betriebsystem benutzt du?
-Welche Toolchain (Compiler, Linker etc.)
-Welche IDE (Eclipse, Visual Studio xD)

von Linker (Gast)


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.

von Linker (Gast)


Lesenswert?

Fabian V. schrieb:
> Dazu bräuchten wir noch ein paar mehr Informationen:
> -Welches Betriebsystem benutzt du?

Ach ja, auch hier lesen. ;-)

Schau in den Beitragsbeteff!

von Julian K. (darksoldier)


Lesenswert?

Fabian V. schrieb:
> Dazu bräuchten wir noch ein paar mehr Informationen:
> -Welches Betriebsystem benutzt du?
> -Welche Toolchain (Compiler, Linker etc.)
> -Welche IDE (Eclipse, Visual Studio xD)


Windows 7 64Bit mit dem SP1

und dann eben KEIL uVision4LITE

von Julian K. (darksoldier)


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

von W.S. (Gast)


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.

von Julian K. (darksoldier)


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

von gq345g2q (Gast)


Lesenswert?

assert_param

Das Problem habe ich auch schon mal einige Monate durch 5 Minuten 
googlen
lösen können.

von Smati (Gast)


Lesenswert?

"assert_param"

"Das Problem habe ich auch schon mal einige Monate durch 5 Minuten
googlen lösen können."

Kannst Du mal zeigen wie Du das Problem gelösen hast?
Danke!

von Smati (Gast)


Lesenswert?

Problem Lösung lautet:

die #include <"stm32f4xx_conf.h> in stm32f4xx_gpio.c | stm32f4xx_rcc.c 
einfügen weil ST hat in diesen libaries vergessen den header zu 
inkludieren.

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.