Forum: Mikrocontroller und Digitale Elektronik STM32F429 Anfängerfragen


von Michael Bauer (Gast)


Lesenswert?

Hallo,

ich steige gerade in die Welt der Cortex-M4 ein und habe mir dazu das 
Discovery Kit mit dem STM32F429ZI geholt. Als IDE habe ich mir jetzt für 
den Anfang den Keil uVision5 geholt. Nun bin ich dabei mir ein paar 
Beispielprogramme anzuschauen. Nur hänge ich an folgendem Code für die 
Geschwindigkeit des Systick.
1
  SystemCoreClockUpdate();                      /* Get Core Clock Frequency   */
2
  if (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts  */
3
    while (1);                                  /* Capture error              */
4
  }

Get Core Clock ist mir klar und auch SysTick 1 msec habe ich mir 
angeschaut und verstanden, nur die while(1) ist mir unklar. Die Funktion 
SysTick_Config gibt bei Erfolg eine 0 und bei einem Fehler eine 1 
zurück. Wenn das Einstellen nun schief geht springt er in die 
Whileschleife aber wie kommt er da wieder raus ? Es kann doch nicht 
sein, dass bei einem Fehler der uC sich aufängt und einen Hardwarereset 
braucht ?

Gruß Michael

von m.n. (Gast)


Lesenswert?

Michael Bauer schrieb:
> Wenn das Einstellen nun schief geht springt er in die
> Whileschleife aber wie kommt er da wieder raus ?

Er soll dort nicht herauskommen, sondern verfolgbar machen, wo der 
Fehler passiert ist. Man könnte auch im Debugger einen Breakpoint 
setzen.

von Sukzessive A. (sukapxconv)


Lesenswert?

Er probiert an der Stelle solange den SysTick einzustellen bis es 
geklappt hat. Ist doch sofort ersichtlich ;)

von Augen weit offen (Gast)


Lesenswert?

Sukzessive Approximation schrieb:
> Er probiert an der Stelle solange den SysTick einzustellen bis es
> geklappt hat. Ist doch sofort ersichtlich

Dann putz deine Brille und schaus dir noch einmal an. ;-)))

von Sukzessive A. (sukapxconv)


Lesenswert?

1
  SystemCoreClockUpdate();                      /* Get Core Clock Frequency   */
2
  while (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts  */
3
    if (1);                                  /* Capture error              */
4
  }

Stand doch so da oder ?

davon troll :D

: Bearbeitet durch User
von Augen weit offen (Gast)


Lesenswert?

Sukzessive Approximation schrieb:
> Er probiert an der Stelle solange den SysTick einzustellen bis es
> geklappt hat.

Nein, es probiert es nur ein einziges Mal. Schlägt das fehl, tritt er 
auf der Stelle. Oder was macht "while (1) ;" deiner Meinung nach?

Ich nix Troll, sondern wach. ;-)))

von Helmut L. (helmi1)


Lesenswert?

Das sind nur Beispielprogramme, die muessen nicht vollstaendig sein oder 
etwas sinnvolles tun. An der Stelle des "while(1)" kann man eine eigene 
Fehlerbehndlungsroutine setzen.

von Michael Bauer (Gast)


Lesenswert?

Ok, vielen dank für die Infos.
Hab mir jetzt ein kleines Programm gebastelt, dass einfasch nur einen 
Pin auf 1 setzen soll. Das Programm funktioniert nur wenn ich in 
uVision5 in dem Debug mode bin und dort auf Run klicke. Wenn ich nicht 
im Debugmode bin und das Programm auf den uC lade tut sich an dem Pin 
nichts...Ich weis es ist nicht leicht mit so wenig angaben eine guten 
Rat zu geben, aber vielleicht hatte jemand schonmal ein ähnliches 
Problem.
1
#include <stdio.h>
2
#include "STM32F4xx.h"
3
#include "GPIO_STM32F4xx.h"
4
5
volatile uint32_t msTicks;                      /* counts 1ms timeTicks       */
6
7
/*----------------------------------------------------------------------------
8
  SysTick_Handler
9
 *----------------------------------------------------------------------------*/
10
void SysTick_Handler(void) {
11
  msTicks++;
12
}
13
14
/*----------------------------------------------------------------------------
15
  delays number of tick Systicks (happens every 1 ms)
16
 *----------------------------------------------------------------------------*/
17
void Delay (uint32_t dlyTicks) {                                              
18
  uint32_t curTicks;
19
20
  curTicks = msTicks;
21
  while ((msTicks - curTicks) < dlyTicks);
22
}
23
24
25
/*----------------------------------------------------------------------------
26
  Main function
27
 *----------------------------------------------------------------------------*/
28
int main (void) {
29
30
  SystemCoreClockUpdate();                      /* Get Core Clock Frequency   */
31
  if (SysTick_Config(SystemCoreClock / 1000)) { /* SysTick 1 msec interrupts  */
32
    //while (1);                                  /* Capture error              */
33
  }
34
    GPIO_PortClock   (GPIOD, true);
35
    GPIO_PinWrite    (GPIOD, 12, 0);
36
    GPIO_PinConfigure(GPIOD, 12,
37
                      GPIO_MODE_OUTPUT,
38
                      GPIO_OUTPUT_PUSH_PULL,
39
                      GPIO_OUTPUT_SPEED_50MHz,
40
                      GPIO_PULL_DOWN);
41
  
42
  while(1) {
43
    GPIO_PinWrite(GPIOD, 12, 1);
44
    Delay(2000);
45
    GPIO_PinWrite(GPIOD, 12, 0);
46
    Delay(2000);
47
    GPIO_PinWrite(GPIOD, 12, 1);
48
    Delay(2000);
49
    GPIO_PinWrite(GPIOD, 12, 0);
50
    Delay(2000);
51
  }
52
}

von Lutz H. (luhe)


Lesenswert?

Ich hatte  ein Beispielprogramm, da wurde nach Initialisierung des 
Systick wurde alle 1 ms eine Funktion (siehe BSP_Background() 
)aufgerufen.


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
 // OS_TimeMS ++;

  BSP_Background();

}

von Lutz H. (luhe)


Lesenswert?

Michael Bauer schrieb:
> Die Funktion
> SysTick_Config gibt bei Erfolg eine 0 und bei einem Fehler eine 1
> zurück.

1 or 0 == true or false?

Meiner Meinung nach ist es eine Unsitte aus Lochkartenzeiten,
logische Werte beim Programmieren  mit 0 oder 1 zu bezeichnen.
Ich nutze nur noch true oder false, da kann der Compiler tun, was er 
will.



Ich denke mir das Programm soll, wenn der SysTick richtig konfiguriert 
ist,
in einer Endlosschleife laufen, die nichts macht, sonst soll das 
Programm sich beenden.


Durch einen Interrupt das SysTick wird  der   SysTick_Handler
aufgerufen. Dort kann die Funktion aufgerufen werden, die jede 1 ms 
ausgeführt werden soll.

: Bearbeitet durch User
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.