STM32 Timer Problem

OP #7614027
Lesenswert?
• ▲
▼

Hallo,

ich habe folgendes Problem: Bei Verwendung des Timers wie im Bild konfiguriert, komme ich niemals in meine "whileschleife". Die Interruptroutinen scheinen dauerhaft zu feuern. Ich aktiviere den Timer über HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1); und HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2);

Ich nutze den STM32F103ZGT6 mit 66 MHz Clock.

Setze ich den Prescaler deutlich runter (z.B. auf 6600) funktioniert alles tadelos.

Schafft der uC nicht, Interrupts in 500kHz mit diesen Einstellungen abzuarbeiten oder habe ich etwas übersehen?

Danke Euch schonmal!

Angehängte Dateien:
#7614098
Lesenswert?
• ▲
▼

Würde den Prescaler runterstellen und die Counter Period dafür hochstellen. Den Zähler laufen lassen, dafür ist er da. Ist die Interruptroutine selber geschrieben? Wird die Interrupt-Flag gelöscht? Ist die Benutzung der PWM so vorgesehen? Wenn der Zähler von 0 bis 1 läuft und die PWM bei 0 einen Interrupt auslöst? Würde das anders lösen, weiß aber nicht was damit eigentlich erreicht werden soll. Nachher ist das irgendein fieser Timerüberlauf, der Timer weiß gar nicht wann er den Interrupt auslöst weil es bei Counterperiod-1 passiert o.ä.

(Firma: egal) #7614412
Lesenswert?
• ▲
▼

Chris schrieb:

In der Interruptroutine passiert bisher noch gar nichts. Toggle nur eine Variable von 0 auf 1.

Bist du dir da sicher?

Die meisten C/C++ Toolchains generieren für eine ISR noch eine ganze Menge an Code um die Register zu sichern und am Ende wieder zurück zu sichern. Du hast da einiges an Overhead drin. Schau dir mal den erzeugten Code an und rechne mal die alleine dafür benötigten Takte aus. Zu dem ganzen kommt dann auch noch eine gewisse Latenz bis die ISR überhaupt angesprungen wird.

(Firma: Jasinski) #7614476
Lesenswert?
• ▲
▼

Chris schrieb:

Schafft der uC nicht, Interrupts in 500kHz mit diesen Einstellungen abzuarbeiten oder habe ich etwas übersehen?

Sollte tatsächlich ein Interrupt mit 500kHz angesprungen werden, auch wenn das ein STM32F103 mit einem 66MHz-Takt ist, wird das wohl auf eine Milchmädchenrechnung hinauslaufen. Warum überhaupt diese absurde Idee? Was wolltest Du überhaupt damit realisieren?

#7614478
Lesenswert?
• ▲
▼

Chris schrieb:

Schafft der uC nicht, Interrupts in 500kHz mit diesen Einstellungen abzuarbeiten oder habe ich etwas übersehen?

Das ist ein Interrupt alle 2 µs, und du hast zwei davon, die nacheinander abgearbeitet werden (ich gehe mal von gleicher Priorität aus). Der Cortex braucht schon ein paar Takte für den Sprung, und dann kommen noch die ISR dazu. Die ist bei der HAL nicht nur das, was du in den Callback einträgst, sondern da passiert noch jede Menge drumherum. Es ist nicht unüblich, dass der Sprung in den Callback bei der HAL viele hundert Nanosekunden bis wenige µs brauchen kann.

Aus dem Bauch heraus würde ich sagen, dass der Controller diese Interrupt-Frequenz nicht schafft, und selbst wenn, machst du weder in der ISR noch in deiner Main Loop arg viel.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.