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!
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".
Worauf steht die Counter Period? Auf "2-1" = 1? Wie groß ist der Pre-Scaler? Was passiert in den Interruptroutinen?
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.
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.ä.
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.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.