STM32 Keil Lib und Compiler Probleme

Gast #2466230
Lesenswert?

Hallo zusammen,

ich setze mich seit einer geraumer Zeit mit dem STM32F103VC
auseinander, und muss für die Uni ein größeres Projekt fertig machen.

Nach vielem einlesen, meine ich die Standart Peripherie Library
und natürlich die Funktionen des STM32 verstanden zu haben.

Nunja, jetzt versuche ich meine ersten Laufschritte in Keil
zu bewerkstelligen, und habe schon da Probleme mit dem Einfügen
der Library und dem kompilieren.

Sehe ich es richtig das ich unter "Target Option" - "C/C++" - "Include 
Path" die Pfade für meine gewünschte Library eingebem muss?

Nach dem Compilieren kam folgende Fehlermeldung:
1
STM32 Board.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
2
STM32 Board.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.

Was genau bedeutet das?

Mal eine andere Frage,
hat denn nicht jemand ein fertiges Blanko Projekt,
wo man einfach loslegen kann?

...glaube nicht das es so schwierig sein kann... ;)
Gast #2466516
Lesenswert?

also, ich habe die test.zip runtergeladen und das kompilieren geht 
super...

flashen geht anscheinend auch,
nur wenn ich mit meinem oszi an die ports gehe,
sehe ich nichts

(Led pins müssten ja hich sein, zumindest abwechselnd)

ich habe folgendes geändert in options for target ... :

- device auf stm32f103vc geändert
- c/c++ preprocessor symbols auf USE_STDPERIPH_DRIVER,STM32F10X_HD
- debug auf use: cortex m... (nutze einen j-link von segger)
- utilities auch wieder auf cortex m...
---> settings -> stm32f10x high denisity flash 512 kb (eigentlich hat 
dieser ~380kb)

was kann ich noch verbrochen haben?
oder was muss ich noch umstellen?
Gast #2466626
Lesenswert?

1
void SetupSystem (void) {
2

3
  GPIO_InitTypeDef  GPIO_InitStructure;
4

5
  RCC_DeInit ();                        // RCC System Reset(for debug purpose)
6

7
  // Enable HSE (Umschaltung auf externen Quarz)
8
  RCC_HSEConfig (RCC_HSE_ON);
9

10
  // HSE-Umschaltung abwarten
11
  while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
12

13
  // System-Taktung
14
  RCC_HCLKConfig   (RCC_SYSCLK_Div1);   // HCLK   = SYSCLK
15
  RCC_PCLK2Config  (RCC_HCLK_Div1);     // PCLK2 (APB2) = HCLK
16
  RCC_PCLK1Config  (RCC_HCLK_Div2);     // PCLK1 (APB1) = HCLK/2
17
  RCC_ADCCLKConfig (RCC_PCLK2_Div6);    // ADCCLK = PCLK2/6
18

19
  // FLASH-Speicher Zugriff
20
  FLASH_SetLatency(FLASH_Latency_2);                        // Flash - 2 wait states
21
  FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);     // Pipeline freigeben
22

23
  // PLL Konfiguration
24
  // PLLCLK = 8MHz * 9 = 72 MHz
25
  RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);     // Externer Quarz, Faktor 9
26
  RCC_PLLCmd (ENABLE);                                      // Enable PLL
27

28
  // PLL-Konfiguration abwarten
29
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
30

31
  // PLL als System-Takt auswählen
32
  RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
33

34
  // PLL-Umschaltung abwarten
35
  while (RCC_GetSYSCLKSource() != 0x08);
36

37
  // GPIOs
38
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO A Takt freigeben
39
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIO B Takt freigeben
40

41
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;          // LED 1 Ausgang
42
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;    // Pin-Mode
43
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;    // Pin Taktung
44
  GPIO_Init(GPIOA, &GPIO_InitStructure);                // Port-Einstellung
45

46
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;           // LED 2 Ausgang
47
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;    // Pin-Mode
48
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;    // Pin Taktung
49
  GPIO_Init(GPIOB, &GPIO_InitStructure);                // Port-Einstellung
50
 
51
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;           // LED 2 Ausgang
52
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;    // Pin-Mode
53
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;    // Pin Taktung
54
  GPIO_Init(GPIOC, &GPIO_InitStructure);                // Port-Einstellung
