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.
super, und nochmal vielen Dank für die schnelle Antwort. Hast mir wirklich sehr geholfen
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?
Aber man kann doch einen anderen Timer als Input Source verwenden, oder nicht? Damit müsste man doch locker auf 2KHz runter kommen.
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?
Machs mit dem Systick, wie anfänglich besprochen. Das funktioniert tadellos und ist sehr portabel, falls du mal auf eine andere CPU gehen musst.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.