Forum: Mikrocontroller und Digitale Elektronik STM32F103 Timer


von Mathias D. (darkfirefighter)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Mathias D. (darkfirefighter)


Lesenswert?

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ß

von Mathias D. (darkfirefighter)


Lesenswert?

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ß

von Matthias K. (matthiask)


Lesenswert?

Lade Dir von STM die "stm32f10x_stdperiph_lib.zip" runter. Darin sind 
jede Menge Timer-Beispiele zur Lösung Deines Problemes enthalten.

von (prx) A. K. (prx)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

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.

von Mathias D. (darkfirefighter)


Lesenswert?

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ß

von (prx) A. K. (prx)


Lesenswert?

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.

von Mathias D. (darkfirefighter)


Lesenswert?

Hmm ok werde das morgen mal klären, wie sich mein Praktikumsbetreuer das 
genauer vorgestellt hat.
Danke für die ausführliche Hilfe!

Gruß

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ausserdem kann der STM32 maximal 50 MHz am Portpin.

Lese dir doch mal den Artikel STM32 durch, da gibt es viele Hinweise 
und Links.

von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.