STM32F429 Anfängerfragen

Gast #3406588
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
Gast #3406918
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
}
#3410325
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();

}
#3410626
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.

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