Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Problem


von Chris (c_1)


Angehängte Dateien:

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!

von Wastl (hartundweichware)


Lesenswert?

Chris schrieb:
> Schafft der uC nicht, Interrupts in 500kHz

"Gefühlt" schon etwas anspruchsvoll, wenn man bedenkt dass
der Controller zwischen zwei Interrupts dann nur 132(?)
Zyklen zum arbeiten hat. Kommen noch ein paar Wait States
fürs Flash hinzu, könnte eng werden .... wie gesagt "gefühlt".

von Christoph S. (mr9000)


Lesenswert?

Worauf steht die Counter Period? Auf "2-1" = 1? Wie groß ist der 
Pre-Scaler? Was passiert in den Interruptroutinen?

von Chris (c_1)


Lesenswert?

Ja, die Counter Period ist 1

Prescaler ist 65 ( also 1 MHz)

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

von Christoph S. (mr9000)


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.ä.

von Irgend W. (Firma: egal) (irgendwer)


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.

von Harry L. (mysth)


Lesenswert?

Chris schrieb:
> Ich aktiviere den Timer über
> HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
> und
> HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_2);

So werden 2 Interrupts ausgelöst.
Einmal beim Match von CCR1 und nochmal beim Match von CCR2.

von Gregor J. (Firma: Jasinski) (gregor_jasinski)


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?

von Kevin M. (arduinolover)


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.

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.