Forum: Mikrocontroller und Digitale Elektronik Eclipse Funktion wird nicht aufgerufen STM32 ARM


von Chrissel (Gast)


Lesenswert?

Hallo Zusammen,

ich hab ein kleines Problem. Ich hab Eclipse mit ARM GCC und der STM 
Standart Lib installiert. Als Plattform hab ich von der Uni momentan ein 
Nucleo STM32 F411RE.

Es geht um folgendes, ich will einfach nur eine LED am Port A Pin 5 
Blinken lassen. Mit folgendem Code funktioniert es auch:
1
#include <stm32f4xx_gpio.h>
2
#include <stm32f4xx_tim.h>
3
#include <stm32f4xx_rcc.h>
4
#include <misc.h>
5
6
7
int main()
8
{
9
10
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
11
12
  GPIO_InitTypeDef gpioStructure;
13
  gpioStructure.GPIO_Pin = GPIO_Pin_5;
14
  gpioStructure.GPIO_Mode = GPIO_Mode_OUT;
15
  gpioStructure.GPIO_Speed = GPIO_Speed_50MHz;
16
  GPIO_Init(GPIOA, &gpioStructure);
17
18
  GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
19
20
21
    for (;;) {
22
      GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
23
      for (int i = 0; i < 5000000; i++);     // Warte damit man es Blinken sieht
24
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
25
        for (int i = 0; i < 5000000; i++);
26
27
    }
28
29
}

Wenn ich jetzt aber meine Initialisierung in eine Funktion pappe, wie 
folgt:
1
#include <stm32f4xx_gpio.h>
2
#include <stm32f4xx_tim.h>
3
#include <stm32f4xx_rcc.h>
4
#include <misc.h>
5
6
void InitIOs()
7
{
8
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
9
10
  GPIO_InitTypeDef gpioStructure;
11
  gpioStructure.GPIO_Pin = GPIO_Pin_5;
12
  gpioStructure.GPIO_Mode = GPIO_Mode_OUT;
13
  gpioStructure.GPIO_Speed = GPIO_Speed_50MHz;
14
  GPIO_Init(GPIOA, &gpioStructure);
15
16
  GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
17
18
}
19
20
21
22
int main()
23
{
24
  InitIOs();
25
26
    for (;;) {
27
      GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
28
      for (int i = 0; i < 5000000; i++);     // Warte damit man es Blinken sieht
29
        GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
30
        for (int i = 0; i < 5000000; i++);
31
32
    }
33
34
}

Funktioniert das ganze nicht mehr. Die Sache dabei ist, das es vorher 
mal alles funktioniert hat. Seitdem ich von Win7 auf Win10 umgestiegen 
bin, hab ich nur noch Probleme in dieser hinsicht. Eclipse etc wurde 
wieder "frisch" installiert.

Hat jemand eine Idee? Ich bin da leider mit meinem Latein am Ende..

von R. F. (rfr)


Lesenswert?

WAS funktioniert nicht mehr? Welche Ausgabe des Compilers gibt es?

Gruss
Robert

von Chris H. (Gast)


Lesenswert?

Hab mich jetzt mal angemeldet.

Also die LED Blink nicht mehr. Es sieht so aus, als würde die Funktion 
zum Initialisieren des GPIOs nicht aufgerufen.

In der Console von Eclipse (falls du das mit Compiler Auszug meinst) 
steht folgendes:
1
21:03:38 **** Incremental Build of configuration Debug for project SDChanger ****
2
make all 
3
'Invoking: Cross ARM GNU Print Size'
4
arm-none-eabi-size --format=berkeley "SDChanger.elf"
5
   text     data      bss      dec      hex  filename
6
   5769      176      412     6357     18d5  SDChanger.elf
7
'Finished building: SDChanger.siz'
8
' '
9
10
21:03:39 Build Finished (took 894ms)

Es sieht für mich so aus, als würde Eclipse den Code schon richtig 
compilieren

von holger (Gast)


Lesenswert?

>Es sieht so aus, als würde die Funktion
>zum Initialisieren des GPIOs nicht aufgerufen.

Schon mal in die *.map Datei geschaut ob deine neue Funktion
da drin steht?

von clonephone82 (Gast)


Lesenswert?

Managed project oder makefile?  Compiler optimization  und debug 
Einstellungen überprüft?

von Chris H. (Gast)


Lesenswert?

Ja, in der .map - in Zeile 6149 - steht folgendes
1
 .text.InitIOs  0x08000ac4       0x38 ./src/main.o
2
                0x08000ac4                InitIOs

Grüße

von holger (Gast)


Lesenswert?

>Also die LED Blink nicht mehr.

Leuchtet sie dauernd? Deine Verzögerungsschleifen könnten
vom Compiler wegoptimiert werden weil sie nichts tun.
Normalerweise nimmt man für so was Timer.

Versuch mal

        for (volatile int i = 0; i < 5000000; i++);

von Chris H. (Gast)


Lesenswert?

holger schrieb:
>>Also die LED Blink nicht mehr.
>
> Leuchtet sie dauernd? Deine Verzögerungsschleifen könnten
> vom Compiler wegoptimiert werden weil sie nichts tun.
> Normalerweise nimmt man für so was Timer.
>
> Versuch mal
>
>         for (volatile int i = 0; i < 5000000; i++);

Nene, die LED macht gar nichts. Sie leuchtet nichtmal. Ich hab schon 
versucht die LED vor der for-Schleife einzuschalten und die Loop leer zu 
lassen. Hat auch nicht funktioniert.

clonephone82 schrieb:
> Managed project oder makefile?  Compiler optimization  und debug
> Einstellungen überprüft?

Der Builder ist extern von ARMGCC sprich die make.exe. Compiler 
optimization musst du mir mal auf die Sprünge helfen, da finde ich so 
schnell nichts bei den vielen Einstellungsmöglichkeiten

von Sebastian S. (amateur)


Lesenswert?

Ich kenne weder die Umgebung noch den Prozessor, aber hast Du mal 
"sauber" gemacht?
Also alle .o und was sonst noch angelegt wird gelöscht.

von mh (Gast)


Lesenswert?

Chrissel schrieb:
> Mit folgendem Code funktioniert es auch:
...
> Wenn ich jetzt aber meine Initialisierung in eine Funktion pappe, wie
> folgt:
...
>
> Funktioniert das ganze nicht mehr. Die Sache dabei ist, das es vorher
> mal alles funktioniert hat. Seitdem ich von Win7 auf Win10 umgestiegen
> bin, hab ich nur noch Probleme in dieser hinsicht.

Hä? Was denn nu? Es geht niht mehr seit Du die Initialisierung in eine 
Funktion gepackt hast, oder seit Du auf Win10 umgestiegen bist?
Irgendwie gibst Du zwei Ursachen für Dein Problem an...

Klappt's unter Win10 ohne InitIOs-Funktion (also alles in der main)?
Wenn ja, was soll dann das gejammer' wegen Win10?

Die nucleo-Boards haben doch einen ST-Link drauf, oder? Hast Du das 
Programm mal im Debugger durchgesteppt?

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.