STM32F411 Wie den externen Timereingang INTERN schneller machen?

Gast #4979792
Lesenswert?

Hallo,

ich habe ein Projekt mit einem STM32F411 gemacht und stehe nun vor einem 
Problem.

Ich habe an dem Externen Timer (TIM2 ETR Pin) Eingang einen Takt von ca. 
3MHz anliegen, aus dem generiere ich 3 Signale. Jetzt ist mir aber 
aufgefallen (leider recht spät) das ich übersehen habe das ich um den 
Facktor 8 zu langsam bin.
Jetzt meine Frage an die Spezialisten, da ich es nicht sehe oder einfach 
übersehe:
Kann man den eingangs Takt noch hoch drehen über eine interne PLL?


Alternativ hatte ich mir schon überlegt den Takt einfach als Systemtakt 
einzuspeisen anstatt meinem Quarz. Aber der Externe Takt liegt nicht 
immer an! Und somit würde ich teilweise mit Takt = 0Hz arbeiten, wie ich 
das erkännen könnte und dann auf die interne PLL umschalten könnte 
wüsste  ich auch nicht.

Viele Grüsse, Peter
Gast #4980164
Lesenswert?

Peter schrieb:

> ich habe ein Projekt mit einem STM32F411 gemacht und stehe nun vor einem
> Problem.

Alle anderen stehen, wenn sie etwas tatsächlich "gemacht" haben, 
irgendwie an dem Punkt, dass sie fertig sind mit dem Projekt, also genau 
kein Problem mehr verblieben ist...

Sprich: du hast dein Projekt nicht gemacht, sondern schlicht in den 
Sand gesetzt. -> Redo from start, diesmal mit einem besseren Konzept.
#4980181
Lesenswert?

Hi

Wenn der µC die ganz Zeit im Timer-Interrupt Zeug berechnet, hat Er eh 
keine Zeit, auf den externen Interrupt zu reagieren.

Was spricht dagegen, den 'neuen' Wert in der Haupt-Schleife zu berechnen 
und durch den Timer-Interrupt 'freizuschalten'?

So hat der (nahezu dauernd) laufende Timer-Interrupt fast Nichts zu tun 
(ok, ein Flag setzen) - und hast massig Zeit um auf den externen Befehl 
zu reagieren.

MfG
Gast #4980511
Lesenswert?

Der Prozessor hat damit rein gar nichts zu tun.
Einmal eingestellt läuft das im Hintergrund.

Ich trigger mit den Timer Ausgängen 2 SPI Schnittstellen und da habe ich 
so ca. alle 40ms mal was zu tun (DMA). Das ganze ist eine Signal 
Ausgabe.

Nun leider habe ich übersehen das das Ausgangssignal 8 mal schneller ist 
wie das Eingangssignal.
Ja das nennt mal Designfehler, aber vielleicht kann man das noch retten.


Nach nochmaligen ansehen der ganzen Doku kann ich nun Ausschließen das 
man dem Timer Eingang hoch drehen kann, leider.

Bleibt nur noch der Umweg über den Systemtakt.
Aber wie ich dem Prozessor beibringen kann das der bei Taktausfall auf 
was internes umschalten soll finde ich nicht.
Vielleicht hat ja von Euch eine Idee / Beispiel?

Viele Grüsse, Peter
Gast #4980603
Lesenswert?

Peter schrieb:
> Aber wie ich dem Prozessor beibringen kann das der bei Taktausfall auf
> was internes umschalten soll finde ich nicht.


Meine Glaskugel sagt:

RCC->CR |= (1 << CSSON);          // CSSON aktivieren
und per ISR darauf reagieren, wenn CSSC im Register RCC_CIR gesetzt 
wird.
#4980678
Lesenswert?

Bitte versetz dich einmal in die Lage der Leute, die dir versuchen hier 
zu helfen.

Was wir nicht wissen:
-) Welchen Takt du als Systemtakt nutzt.
-) Was du überhaupt vor hast.
-) Was in welcher Form wofür zu langsam sein soll.

Was du in 2 ganzen Absätzen geschafft hast zu erklären ist:
-) Du hast ein Problem.
-) An TIM2 ETR liegt irgendwas mit 3MHz an.
-) Damit erzeugst du irgendwas.
#4981070
Lesenswert?

Peter schrieb:
> Ich habe an dem Externen Timer (TIM2 ETR Pin) Eingang einen Takt von ca.
> 3MHz anliegen

Ein MC arbeitet synchron, d.h. er muß alle externen Signale mit dem 
CPU-Takt latchen.
Bei 100MHz CPU-Takt kann er somit bis zu 50MHz Signale abtasten, 3MHz 
sollten daher kein Problem sein.
Du mußt also irgendwas falsch konfiguriert haben.
Gast #4981199
Lesenswert?

So nochmal für Alle die es nicht verstanden haben:

Ich habe einen Takt von ca. 3MHz den wollte ich eigentlich als Timer 
Takt nehmen um damit einige Signale zu erzeugen. Diese Signale müssen 
aus dem Takt abgeleitet werden, sonst passt meine Weiterverarbeitung 
nicht.

Der Prozessor läuft mit einem 8MHz Quarz, über die interne PLL dann mit 
100MHz.

