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