STM32F4 SysTick Fehler ?

Gast #3535404
Lesenswert?

Ich versuche gerade die Systick beim STM32F4 (Discovery) zum laufen zu 
bringen.

Jedoch hängt sich dabei das Programm auf, jedenfalls vermute ich das, 
denn wenn ich in der main while eine LED tooglen lasse, blinkt sie nicht 
mehr sobald ich SysTick_Config(SystemCoreClock / 100); hinzufüge.
Die SystemClock ist schon auf 168MHZ gestellt.

Hier mal mein Code
1
#include "stm32f4xx_conf.h"
2

3
void Delay(__IO uint32_t nCount);
4
void initGPIO(void);
5
void WaitForHSE(void);
6
void start_signal(void);
7

8
int main(void)
9
{
10
    SystemInit();
11
    WaitForHSE();
12
    SysTick_Config(SystemCoreClock / 100);
13
    initGPIO();
14
    start_signal();
15

16
    while(1)
17
    {
18
        //nicht relevant, entfernt...
19
    }
20
}
21

22
void initGPIO(void)
23
{
24
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
25
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
26

27
   GPIO_InitTypeDef GPIO_InitStructure;
28
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
29
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
30
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
31
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
32
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
33
   GPIO_Init(GPIOD, &GPIO_InitStructure);
34

35
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
36
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
37
   GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
38
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
39
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
40
   GPIO_Init(GPIOA, &GPIO_InitStructure);
41
}
42

43
void Delay(__IO uint32_t nCount)
44
{
45
    while(nCount--) {}
46
}
47

48
void WaitForHSE(void)
49
{
50
    RCC_HSEConfig(RCC_HSE_ON);
51
    while(!RCC_WaitForHSEStartUp()) {}
52
}
53

54
void start_signal(void)
55
{
56
    GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
57
    Delay(0x3FFFFF);
58
    GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
59
}
60

61
void SysTickFunction(void)
62
{
63
  static u8 sysTickCounter=0;
64
  sysTickCounter++;
65
  if (sysTickCounter==25)
66
    GPIO_ToggleBits(GPIOD,GPIO_Pin_0);
67
  if (sysTickCounter==50)
68
    GPIO_ToggleBits(GPIOD,GPIO_Pin_1);
69
  if (sysTickCounter==100)
70
    GPIO_ToggleBits(GPIOD,GPIO_Pin_3);
71

72
}
Gast #3535435
Lesenswert?

Ne eben net. 168MHZ druch 100 macht doch 10ms ?
Ich bin jetzt mal mit dem Debuger durchgelaufen:
1
void start_signal(void)
2
{
3
    GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
4
->   Delay(0x3FFFFF);
5
    GPIO_ResetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
6
}
Hier werde ich "rausgehauen" bzw der Debuger kommt nicht weiter.

Die Delay Funktion sieht so aus:
1
void Delay(__IO uint32_t nCount)
2
{
3
    while(nCount--) {}
4
}

Ich bin der Meinung, dass es an der Systick funktioniert, denn nur wenn 
ich diese Initalisiere mit: SysTick_Config(SystemCoreClock / 100);
funktioniert der Code nicht.
Gast #3535453
Lesenswert?

Naja ich habe aber in der Systick Funktion nochmal ein Counter, also ist 
das nicht schlimm.

Ner SystickHanlder ist beabsichtigt nicht dabei, ich versuche gerade 
dieses Tutorial durch zu arbeiten.
Selbst wenn ich in der spl die main.c für den Systick welches für ein 
Delay gebraucht wird, benutzte bleibt die LED nur am leuchten.
Gast #3535461
Lesenswert?

Okax hier in diesem Tutorial wird der Handler auch nicht benutzt ?
http://mystm32.de/doku.php?id=systemtickc

Und wenn ich jetzt mal das example der spl mir anschaue geht das auch 
nicht:
1
#include "stm32f4xx_conf.h"
2

3
GPIO_InitTypeDef GPIO_InitStructure;
4
static __IO uint32_t TimingDelay;
5

6
void Delay(__IO uint32_t nTime);
7
void TimingDelay_Decrement(void);
8

9
int main(void)
10
{
11

12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
13

14
   GPIO_InitTypeDef GPIO_InitStructure;
15
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3;
16
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
17
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
18
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
19
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
20
   GPIO_Init(GPIOD, &GPIO_InitStructure);
21

22
  if (SysTick_Config(SystemCoreClock / 1000))
23
  {
24
    while (1);
25
  }
26

27
  while (1)
28
  {
29
    GPIO_ToggleBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);
30

31
    Delay(200);
32
  }
33
}
34

35
void Delay(__IO uint32_t nTime)
36
{
37
  TimingDelay = nTime;
38

39
  while(TimingDelay != 0);
40
}
41

42

43
void TimingDelay_Decrement(void)
44
{
45
  if (TimingDelay != 0x00)
46
  {
47
    TimingDelay--;
48
  }
49
}
50

51
#ifdef  USE_FULL_ASSERT
52
void assert_failed(uint8_t* file, uint32_t line)
53
{
54
  while (1)
55
  {
56
  }
57
}
58
#endif

Der Debuger kommt wieder nicht weiter, wenn die Zeile mit dem 
Delay(200); erreicht wird?
Gast #3535507
Lesenswert?

Okay nur noch eine kleine Frage und zwar in den Examples der spl wird in 
einem beschrieben wie man ahnand der Systick nen Delay auf milli 
sekunden Basis realisieren kann. Jedoch bleibt da der Code, wenn Delay 
aufgerufen wird wieder hängen.
Hier mal ein kurzer Ausschnitt:
1
void SysTick_Handler(void)
2
{
3

4
}
5

6
void Delay(__IO uint32_t nCount)
7
{
8
  TimingDelay = nCount;
9

10
  while(TimingDelay != 0);
11
}
12

13

14
void TimingDelay_Decrement(void)
15
{
16
  if (TimingDelay != 0x00)
17
  {
18
    TimingDelay--;
19
  }
20
}

Hab da auch mal den Systick Handler hinzugefügt, aber sobald ich z.B. 
Delay(500); //500ms aufrufe belibt der Code wieder hängen, 
wahrscheinlich in irgendeiner Schleife die die ganze zeit aufgerufen 
wird?
Gast #3535630
Lesenswert?

void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

Wer ruft die Funktion auf? Wie ist die Verbindung vom SytemTick 
Interrupt zu deiner Dekrement Delay Funktion?
Trag sie als SytemTickHandler ein, oder benne sie einfach um.

void SysTick_Handler(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}
Gast #3535651
Lesenswert?

Problem, im Systick Handler kann die Zeit aber nicht verkleinert werden, 
denn in
void Delay(__IO uint32_t nCount)
{
   TimingDelay = nCount;
   while(TimingDelay != 0);
}

ist eine schleife die so lange läuft bis TimingDelay 0 ist, dass wird 
aber nie passieren, denn TimingDelay wird ja außerhalb dieser Schleife 
verändert, aber solange man in der Schleife ist passiert da nichts.
Habe das jetzt mal in den Handler rein getahn:
void SysTick_Handler(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

jedoch wird dieser ja nie erreicht, da die Schleife immer noch 
läuft/unterbricht, jedenfalls sieht man dass, wenn man das ganze im 
Debuger ausführt, er ist die ganze zeit in der Schleife und kommt nicht 
raus, oder mache ich was falsch ?

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