Forum: Mikrocontroller und Digitale Elektronik stm32f407vg clock auf IO-Pin


von uCNewbie (Gast)


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

von Thomas W. (diddl)


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.

von uCNewbie (Gast)


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?

von Thomas W. (diddl)


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 ...

von Thomas W. (diddl)


Lesenswert?

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.

von uCNewbie (Gast)


Lesenswert?

super, und nochmal vielen Dank für die schnelle Antwort. Hast mir 
wirklich sehr geholfen

von Fritz (Gast)


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.

von Rainer R. (Firma: Reusch Elektronik) (reusch)


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.

von uCNewbie (Gast)


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

von Thomas W. (diddl)


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  ...

von uCNewbie (Gast)


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

von Rainer R. (Firma: Reusch Elektronik) (reusch)


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.

von uCNewbie (Gast)


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?

von Thomas W. (diddl)


Lesenswert?

Aber man kann doch einen anderen Timer als Input Source verwenden, oder 
nicht? Damit müsste man doch locker auf 2KHz runter kommen.

von uCNewbie (Gast)


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?

von uCNewbie (Gast)


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?

von Thomas W. (diddl)


Lesenswert?

Machs mit dem Systick, wie anfänglich besprochen.

Das funktioniert tadellos und ist sehr portabel, falls du mal auf eine 
andere CPU gehen musst.

von uCNewbie (Gast)


Lesenswert?

Ja, das hab ich mir auch schon gedacht. So werd ich's jetzt auch machen. 
Vielen Dank an alle Beteiligten für die Hilfe

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.