stm32f407vg clock auf IO-Pin

Gast #2851073
Lesenswert?

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
#2851102
Lesenswert?

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.
Gast #2851109
Lesenswert?

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?
#2851360
Lesenswert?

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 ...
Gast #2851433
Lesenswert?

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.
(Firma: Reusch Elektronik) #2851867
Lesenswert?

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.
Gast #2854520
Lesenswert?

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
#2854545
Lesenswert?

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  ...
Gast #2854563
Lesenswert?

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
(Firma: Reusch Elektronik) #2854623
Lesenswert?

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.
Gast #2854653
Lesenswert?

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?
Gast #2854816
Lesenswert?

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?
Gast #2854826
Lesenswert?

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?

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