Forum: Mikrocontroller und Digitale Elektronik STM32F4 SysTick Fehler ?


von timo .s (Gast)


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
}

von Deepdiver99 (Gast)


Lesenswert?

Hast mal mit dem Debugger geguckt wo er "hängen" bleibt?

von Paul (Gast)


Lesenswert?

timo .s schrieb:
> blinkt sie nicht
> mehr sobald ich SysTick_Config(SystemCoreClock / 100)

Vielleicht blinkt sie auch nur sau schnell:)

von timo .s (Gast)


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.

von Uwe B. (derexponent)


Lesenswert?

wo ist dein "SysTick_Handler()" ?

von Martin K. (dschadu)


Lesenswert?

168.000.000Hz / 100 = 16.800.000Hz.
1/16.800.000Hz macht ~59,5 piko Sekunden.

Viel spaß.

von timo .s (Gast)


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.

von Uwe B. (derexponent)


Lesenswert?

timo .s schrieb:
> Ner SystickHanlder ist beabsichtigt nicht dabei

na dann ist ja auch der Fehler beabsichtigt :-)

: Bearbeitet durch User
von timo .s (Gast)


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?

von Uwe B. (derexponent)


Lesenswert?

BITTE,

füge diese 3 Zeilen in dein Programm
1
void SysTick_Handler(void)
2
{
3
}

von timo .s (Gast)


Lesenswert?

Okay jetzt geht, es. Kannst du mir aber erzählen warum dieser Handler 
nicht im Tutorial und ebenfalls NICHT in den examples von st drinne ist 
?

von Uwe B. (derexponent)


Lesenswert?

frag bei myAVR nach in welchem File der Handler liegt...
aber sicher ist : "er ist irgendwo"

wer einen Interrupt enabled, muss auch eine ISR dafür bereitstellen,
sonst springt die CPU in den Default-Handler und in eine while(1)

Uwe

von timo .s (Gast)


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?

von timo .s (Gast)


Angehängte Dateien:

Lesenswert?

Weiß keiner wie ich dieses Beispiel der spl zum laufen bekomme ?

von Tick Tack (Gast)


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--;
  }
}

von timo .s (Gast)


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 ?

von timo .s (Gast)


Lesenswert?

EDIT: hat sich erledigt habe es hin bekommen mit dem Handler, danke an 
alle.

von Tick Tack (Gast)


Lesenswert?

timo .s schrieb:
> habe es hin bekommen mit dem Handler

und auch verstanden?

von timo .s (Gast)


Lesenswert?

Ja habe ich, denn die Funktion DecrementTimer wurde ja nicht aufgerufen, 
der SysTick Handler wird jede Millisekunden aufgerufen und zählht die 
Variable immer um eins runter.

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.