SysTick_Handler richtig konfigurieren?!

Gast #4883835
Lesenswert?

Nabend liebe Leutz,

Ich bin gerade am verzweifeln. Entweder rechne ich gerade mega Mist oder 
die Tolereanz vom µC ist mega groß.

Möchte den SysTick Handler jede Millisekunde auslösen lassen.
Habe einen STM32 mit 48MHz.

48.000.000 / 1000 = 48.000
1
SysTick_Config(48000);
2

3
if(Application.Ms >= 500)
4
{
5
   Application.Ms = 0;
6
   Encoder_Out(1,0);
7
}
8
else
9
Encoder_Out(0,0);
10

11
Application.Ms++;

Mache ich was falsch???
Gast #4883846
Lesenswert?

STM32er schrieb:
> Mache ich was falsch???

Wahrscheinlich, sonst würds ja gehen.

STM32er schrieb:
> if(Application.Ms >= 500)
> {
>    Application.Ms = 0;
>    Encoder_Out(1,0);
> }
> else
> Encoder_Out(0,0);

Es würde schonmal helfen den GANZEN Code zu posten. Ansonsten fehlt 
mindestens ne while(1) Schleife.

STM32er schrieb:
> Application.Ms++;

und was soll der Scheiß? Ich schätze du willst millisekunden damit 
zählen? Und wo steht der Code?

STM32er schrieb:
> Möchte den SysTick Handler jede Millisekunde auslösen lassen.
> Habe einen STM32 mit 48MHz.

Auch den Clockpfad richtig konfiguriert?
Gast #4883847
Lesenswert?

1
int main(void)
2
{
3
    SystemInit();
4
    SystemCoreClockUpdate();
5

6
    /*
7
    *   SysClk_Periode = 48.000.000 / 10000 = 4800
8
    *   4800 = 1[ms]
9
    */
10
    SysTick_Config(SystemCoreClock / 1000);
11

12
  while(1)
13
  {
14
    IWDG_ReloadCounter();
15
  }
16
}
1
void SysTick_Handler(void)
2
{
3
    Application.Ms++;
4
}
Gast #4883861
Lesenswert?

Stm32er schrieb:
> Habe es am blinken einer LED gesehen. Ca. 500ms sollte man schon
> ungefähr einschätzen können, das sah aber mehr so aus wie 1 Sekunde bis
> 1,5 Sekunden.

"Sau aus wie"... Hört sich ja genau an...
Welches Board nutzt du? Nutzt du nen Jlink -> dann kannst mit dem 
SystemViewer schauen wie die Zeiten so sind. Ansonsten mit irgend nem 
billigen LogicAnalyzer. Oder die Zeitdifferenz nach oben schrauben (so 
ca. 60sekunden) und mitstoppen.
Gast #4883906
Lesenswert?

STM32er schrieb:
> Ich bin gerade am verzweifeln.

Ja, das glaube ich dir.

Also mal ganz ernst: Was willst du eigentlich mit dem SysTick, wenn du 
dort lediglich sowas drin hast:

void SysTick_Handler(void)
{
    Application.Ms++;
}

Normalerweise macht man mit dem SysTick eine controllerinterne Uhr auf, 
die irgendwelche sinnvollen Dinge erledigt. Ja, ggf. gehört ein 
Multitasking auch dazu, sofern man mit RTOS arbeitet.

Aber sowas? Was verbirgt sich denn hinter "Application.Ms++" ? Ist das 
das Lesen und Setzen einer Eigenschaft? Womöglich über entsprechende 
Methoden, sprich Getter&Setter, die einen unbekannten Inhalt nebst 
unbekannter Latenz haben?

Wer soll dir bittesehr bei sowas einen Rat geben? Ein Gleiches gilt für
SysTick_Config(48000);
was eigentlich für einen 48 MHz Chip völlig OK aussieht - aber keiner 
deiner Leser kennt den Inhalt dieser ominösen Funktion.

Also, bei mir läuft die interne Systemuhr per SysTick auf allen Systemen 
völlig richtig, ohne Fehlgang, ohne Aussetzer und das über Monate 
hinweg. Also liegt der Fehler garantiert nicht an deinen Chips...

W.S.
Gast #4883918
Lesenswert?

>das sah aber mehr so aus wie 1 Sekunde bis
>1,5 Sekunden.

Dann liegt die Vermutung nahe dass deine CPU nicht mit 48MHz läuft.
Und dann liegt es vermutlich da dran:

>Auch den Clockpfad richtig konfiguriert?

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