Das geht ja auch, aber mir ist der Fehler unterlaufen das ich übersehen 
habe das der 3MHz Takt am Timer nicht reicht (Faktor 8 zu klein).
Da ich den Timer Takteingang nicht hoch drehen kann, brauche ich eine 
Andere Lösung.

Also 2. Versuch, den Takt anstatt dem Quarz einzuspeisen und intern die 
PLL auf vernünftige Werte so im Bereich 90-100MHz einzustellen. 
Haupsache der Prozessor hat noch genug Rechenpower und der Timer kann 
daraus seine Signale ableiten.

Da gibt es aber eine kleine unangeneme Sache, der Takt liegt nicht immer 
an.
In diesem Fall müsste ich auf die internen 16MHz umschalten können und 
bei wieder anliegenden Takt auf den schalten.

Jetzt meine Frage wie kan man das machen?
Viele Grüsse, Peter
#4981203
Lesenswert?

Peter schrieb:
> Nun leider habe ich übersehen das das Ausgangssignal 8 mal schneller ist
> wie das Eingangssignal.

Also, du hast 3MHz als Eingangssignal (sporadisch anliegend) und 
möchtest konstant 24MHz Signale generieren?
Was ist das Ausgangssignal? Konstant 24MHz Rechteck oder PWM?
Wieso nutzt du das Eingangssignal nicht als "Reset" für einen internen, 
unabhängigen Timer, mit dem du die 24MHz generierst? Kommt eine Flanke, 
wird der Timer wieder synchronisiert. Fehlt diese, läuft das Signal halt 
asynchron weiter, bis wieder eine Synchronisation statt findet. Oder du 
kannst mit einem Timeout den Timer und deine Ausgabe deaktivieren.
Eine unabhängige PLL-Schaltung wirst du nicht finden. Dazu ist der uC 
auch nicht gemacht. Ansonsten auf ein FPGA/CPLD wechseln...

Falls die ISR zu langsam sind, kannst du ja noch auf ASM wechseln... 
aber bei lächerlichen 3MHz sollte das kein Problem sein.
Gast #4981226
Lesenswert?

Mein Takt wechselt zwischen 44100 * 64, 48000*64, 32000*64 und 0.
Da ist nichts mit selber machen, da ich Takt treu bleiben muss.

Die internen Überwachungs Systeme sind da schon die beste Lösung.
Wäre auch nur ein Draht.
Aber ich finde kein Beispiel für so was.

VG, Peter
Gast #4981829
Lesenswert?

Nein Stereo mit max 48KHz.

Ich bastel mir mit dem Timer meine Signale (Bit Clock & SPI Clock / SPI 
Enable / DAC Enable) für 2 SPI Schnittstellen mit denen ich dann die 
Daten zu den 2 MONO DACs sende.

Eine einfache und effektive Art so was zu machen.
Braucht kaum Prozessor last da das senden komplett DMA und Timer 
gesteuert abläuft. Nur gelegentlich (ca. 40ms) muss ich die Daten vom 
Eingang zum Ausgang kopieren und ein wenig was vorher damit machen.
Der Eingang läuft auch komplett über den DMA.

Was ich mit den Signalen machen werde ist noch offen!

Jetzt ist erst einmal wichtig das ich die Taktquellen vernünftig 
bearbeiten kann.
Da habe ich auch nach einigen Stunden nichts gefunden.

VG, Peter
(Firma: matzetronics) #4981989
Lesenswert?

Uli schrieb:
> Uli (Gast)

Ist das der TE? Sonst hiess er doch Peter.
Mit ist nicht ganz klar, wofür du die 3MHz aka 24MHz benötigst, ausser 
um die Ausgangs Samplerate zu konfigurieren. Im I2S Slave Modus ist eine 
externe Masterclock nicht nötig - es reichen die 3 Signale des I2S 
Protokolls, WS, BCLK und Data. (Abschnitt 20.4.6 in der STM32F11 
Reference).

Du musst, wenn du die gleiche Samplerate am Ausgang benötigst, lediglich 
deine 3Mhz oder was auch immer messen und danach, wenn du einen 
Masterclock am Ausgang benötigst, I2SDIV für den Masteroutput 
konfigurieren.
Also einen SPI als Slave I2S konfigurieren und den anderen als Master, 
wenn deine DACs I2S verstehen.
Gast #4982504
Lesenswert?

Anderer Rechner falscher Name! Ist mir auch 5 Sekunden später 
aufgefallen.

3 * I²S geht nicht da der Ausgang 8 mal schneller arbeitet.

Meine Lösung ist schon das beste was man mit einem STM32F411 machen 
kann.

Bleibt halt nur das Problem mit dem umschalten zwischen internen und 
externen Takt, bei Taktausfall und wieder anliegen.

VG, Peter
Gast #4982665
Lesenswert?

Peter schrieb:
> Bleibt halt nur das Problem mit dem umschalten zwischen internen und
> externen Takt, bei Taktausfall und wieder anliegen.

Auf den internen HSI-Takt wird automatisch umbeschaltet, wenn HSE 
ausfällt. Die Behandlung des Interrupts erfolgt im NMI_Handler.
Ob HSE wieder anliegt, kann man testen und anschließend wieder HSE als 
Taktquelle benutzen.
Wie das geht, wird in der Datei system_stm32f4xx.c gezeigt.

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