Forum: Compiler & IDEs STM32F030 Problem mit GPIO


von David S. (david_s97)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich versuch gerade ein stm32f030f4p6 zum laufen zu bringen. Jetzt 
versuche ich eine LED zum Blinken zu bringen. Der Code compiliert ohne 
Probleme und wird mithilfe OpenOCD und eines STM32 Nucleo Bordes 
geflasht, aber irgendwie blinkt die LED nicht. BOOT0 ist auf GND, 
Spannungsversogung ist gewährleistet auf allen drei Pins und Reset ist 
floating (sollte aber kein Problem sein da der STM32 intern PullUps 
hat). Im anhang hab ich mal ein ZIP mit Makefile, Library, usw. geladen. 
Wer keine Lust darauf hat, hier ist der Sourcecode(leicht gekürzt):
1
#include "stm32f0xx.h"
2
#include "stm32f0xx_gpio.h"
3
#include "stm32f0xx_rcc.h"
4
5
GPIO_InitTypeDef GPIO_InitStructure;
6
7
void init(void) {
8
  GPIO_InitTypeDef GPIO_InitStructure;
9
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
10
11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
12
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
13
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
14
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
15
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
16
  GPIO_Init(GPIOA, &GPIO_InitStructure);
17
}
18
19
int main (void) {
20
  init();
21
22
  while (1) {
23
    GPIOA->BSRR = GPIO_Pin_4;
24
    Delay(10000000L);
25
    GPIOA->BRR = GPIO_Pin_4;
26
27
    Delay(10000000L);
28
  }
29
}
30
31
void Delay(uint32_t nCount) {
32
  while(nCount !=0) {
33
    nCount--;
34
  }
35
}

Kann mir irgendjemand helfen? Schonmal danke im Vorraus.

David

von holger (Gast)


Lesenswert?

Was auch immer du auch für eine IDE benutzt:

Klick in deinen Linker Optionen mal auf

Do not use standard start files

von Michael (Gast)


Lesenswert?

Clock vom Port einschalten net vergessen ;)

von Guest (Gast)


Lesenswert?

Michael schrieb:
> Clock vom Port einschalten net vergessen ;)

David S. schrieb:
> RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

;-)

von Programmierer (Gast)


Lesenswert?

wenn man ohne Optimierungen kompiliert dauert das delay  vermutlich 
minuten. Hast du so lange gewartet beim testen?

von m.n. (Gast)


Lesenswert?

Alles schwärmt von Cortex M0/M4, weil man diese so gut 'debuggen' kann, 
und hier wird diese Möglichkeit überhaupt nicht genutzt.
Einen Breakpoint auf das while(1) und dann per Einzelschritt ansehen, 
was das Programm macht; delay() kann man ja zunächst komplett entfernen.
Das ist doch die einfachste Grundübung!

von David S. (david_s97)


Lesenswert?

m.n. schrieb:
> Alles schwärmt von Cortex M0/M4, weil man diese so gut 'debuggen'
> kann,
> und hier wird diese Möglichkeit überhaupt nicht genutzt.
> Einen Breakpoint auf das while(1) und dann per Einzelschritt ansehen,
> was das Programm macht; delay() kann man ja zunächst komplett entfernen.
> Das ist doch die einfachste Grundübung!

Ich habe (noch) keine Ahnung wie ich das mit OpenOCD mach.

Programmierer schrieb:
> wenn man ohne Optimierungen kompiliert dauert das delay
> vermutlich
> minuten. Hast du so lange gewartet beim testen?

Ich hab gcc gesasgt, das er auf Größe optimieren soll ("-Os"). Ausserdem 
hat ich ihn ne weile neben mir laufen und habe nichts gesehen.

holger schrieb:
> Was auch immer du auch für eine IDE benutzt:
>
> Klick in deinen Linker Optionen mal auf
>
> Do not use standard start files

Da ich das ganze mit einem Makefile mache geht das nicht.

von Jope (Gast)


Lesenswert?

Wenn Du das mit Optimierungen kompilierst, sollte die Zählvariable 
Deiner Delay-Funktion 'volatile' sein:
1
void Delay(volatile uint32_t nCount) 
2
{....}
Ohne das 'volatile' optimiert Dir der Compiler die ganze Funktion weg. 
Am Besten benutzt Du dafür aber den Systick- oder andere Timer; das ist 
dann auch deutlich präziser.

von Simon (Gast)


Lesenswert?

David S. schrieb:
> holger schrieb:
>> Was auch immer du auch für eine IDE benutzt:
>>
>> Klick in deinen Linker Optionen mal auf
>>
>> Do not use standard start files
>
> Da ich das ganze mit einem Makefile mache geht das nicht.

Natürlich geht das:
-nostartfiles als Linker-Option.

David S. schrieb:
> Ich habe (noch) keine Ahnung wie ich das mit OpenOCD mach.

Ich finde, das solltest Du zuallererst ändern. Es macht einfach 
viiiiiiel mehr Spass, wenn Du beobachten kannst, was das Teil macht. Und 
wie gesagt, der STM32 kommt mit einer so wunderschönen 
Debug-Unterstützung. Und die neue OpenOCD kommt mit dem ST-Link 
wunderbar zurecht. Eclipse mit GDB funktioniert super. Und dann siehst 
Du nämlich sofort, ob er es überhaupt bis zur main() geschafft hat, oder 
ob er schon vorher in den Seilen (sprich: im Hard-Fault-Handler) hängt, 
ob er sich beliebig lange in der Schlaufe aufhält, weil Du von einem 
völlig falschen Takt ausgehst, etcetc.

Ich finde, beim STM32 sollte das erste Ziel sein: Der Debugger muss bei 
main() in den Breakpoint rennen. Erst wenn das erreicht ist, kann man 
sich an so komplizierte Dinge wie blinkende LED heranwagen. :-) (trotz 
Smiley ernst gemeint.)

Gruäss
Simon

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.