55

56
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;           // LED 2 Ausgang
57
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;    // Pin-Mode
58
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;    // Pin Taktung
59
  GPIO_Init(GPIOD, &GPIO_InitStructure);                // Port-Einstellung
60

61
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_All;           // LED 2 Ausgang
62
  GPIO_InitStructure.GPIO_Mode  =  GPIO_Mode_Out_PP;    // Pin-Mode
63
  GPIO_InitStructure.GPIO_Speed =  GPIO_Speed_50MHz;    // Pin Taktung
64
  GPIO_Init(GPIOE, &GPIO_InitStructure);                // Port-Einstellung
65

66

67
}
68

69
/**
70
  * @brief  Main program.
71
  * @param  None
72
  * @retval None
73
  */
74
int main(void)
75
{
76

77
    SetupSystem();
78

79

80
    while (1) {
81

82
    GPIO_SetBits(GPIOA,GPIO_Pin_All);
83
    GPIO_SetBits(GPIOB,GPIO_Pin_All);
84
    GPIO_SetBits(GPIOC,GPIO_Pin_All);
85
    GPIO_SetBits(GPIOD,GPIO_Pin_All);
86
    GPIO_SetBits(GPIOE,GPIO_Pin_All);
87
        }
88
    } // end while

Habe den Code so geändert, das theoretisch alle Pins
high sein müssten, richtig?

Aber die Pins haben keine Spannung... -_-
Was mich nur wundert... Keil spuckt mir keine Fehlermeldung raus...
egal ob flashen oder debuggen... also scheint er kommunizieren
zu können. wo könnten denn jetzt die Fehler sein?
Persönliche Seite #2466641
Lesenswert?

Oh man ... immer diese riesen unübersichtlichen Libraries für kleine 
Projekte ...

Was für ein Developmentboard hast du?

Schau mal unter:
c:\keil\ARM\Boards\Keil\MCBSTM32
c:\keil\ARM\Boards\Keil\MCBSTM32C
c:\keil\ARM\Boards\Keil\MCBSTM32E

da findest du viele lesbare Beispiele.

Auch empfehle ich dir sehr, dir die CMSIS Sachen anzusehen, die werden 
in den Beispielen übrigens benutzt.


VG,
/th.
Gast #2466658
Lesenswert?

oh ja, hast recht Matthias,
da hab ich dank Frust, schlicht weg gepennt.

Random, da wird noch einiges dazu kommen,
nur stimmt irgendwas am Grundgerüst nicht.


so habs probiert, alle Pins auf low... -_-

irgendetwas stimmt mit den Einstellungen nicht...

oder was stellt ihr so ein, wenn ihr einen neuen Debugger habt,
und einen neuen STM32?

Vielleicht finde ich so meinen Fehler
Persönliche Seite #2466670
Lesenswert?

Florian schrieb:
> Random, da wird noch einiges dazu kommen,
> nur stimmt irgendwas am Grundgerüst nicht.

Den Low Level Kram progg ich immer selbst nach Manual. Genau abgestimmt 
auf das, was ich brauche. Und schnell. Nur Ethernet, USB etc. schnapp 
ich mir Libs.

> oder was stellt ihr so ein,
Ich lasse meist nen Pin toggeln, mit ner for(..) __NOP(); - loop. Dann 
weiss ich auch gleich, ob meine Clocks stimmen.
Gast #2466693
Lesenswert?

Öhm Random, glaub ich habe mich falsch ausgedrückt,
mir gehts garnicht darum ob irgendwas high, low oder toggelt...

ich hab das problem dass der mC nichtmals ansatzweise das macht was ich 
möchte.

mir gings nur darum zu schauen,
wenn ich meinen stm32f103vc flashe,
er auch das simpelste programm dann übernimmt!

ich habe alle ausgänge auf pp output gesetzt,
damit ich nachschauen kann, ob mein oszi auch
überall ~3V anzeigen tut...

was aber nicht der fall ist...

ich suche einen configurationsfehler,
kein programmfehler...

das absurde ist ja, das keil behauptet er würde was geflasht haben...

