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
>Facktor 8 zu langsam bin.
Das muss "Fucktor" heissen.
Damit wirds aber auch nicht besser!
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.
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
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
>Vielleicht hat ja von Euch eine Idee / Beispiel?
Zu was? Liefer erst mal eine ausführliche Beschreibung was du
überhaupt machen willst .
Holger wer lesen kann ist klar im Vorteil! Nur dem Peter kann ich leider nicht helfen. VG, Uli
>Holger wer lesen kann ist klar im Vorteil!
Dann bin ich wohl zu blöd das eigentliche Problem zu verstehen.
holger schrieb: > Dann bin ich wohl zu blöd das eigentliche Problem zu verstehen. Dann bin ich wenigstens in guter Gesellschaft.
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.
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.
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!
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.
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
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.
CSSON aktivieren scheint da richtig zu sein, gibt es da ein Beispiel was ich für mein Projekt übermehmen könnte? VG, Peter
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
Warum schreibst Du nicht gleich als Topic I²S, das hätte vielen das Rätsel raten erspart.
@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.
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
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
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
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
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.
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
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 :)
>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.
Der pcm1704 oder so was in de Art ist zur Zeit verbaut.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.