Hallo zusammen, ich versuche gerade mich mit dem Timern des STM32F103 anzufreunden. Ich hab es bereits geschafft, den Timer laufen zu lassen und mittels Interrupt ein Bit toggeln zu lassen. Leider komme ich aber mit den Registern nicht ganz zurecht und weiß nicht, wie ich den Prescalar ausschalten kann, um so auf ein Interval von 1/72MHz = 13,9ns zu kommen. Das niedrigeste, was ich bisher geschafft habe ist ca 1µs. Ich hoffe ich ihr könnt mir weiterhelfen oder es kennt jemand ein paar gute Beispiele dazu. Ich arbeite mit dem MCBSTM32E von Keil und der µVision IDE. Danke! Grüße Mathias
Mathias Dubdidu schrieb: > von 1/72MHz = 13,9ns zu kommen. Das niedrigeste, was ich bisher > geschafft habe ist ca 1µs. Soo arg viel schneller wirst du das per Interrupt ohnehin nicht hinbekommen. Kannst nicht erwarten, dass du per Interrupt alle 14ns ein Portpin toggeln kannst. Dafür gibt es die Compare Register und die entsprechenden Pins, mit denen das automatisch ohne Interrupt erfolgt. Siehe dazu Beispielcode in der FwLib.
A. K. schrieb: > Dafür gibt es die Compare Register und die entsprechenden Pins, mit > denen das automatisch ohne Interrupt erfolgt. Siehe dazu Beispielcode in > der FwLib. Ah Danke für den Hinweis, werde mir die Compare Register gleichmal anschauen und schaun, ob ich damit klar komme. Gruß
So habe mir grade mal die Beispiele und auch nochmal die Registerbeschreibungen angeschaut, habe aber leider nichts gefunden, was mir weiter hilft. Was machen denn die Compare Register genau? Und was muss ich damit machen um schneller zu werden? Hoffe hier kann mir das jemand kurz erklären :) Danke Gruß
Lade Dir von STM die "stm32f10x_stdperiph_lib.zip" runter. Darin sind jede Menge Timer-Beispiele zur Lösung Deines Problemes enthalten.
Mathias Dubdidu schrieb: > Hoffe hier kann mir das jemand kurz erklären :) Du klingst wie jemand, der sich ausgerechnet einen STM32 für sein Erstlingswerk ausgesucht hat. Und nun den Wald vor lauter Bäumen nicht sieht, weil STs Manuals, wie in dieser Grössenklasse üblich, solide Vorkenntnis erfordern. Drum empfehle ich, eher mit AVRs anzufangen, deren weit geringere Komplexität es zulässt, eine detalliertere Beschreibung in die Manuals zu pressen. Es gibt schon einen Grund, warum man auch als angehender Berufspilot nicht gleich auf einem A330 fliegen lernt, sondern mit einer einfachen leichten übersichtlichen Einmotorigen anfängt.
Zu den Compare-Registern: Eine deren Funktionen ist es, bei Erreichen des dort enthaltenen Wertes durch den Zähler des Timers irgendwas an einem bestimmten Pin auszulösen. Beispielsweise den Zustand zu setzen, zu löschen oder zu toggeln. Will man damit eine Frequenz f/(2*(N+1)) am Pin haben, dann muss man zusätzlich dafür sorgen, dass der Timer zu diesem Zeitpunkt wieder von vorne anfängt. Wozu ein weiteres Timer-Register dient. Alternativ kann man den Timer damit auf volle Periode einstellen und den Ausgang mit 50% PWM fahren, d.h. der Ausgang des Compare-Channels wird bei Rücksetzen des Timers gelöscht und bei Erreichen des Compare-Wertes (halbe Periode) gesetzt.
A. K. schrieb: > Es gibt schon einen Grund, warum man auch als angehender Berufspilot > nicht gleich auf einem A330 fliegen lernt, sondern mit einer einfachen > leichten übersichtlichen Einmotorigen anfängt. Das Problem ist, wenn man einen Anfäger in einen A330 setzt dann hat er nur die Wahl zwischen fliegen und abstürzen, will sagen ich mach das nicht freiwillig mit einem STM32, deswegen bin ich auch sehr froh hier Hilfe zu bekommen! Was es mit dem Registern auf sich hat, habe ich denke ich verstanden. Mein eigentliches Ziel ist es Datenpakte über einen Pin rauszuschicken. Dazu habe ich ein Datenfeld, in dem entweder 0 oder 1 steht. Jenachdem was jetzt gerade in dem aktiven Element steht soll ein Pin auf Low oder High gehen. Das ganze soll ich nun in Abhängigkeit eines Timers realisieren. Also in etwa so:
1 | while(x > 11){ |
2 | Pin = data[x]; |
3 | x++; |
4 | while(timer); //Hier das Timerevent abwarten, wobei das so klein wie möglich sein sollte |
5 | }
|
Wenn ich das nun mit den Compare Registern mache und den Toggle-Mode (011) wähle, dann müste ich doch in meiner Warteschleife nur abwarten bis OC1REF = !OC1REF wird oder? Nur erreiche ich auch so die maximale Geschwindigkeit? Gruß
Für sowas solltest du dir eher SPI per DMA ansehen. Ignoriere den Taktpin wenn du ihn nicht brauchst. Nur so kriegst du die Daten sauber äquidistant und schnell im Gänsemarsch raus, dank DMA auch ohne dass die der nächste Interrupt einen Strich durch die Rechnung macht. Einen Bitstream mit 72MHz zum Pin rauszuwerfen geht nicht, nicht mit SPI und nicht mit Timer. Mit einzeln programmierter Pinsteuerung gehen auch keine 2stelligen MHz. Mit SPI schon. Jetzt wäre es an der Zeit, bei den Anforderungen mal konkreter zu werden.
Hmm ok werde das morgen mal klären, wie sich mein Praktikumsbetreuer das genauer vorgestellt hat. Danke für die ausführliche Hilfe! Gruß
Ausserdem kann der STM32 maximal 50 MHz am Portpin. Lese dir doch mal den Artikel STM32 durch, da gibt es viele Hinweise und Links.
Markus Müller schrieb: > Ausserdem kann der STM32 maximal 50 MHz am Portpin. Erzähl mir mal, wie du die erreichen willst ;-). Ausser am Taktausgang, versteht sich.
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.