STM32 Nucleo Board LED schaltet nicht ein

OP #5208178
Lesenswert?

Hallo, brauche mal wieder eure Hilfe.

Ich habe mir ein ST Nucleo F103RB Board gekauft und habe damit 
(erfolglos) experimentiert.

Ich verwende folgenden Code (aus einem Tutorial von Youtube von 
UltraFx):
1
#include "stm32f10x.h"
2

3
int main(void)
4
{
5
  RCC->APB2ENR |= 0x04;
6

7
  GPIOA->CRL = 0x200000;
8

9
  uint32_t check = 0;
10

11
  while(1)
12
  {
13
    GPIOA->BSRR = 0x20;
14

15
    for(check = 0; check < 20000000; check++) {
16
      ;
17
    }
18

19
    //GPIOA->BRR = 0x20;
20

21
    //for(check = 0; check < 20000000; check++);
22
  }
23
}

Nun blinkt die LED nicht (auch wenn ich den auskommentierten Teil wieder 
einkommentiere), und so geht sie auch nicht an, wenn man ganz genau 
hinsieht, dann leuchtet sie mit vielleicht 1% Helligkeit.

Mit LED meine ich immer die onboard grüne "User- LED".

Was mache ich denn falsch?

Danke für jede Hilfe.
OP #5208191
Lesenswert?

Ja hast du vollkommen recht, würde man natürlich machen.

Nun ist es aber so, dass ich den Code kopiert habe, und derjenige der 
das Tutorial gemacht hat das selbe Board wie ich benützt.

Da die LED bei ihm blinkt gehe ich davon aus, dass die Zahlen stimmen, 
ich habe eigentlich die for Schleife im Verdacht...
Gast #5208208
Lesenswert?

Jetzt muss ich doch mal fragen.
Immer wieder tauchen schon beim Blinky diese "geht nicht" Fragen auf.
Was habt ihr eigentlich mit den Dingern vor? Wie soll es weiter gehen?
Die andere Hardware im µC ist ein wenig umfangreicher als ein 
Pin-Wackler.
Wollt ihr wirklich jedes Bit zusammen fragen?

Ich denke, wer etwas ernsthaftes mit den µC anstellen will, sollte die 
angebotene Hilfestellung in Form von HAL in Anspruch nehmen.

Wer wirklich jedes Bit verstehen will, kann auch später von dort aus 
seine Forschungen starten.
OP #5209259
Lesenswert?

1
#include "stm32f10x.h"
2

3
int main(void)
4
{
5
  RCC->APB2ENR |= 0x04;
6

7
  GPIOA->CRL = 0x200000;
8

9
  uint32_t check = 0;
10

11
  GPIOA->BSRR = 0x20;
12

13
  while(1)
14
  {
15
    
16
  }
17
}

Ich habe den Code wie oben abgeändert.

Nun hätte ich mir erwartet, dass die LED an bleibt.

Wenn ich mit dem Debugger schrittweise gehe, dann geht die LED an, lasse 
ich das Programm laufen glimmt sie.

Also muss ich da irgendwo einen gewaltigen Denkfehler haben...
OP #5210779
Lesenswert?

1
#include "stm32f10x.h"
2

3
int main(void)
4
{
5
  RCC->APB2ENR |= 0x04;
6

7
  GPIOA->CRL = 0x200000;
8

9
  uint32_t check = 0;
10

11
  while(1)
12
  {
13
    GPIOA->BSRR = 0x20;
14
  }
15
}

Kann mich vielleicht doch jemand aufklären was ich hier falsch mache?

Steppe ich mit dem Debugger über die Zeile
GPIOA->BSRR = 0x20;
geht die LED an,

lasse ich das Programm laufen glimmt sie....
#5210950
Lesenswert?

Ist denn dein Takt schon richtig konfiguriert wenn der da so schnell auf 
die Pins losgeht? Ich würde da einfach Mal zwischen jeden Schritt ein 
paar Pausen einbauen und gucken ob es dann geht.


Oder vielleicht Steps du Mal nicht komplett durch und machst einen 
breakpoint erst in der Schleife und guckst dir dann Mal die Register an.
Gast #5211934
Lesenswert?

> Warum verwendest Du nicht die SPL von ST?

Vielleicht, weil STM selbst darauf hinweist, dass man sie nicht mehr 
verwenden soll? Die ist seit ein paar Jahren deprecated!

Aber die richtige Antwort hatte er ja schon geschrieben:

> Ich verwende folgenden Code (aus einem Tutorial von
> Youtube von UltraFx)

> Nun ist es aber so, dass ich den Code kopiert habe

> Dann ist das Turial scheiße.
Ja.
OP #5211994
Lesenswert?

1
#include "stm32f10x.h"
2

3
int main(void)
4
{
5
  RCC->APB2ENR |= 0x04;
6

7
  GPIOA->CRL = 0x200000;
8

9
  uint32_t check = 0;
10

11
  GPIOA->BSRR = 0x20;
12

13
  while(1)
14
  {
15

16
    check++;
17
    if(check > 10) {
18
      check = 0;
19
    }
20
  }
21
}

Habe den Code nochmal geändert, damit die while Schleife was zu tun hat.
Steppe ich durch (also auch x mal über das inkrementieren von check) 
bleibt die LED an.

Lasse ich das Programm laufen glimmt sie.

Wenn ich wieder auf Pause gehe, ist das Programm immer irgendwo in der 
nähe des Inkrementierers.

Ich bin ratlos ;-)
#5212058
Lesenswert?

Peter H. schrieb:
> Lasse ich das Programm laufen glimmt sie.
>
> Wenn ich wieder auf Pause gehe, ist das Programm immer irgendwo in der
> nähe des Inkrementierers.

Und dann leuchtet sie wieder?

Setz mal nen Breakpoint an den Anfang der main(), evtl. wird er durch 
irgendwas resettet, dann müsste er wieder oben in der main vorbeikommen? 
Watchdog vielleicht?

Falsche (zu hohe) Takteinstellungen können ebenfalls zu crash und/oder 
Reset oder sonstigem aberwitzigen Verhalten führen, hatte ich selbst 
auch mal (F401RE), da wollte er dann bei nem Sprung am Ende der Loop 
stattdessen an eine vollkommen absurde nicht-existierende Adresse 
springen, hat ne Weile gedauert bis ich ihn im Debugger genau an der 
Stelle erwischt habe wo das machen wollte.

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