Forum: Mikrocontroller und Digitale Elektronik SysTick_Handler richtig konfigurieren?!


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von STM32er (Gast)


Bewertung
0 lesenswert
nicht 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???

von ui (Gast)


Bewertung
0 lesenswert
nicht 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?

von STM32er (Gast)


Bewertung
0 lesenswert
nicht 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
}

von ui (Gast)


Bewertung
0 lesenswert
nicht lesenswert
und woher willst du jetzt wissen, dass die Zeiten nicht passen?

von Stm32er (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von ui (Gast)


Bewertung
0 lesenswert
nicht 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.

von W.S. (Gast)


Bewertung
0 lesenswert
nicht 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.

von WSKäse (Gast)


Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> aber keiner
> deiner Leser kennt den Inhalt dieser ominösen Funktion.

Rede keine Käse, das ist der übliche Aufruf den die standard
STM-Libraries mitbringen. Wenn du das nicht kennst gilt das
noch lange nicht für andere.

von holger (Gast)


Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.