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
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.
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.
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:
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
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?
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--;
}
}
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 ?
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.