ARM-Keil: SystemInit STM32F103C8

Gast #3339246
Lesenswert?

Bis jetzt habe ich mit einer älteren Demoversion von ARM-Keil 
"gespielt". Nachdem Problemen mit meinem ST-Link bin ich auf die 
aktuelle Demo umgestiegen.

Das Projektfile habe ich neu aufgesetzt und es wird eine neue 
Startupdatei hinzugefägt.

Beim compilieren erhalte diese Fehlermeldung:

Error: L6218E: Undefined symbol SystemInit (referred from 
startup_stm32f10x_md.o).

Wenn ich die Zeilen, die sich auf SystemInit beziehen, in der 
Startupdatei auskommentiere, dann wird ohne Fehlermeldung compiliert. 
Das erzeugte Programm funktioniert ebenfalls. Zumindest ist mir nichts 
aufgefallen.

Was hat es mit SystemInit auf sich? Muss ich eine Funktion mit diesem 
Namen schreiben?

1
Reset_Handler    PROC
2
                 EXPORT  Reset_Handler             [WEAK]
3
     IMPORT  __main
4
;     IMPORT  SystemInit
5
;                 LDR     R0, =SystemInit
6
;                 BLX     R0
7
                 LDR     R0, =__main
8
                 BX      R0
9
                 ENDP
#3339314
Lesenswert?

Unter \Keil\ARM\Startup\ST\ sind die Files system_stm32f10x.c bzw. 
system_stm32f10x_cl.c (für Connectivity line devices) enthalten.
Da ist diese Funktion implementiert.
Wenn Du dort nachschaust, wird Du sehen, das da RCC und der restliche 
Kram initalisiert werden kann (aber nicht muss, wenn Du es wo anders 
selbst erledigst).
Gast #3339354
Lesenswert?

Danke für deine Antwort.

Wenn ich die Datei system_stm32f10x.c in das Projekt aufnehme erhalte 
ich diese Fehlermeldung:

C:\Keil4\ARM\Inc\ST\STM32F10x\stm32f10x.h(96): error:  #35: #error 
directive: "Please select first the target STM32F10x device used in your 
application (in stm32f10x.h file)"

Den Controller habe ich im Targetdialog angegeben, sowie es in 
stm32f10x.h vorgeschlagen wird:


Tip: To avoid modifying this file each time you need to switch between 
these
devices, you can define the device in your toolchain compiler 
preprocessor.


Da mache ich doch etwas gewaltig falsch. Nur was?
#3339370
Lesenswert?

Im "Options for Target"-Dialog unter "C/C++" im Feld "Preprozessor 
Symbols" "STM32F10X_MD" eintragen (ohne die Anführungszeichen).
Wenn mehere Symbole dort eingetragen werden sollen, dann einfach mit 
Komma trennen.

So ein Eintrag hat die gleiche Bedeutung wie
1
#define STM32F10X_MD
Das könntest Du alternativ auch irgendwo so in deine Source aufnehmen.

Oder so, um Fehlermeldungen zu vermeiden, dass das Symbol schon 
definiert sein.
1
#ifndef STM32F10X_MD
2
#define STM32F10X_MD
3
#endif

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