Hallo,
ich versuche die interne Clock eines STM32F407VG
(STM32F4-Discoveryboard) auf einen I/O-Pin rauszuführen. Ich bin auf
einen Hinweis gestoßen, dass das evtl. mit den Alternatefunctions
möglich sein könnte. Ich habe hier einen Eintrag im Datenblatt auf Seite
53 gefunden zum Port PD3 - AF: FSMC_CLK. Ist das das richtige? Oder ist
das gar nicht möglich?
Danke schonmal für eure Antworten
Euer uCNewbie
PS: Hier noch das Datenblatt, falls ihr euch die Stelle anschauen wollt:
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/DM00037051.pdf
Du kannst beim STM32F4 die Timer so konfigurieren, dass sie bei Unter-
Überlauf automatisch ein GPIO Pin setzen oder toggeln.
Ob der Clock direkt (ungeteilt) geht, weiss ich nicht. Vermutlich ist es
zumindest der halbe Clock (84 MHz).
Ist gut bei superschnellen Sachen. Ich persönlich mach das lieber per
Software. Timer Interrupt oder SysClock Funktion, ein Zähler und ein IF
und halt das GPIO Pin direkt setzen.
Gleich mal vielen Dank für die schnelle Antwort
Thomas Winkler schrieb:> Ich persönlich mach das lieber per>> Software. Timer Interrupt oder SysClock Funktion, ein Zähler und ein IF>> und halt das GPIO Pin direkt setzen.
Das hört sich eigentlich noch besser an, weil ich ohnehin nur einen
2kHz-Takt brauche. Aber ich dachte dass das evtl. zu ungenau wäre? Ich
möchte damit ein LCD betreiben, das eine externe Clock braucht. würde
das mit SysClock/TimerInterrupts funktionieren?
Zwei KHz, der F4 wird sterben vor Langeweile! ;-)
Nee im Ernst, es ist mit 100KHz noch kein Problem.
Zu ungenau wird es nur, wenn der Code complexer wird (mehrere IF und
Zeugs). Der Interrupt erfolgt ja exakt. Die Verzögerung im Interrupt
durch Code Ausführung ist ja konstant, solange du linearen Code hast.
Aber die Ungenauigkeiten sind sehr gering. Der F4 führt bis zu 168
Millionen Befehle aus pro Sekunde. Einige Befehle hintereinander machen
bei 2KHz fast nichts aus ...
Zudem ist die Ungenauigkeit ja nicht mal additiv. Der Timer läuft ja
exakt ab, es ist dann halt mal eine Flanke etwas später, dafür stimmt
sie im Mittel.
Thomas Winkler schrieb:> Zudem ist die Ungenauigkeit ja nicht mal additiv. Der Timer läuft ja> exakt ab, es ist dann halt mal eine Flanke etwas später, dafür stimmt> sie im Mittel.
Trotzdem würde ich das Datenblatt konsultieren und es mit einer Lösung
ohne Interrupts versuchen.
Stichworte: Timer OutputCompare PWM
Da wird der Ausgang direkt von der Timerhardware gesetzt und es gibt
kein Flankenjittern.
Wenn du einen Interrupt trozdem zu jeder Flanke benötigst, geht das aber
auch damit.
Mit den folgenden Zeilen erscheint der Core-Takt am Pin PC9:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOC,GPIO_Pin_9,GPIO_AF_MCO);
RCC_MCO2Config(RCC_MCO2Source_SYSCLK,RCC_MCO2Div_1);
Aber Achtung! Wenn der Controller mit 168MHz läuft, hat das Signal an
PC9 auch 168MHz! Nicht jedes Oszi packt das. Mit einer Änderung des
zweiten Parameters in der letzten Programmzeile lässt sich ein Teiler
für das Ausgangssignal einstellen.
Guten Morgen,
vielen Dank auch für die letzten beiden Antworten. Leider konnte ich
noch keine Möglichkeit testen, aber den Codeschnipsel von Rainer hab ich
mir schon mal genauer angeschaut. Dazu habe ich noch zwei Fragen:
1. Du schreibst, dass PC9 auch auf 168 MHz läuft, wenn SysClk auf 168
MHz eingestellt ist. Ist das wirklich möglich? Denn der Portspeed
beträgt ja nur 50 MHz? Ausserdem dachte ich noch irgendwo in der
Standard Periph Library gelesen zu haben, dass der SysClk in dem Fall
nicht größer als 50 MHz sein darf... Habe ich irgendwas falsch
verstanden, bzw. würde ich hier vielleicht sogar etwas kaputt machen,
wenn ich die 168 MHz auf PC9 schalten würde?
2. Wenn ich mich richtig durch das ReferenceManual gekämpft habe, glaube
ich, dass ich keine Chance habe, eine der Quellen für MCO bis auf 2 kHz
runterzuschrauben. Stimmt das? Dann muss ich natürlich eine der oberen
Möglichkeiten nutzen.
Die Variante mit PWM hab ich leider noch nicht genauer anschauen können.
Davon hab ich auch leider noch nicht so viel Ahnung. Aber ist es damit
möglich auf 2 kHz zu kommen?
Heute Abend werde ich mal so viele Varianten wie möglich ausprobieren,
auch wenn ich eigentlich nur 2 kHz brauche, ist es doch interesannt die
anderen Möglichkeiten zu kennen.
Von daher nochmal Dankeschön
Newbie
zu 1)
GPIO Speed 50MHz, - gilt das nicht nur beim Lesen? Wenn ich ein GPIO
schreibe wird es wohl sofort ziehen und nicht erst wenn der Clock kommt?
zu 2)
Sicher geht das. Jeder Timer hat einen 16Bit Vorteiler. Und dann werden
ja unterläufe signalisiert. Dh. bei 16bit Timer kann man nochmals durch
65536 dividieren. Bei 32bit Timer sogar durch 2 hoch 32 ...
zu 1)
Tut mir Leid, das wusste ich nicht. Wäre aber eigentlich auch logisch
gewesen.
zu 2)
Ich dachte, ich muss mich bei den PreScalern an die vordefinierten
Konstanten halten (die ja nur bis 16 gehen, soweit ich gelesen habe).
Aber wenn das nicht der Fall ist, umso besser. Danke
Der Code-Schnipsel bewirkt, dass der Core-Takt am Pin ausgegeben wird.
Und der darf bis zu 168MHz betragen (hatte durch eine fehlerhafte
Programmierung auch schon mal 250MHz drauf).
Die "50MHz" bei der Port-Einstellung ist natürlich ein kleiner
Schönheitsfehler. Besser ist hier natürlich die 100MHz-Einstellung. Aber
auch damit hat das Signal am Ausgang wenig Ähnlichkeit mit einem
Rechteck.
Gemäß Hilfe zur STM32F4 Standard Peripherals Library darf für den
zweiten Parameter von RCC_MCO2Config eine Konstante zwischen
RCC_MCO2Div_1 und RCC_MCO2Div_5 verwendet werden. Viel Spielraum beim
herunter teilen scheint es also nicht zu geben.
Das mit RCC_MCO2Div_x hab ich in der Hilfe auch schon gefunden. Die
definierten Hexwerte dazu sind aber relativ seltsam. Da werde ich noch
nicht wirklich schlau draus. Warum werden hier solche Werte genommen, um
die SysClk zu teilen. Danach könnte ich ja nicht mal einen halben SysClk
erzeugen, oder?
Was passiert hier eigentlich, wenn ich hier durch einen beliebigen
Hexwert teile?
OK, also ich hab in der Hilfe nochmal nachgelesen, und gesehen, dass
RCC_MCO2Div_5 eine Teilung durch 5 bedeutet, also nicht den Wert, der da
hex definiert ist. (Wie auch immer der Hexwert dann zustande kommt)
@diddl
Meinst du als Eingang für MCO? Hier ist nur SysClk, PLL und HSE möglich.
=> Aber während ich das schreibe, denk ich mir, dass ich ja eigentlich
PLL als Eingang nehmen könnte, da mit HSE/4 reingehen, und das nochmal
durch 2 Teilen -> 1 MHz Ausgang. Und das dann bei der MCO-Konfiguration
nochmal durch 5 teilen. So müsste es gehen, oder? Oder könnte ich sogar
mit HSE/8 in das MCO rein?
OK, sorry. Mein Fehler. Ich hab gerade erst gesehen, dass ich in der PLL
nur hochtakten kann, aber nicht runter (Mindestens mit 64
multiplizieren, und max durch 63 dividieren)... Kann ich dann HSE/8 als
Eingang für MCO nehmen? - Ich glaube also nicht... wie mach ich's dann?