Forum: Mikrocontroller und Digitale Elektronik STM32: Peripherie clock spezifischen Wert einstellen


von Solocan Z. (solocan)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte ein Audio Codec(PCM3060) betreiben. Datenblatt schreibt vor, 
dass der Master (System) clock MCK=128*fs (oder 256, 384, 512, 768) 
betragen muss. Der Bit clock BCK hingegen muss BCK=64*fs betragen, wobei 
fs Sampling frequency ist, also in dem Fall sagen wir mal 96kHz. (Zudem 
gibt's noch ein Left-right CLK aber den stelle ich mal mit einer GPIO 
zur Verfügung)

Daraus berechnet sich:


fs=96kHz
MCK=24,576MHz
BCK=6,144MHz
LRCK=192kHz

die STM32(Master) dem Codec(Slave) zur Verfügung stellen muss.

Der Kern ist getaktet auf 216MHz. D.h. ich kann obengenannte Peripherie 
Clocks nicht durch Divider erreichen. Da bin ich doch etwas verwirrt. 
Ich kann theoretisch MCK und BCK an die nächstmöglichen Werte einstellen 
aber dann kann ich nicht mein fs=96kHz (oder von mir aus 48 etc. ) nicht 
exakt einhalten.

Wie gehe ich jetzt am Besten vor? Wie stelle ich solche blöden 
Frequenzen zur Verfügung?

(Anbei paar Bilder)

Vielen Dank und Grüße

: Bearbeitet durch User
von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Du machst da ganix per GPIO.
Das macht dir alles der SPI im I2S Modus oder der SAI.
Guck dazu in das passende Referencemanual zu deinem spezifischen STM32.

Für den MCK gibts meistens sogar noch ne extra Audio PLL und einen Takt 
Eingang für ein "Audiofrequenzquarz"

von TrollJäger (Gast)


Lesenswert?

Dein Stichpunkt: Clock-tree

von Solocan Z. (solocan)


Lesenswert?

Ich kämpf gerade mit dem 2000Seiten HAL manual. Ich bin noch nicht 
fündig geworden wie ich diese "Audiofrequenzquarz" rummultiplizieren 
kann...

Es gibt im Abschnitt SAI schon die Audio-Frequenzen-Clock. Wie stelle 
ich die Potenzen davon zur Verfügung? Eben das finde ich noch nicht.

TrollJäger schrieb:
> Dein Stichpunkt: Clock-tree

Was meinst du denn mit Clock-tree genau? In CubeMX ist ja ein 
Clock-Tree, der aber nichts von Audio-Frequenzen wissen will.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nimm nicht den gammligen HAL, sondern guck doch erstmal in die 
Beschreibungen im RefMan.

Die Hardware wird dir da erst ausführlichst erklärt und dann werden die 
Register und Bits erklärt.
Erst wenn du DAS verstanden hast verstehste auch den HAL.

RefMan Kapitel für dich:
-RCC
-SAI

von Christopher J. (christopher_j23)


Lesenswert?

Mw E. schrieb:
> Nimm nicht den gammligen HAL, sondern guck doch erstmal in die
> Beschreibungen im RefMan.

Der Meinung bin ich allerdings auch. Seit CubeMX scheint es nichts 
anderes mehr zu geben... CubeMX an, Augen zu, Hirn aus... traurig...

Es gibt einen I2S_CKIN-Pin über den du I2S/SAI mit einem externen Takt 
versorgen kannst. Ein typischer Wert für so einen Quarz wäre z.B. 12,288 
MHz.

Alternativ gibt es aber für I2S/SAI separate PLLs. So als Tipp:
16/10*270/2 = 216
16/10*270/9 = 48
16/10*192/5/5 = 12,288

: Bearbeitet durch User
von Oli P. (atomicjunkie)


Lesenswert?

Hast du in CubeMX auch eines der I2S-Interfaces aktiviert?

von Solocan Z. (solocan)


Angehängte Dateien:

Lesenswert?

Vielen Dank für zahlreiche Inputs.

Nun bin ich -zumindest in der Theorie und Verständnis- weitergekommen.

Die Clocks, die ich generieren will, scheinen doch mit den internen 
Uhren und PLLs machbar zu sein. Meine Lösung hänge ich an. Mit dem 
letzten Teiler kann man sogar problemlos zwischen 49152kHz, 24576kHz und 
12288 kHz etc. wählen.

Ein sehr hilfreiches und ausführlich geschriebenes Dokument dafür ist:

https://www.st.com/content/ccc/resource/training/technical/product_training/group0/35/bb/c4/23/6a/74/4a/2b/STM32F7_Peripheral_SAI/files/STM32F7_Peripheral_SAI.pdf/_jcr_content/translations/en.STM32F7_Peripheral_SAI.pdf

Alternativ könnte ich auch einen externen Quarzoszillator mit 
Audiofrequenz nehmen. Scheint auch problemlos zu funktionieren mit 
STM32. Ich glaube, ich werde so einen als alternative Clock in meine 
Platte reindesignen.

Viele Grüße und vielen Dank noch mal

P.S: Zum Thema HAL und CubeMX: Klar, ich schätze auch richtig Low-Level 
auf der Registerebene zu arbeiten. Bei genügendem Wissen ist das der 
beste Weg. Allerdings bin ich noch kein Held in STM32 und so eine 
Konfigurationssoftware und eine Bibliothekensammlung mehr als hilfreich! 
Ich schalte natürlich nicht den Hirn aus, versuche sondern, durch die 
generierten Beispiele mich tiefer einzuarbeiten. Für einen schnelleren 
Einstieg finde ich diese sehr sehr hilfreich - viel besser als 
unendliche RefMans durchzuarbeiten ohne jegliche Beispiele. Das ist auch 
wichtig, um das Rad nicht zwei mal zu erfinden.

Ich merke, ich habe selber wenig Verständnis für die High-Level tools 
bei den Sachen, die ich sehr gut beherrsche. Aber wir müssen ins 
Kenntnis nehmen, dass diese doch sehr nützlich sein können und aufhören 
diese pauschal zu diffamieren.

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.