Forum: Mikrocontroller und Digitale Elektronik STM32F411 Wie den externen Timereingang INTERN schneller machen?


von Peter (Gast)


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

von Schang (Gast)


Lesenswert?

>Facktor 8 zu langsam bin.

Das muss "Fucktor" heissen.

von Peter (Gast)


Lesenswert?

Damit wirds aber auch nicht besser!

von c-hater (Gast)


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.

von Patrick J. (ho-bit-hun-ter)


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

von Peter (Gast)


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

von holger (Gast)


Lesenswert?

>Vielleicht hat ja von Euch eine Idee / Beispiel?

Zu was? Liefer erst mal eine ausführliche Beschreibung was du
überhaupt machen willst .

von Uli (Gast)


Lesenswert?

Holger wer lesen kann ist klar im Vorteil!

Nur dem Peter kann ich leider nicht helfen.

VG, Uli

von holger (Gast)


Lesenswert?

>Holger wer lesen kann ist klar im Vorteil!

Dann bin ich wohl zu blöd das eigentliche Problem zu verstehen.

von guest (Gast)


Lesenswert?

holger schrieb:
> Dann bin ich wohl zu blöd das eigentliche Problem zu verstehen.

Dann bin ich wenigstens in guter Gesellschaft.

von m.n. (Gast)


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.

von Vincent H. (vinci)


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.

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

Auch wenns das Problem vmtl. nicht löst:

Einen Überblick über die Clock-Optionen bietet STM32CubeMX
(http://www.st.com/en/development-tools/stm32cubemx.html)

Viel Spaß beim (Über-)takten!

von Peter D. (peda)


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.

von Peter (Gast)


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

von Patrick B. (p51d)


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.

von Peter (Gast)


Lesenswert?

CSSON aktivieren scheint da richtig zu sein, gibt es da ein Beispiel was 
ich für mein Projekt übermehmen könnte?

VG, Peter

von Peter (Gast)


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

von Peter D. (peda)


Lesenswert?

Warum schreibst Du nicht gleich als Topic I²S, das hätte vielen das 
Rätsel raten erspart.

von Sebastian S. (amateur)


Lesenswert?

@Peter Dannegger
>Warum schreibst Du nicht gleich...

Spielverderber!

Jetzt können die Beteiligten nicht mehr wild drauf los spekulieren, 
palavern und und auch nicht rumrätseln;) Mancher hat jetzt sogar eine 
Ahnung davon, worum es überhaupt geht.

von Peter (Gast)


Lesenswert?

I²S rein und 2 * Mono mit 8-fach Oversampling raus.
Ist aber für die Aufgabe mit den Timern unwichtig.

@Peter Dannegger
Das spielt beim Takt keine Rolle, die Probleme bleiben.


VG, Peter

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Peter schrieb:
> I²S rein

Welche Sample-Frequenz hast du da? Wieviel Bit?

*edit*: Ah, 3MHz Input hattest du geschrieben ... Dann werden es wohl so 
hmm rechenrechenschwitzschwitch 96kHz Sample-Rate sein^^

Was machst du nochmal mit den Timern?

: Bearbeitet durch User
von Uli (Gast)


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

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Uli schrieb:
> 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.

Wieso verwendest du nicht 2 weitere I2S? Die können laut STM bis 50MBit 
...

Sogar der kleinste F411 hat 5 mal I2S ...

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Peter (Gast)


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

von Mampf F. (mampf) Benutzerseite


Lesenswert?

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

Na dann ist ja das Problem gelöst, gratuliere :)

von Markus (Gast)


Lesenswert?

>2 SPI Schnittstellen mit denen ich dann die
>Daten zu den 2 MONO DACs sende.

Aha, welche hast Du? Ich verzweifle gerade mit dem hier

Beitrag "Re: I2S Verstärker"

und einem STM32F103.

von Peter (Gast)


Lesenswert?

Der pcm1704 oder so was in de Art ist zur Zeit verbaut.

von m.n. (Gast)


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.

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.