Forum: Mikrocontroller und Digitale Elektronik STM32 Keil Lib und Compiler Probleme


von Florian (Gast)


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

von Matthias K. (matthiask)


Lesenswert?

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

Beitrag "ARM STM32 Eingänge werden nicht erkannt"

Ziemlich weit unten: test.zip

von Florian (Gast)


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?

von Florian (Gast)


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?

von Random .. (thorstendb) Benutzerseite


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.

von Matthias K. (matthiask)


Lesenswert?

Florian schrieb:
> RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIO A Takt freigeben
>   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIO B Takt freigeben

Für die andern Ports musst Du dann auch den Takt freigeben!

von Florian (Gast)


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

von Random .. (thorstendb) Benutzerseite


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.

von Florian (Gast)


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?

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

Beiliegend ein Blinky-Template.
Meine Datenstruktur ist wie folgt:

E:\Data\Cpu\Arm\Keil\

E:\Data\Cpu\Arm\St\Vers_3.5\
                             -> CMSIS
                             -> StdPeriph

Viel Glück!

von Florian (Gast)


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!

von Mehmet K. (mkmk)


Lesenswert?

Freut mich, dass sich Dein Problem in Luft aufgelöst hat.
Falls es Dich tröstet: ich habe einen ganzen Tag verloren, weil ich PB.4 
als Output vorgesehen, aber ganz vergass hatte, dass das der NJTRST 
Anschluss war und deshalb remapped werden musste.
Shit happens!

von Matthias K. (matthiask)


Lesenswert?

Mehmet Kendi schrieb:
> Falls es Dich tröstet:

Es gibt hier kaum jemanden, der das gewisse eine Bit nicht schon Tage 
lang gesucht hat ;))

von RP6Conrad (Gast)


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 !!

von Florian (Gast)


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

von Florian (Gast)


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?

von Mehmet K. (mkmk)


Lesenswert?

@Florian

Option for target -> C/C++
Dort im Define deine MCU angeben.
Bei mir ist es ein STM32F103C8 weshalb ich dort STM32F10X_MD eingetragen 
habe.

von Florian (Gast)


Lesenswert?

danke :)

von Josh K. (mascail)


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?

von W.S. (Gast)


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.

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.