verstehste was gerade mein problem ist?
Gast #2466730
Lesenswert?

Danke Mehmet,

ich schaus mir gleich an :)

Also ich habe mein Problem gefunden,
bzw. ein Kollege hat mich drauf hingewiesen.
Ich hatte ein Schaltungsfehler auf meinem Board!

Und zwar hatte ich Boot0 permanent auf 3,3V,
dies hat zu dem Fehler geführt!

Dennoch Danke an alle!
Gast #2466987
Lesenswert?

Das PB4 bit hat auch mich für Radsel gestellt : obwohl es met den Remap 
klaptte, hat das jedenmal bei Reset hoch gestanden. Nicht so gunstig wen 
es verwendet werd für eine Motorsteuerung...
So : PB4 nie verwende für ein "muss" low Ausgang !!
Ansonst finde ich das ein Superteil !! Ich spiel mit das STM32v 
Discovery board, es ist Wahnsinnig was das Ding alles kan¨/ €cent !!
Gast #2467014
Lesenswert?

An meinem Board habe ich es vermieden...

ich mein, ich habe zich GPIOs,
da kann ich auf paar (für Jtag) verzichten,
ansonsten kommt die größere Variante...

was mich eher ärgert ist die Tatsache,
das mein Schaltplan richtig war,
aber beim Platinenlayout es vermurkst wurde...

oder wer kontrolliert schon gerne 100 beinchen auf Richtigkeit,
wenns schon vorher (Schaltplan) korrekt war

So viel Spaß noch beim Fußball schauen ;)
Gast #2468112
Lesenswert?

Um nicht einen neuen Threat aufmachen zu müssen,
hänge ich mal eine weitere Frage hier dran.

Und zwar hab ich das Problem beim kompilieren:
1
C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h(80): error:  #35: #error directive: "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)"

Wer kann mir sagen, wo ich was einstellen muss?
#4287710
Lesenswert?

Um jetzt nicht ein neuen Thread über die selbe ursprüngliche Frage 
aufmachen zu müssen:

Ich benutze auch Keil uvision 5 mit dem stm32f429-zit Discovery Board 
und habe beim kompilieren das selbe problem:
1
STM32 Board.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
2
STM32 Board.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.

was soll ich tun?
Gast #4287963
Lesenswert?

Josh K. schrieb:
> was soll ich tun?

Gegenfrage: Was bist du bereit zu tun?
Die gezeigten Fehlermeldungen sind eindeutig Linker-Beschwerden über 
fehlende Dinge im Startupcode.
Normalerweise sollten irgendwo (s.u.) solche Einträge stehen:
--cpu=Cortex-M4.fp
--output linked.axf
--ro-base 0x00000000
--rw-base 0x..na wo dein RAM losgeht
--first startupcode.o
--entry=Kaltstart  oder eben dein Reset-Handler
startup.o
*.o
*.o  eben alle deine objektcodes
main.o

Wer wie ich einen eigenen Startupcode in Assembler benutzt, hat damit 
garkeine Probleme, aber es ist ja bei STM32 Liebhabern derzeit Mode, 
einen Startup in C zu schreiben - und da liegt bei dir vermutlich der 
Haken. Vielleicht fehlt irgend ein verdammtes Pragma oder du hast den 
Kaltstart anders benannt als es in den diversen Projektfiles dieser IDE 
gerade Mode ist.

Mein Rat ist, das Ganze mal OHNE irgendeine IDE durchzuziehen und zwar 
nur per Batchdatei, aber mit sinnvollen .xcl (Kommandozeilen extension). 
Grund: Damit du es lernst, die eigentlichen Tools ohne irgendwelches 
Zeugs dazwischen aufzurufen. Einen positiven Nebeneffekt hat es auch: 
nämlich daß man die Sache direkter im Griff hat.

Ne passable compile.xcl wäre dies:
--strict
--cpu=Cortex-M4.fp
--c99
--thumb
-c

Und der Aufruf dazu:
echo Compile Main
armcc  --via compile.xcl  main.c
if Errorlevel==1 goto ende


Aber dazu müßtest du bereit sein, sowas zu tun und nicht wie alle 
Anderen partout auf der IDE bleiben zu wollen.

W.S.

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