STM32F103 Timer

OP #1819350
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
#1819358
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.
#1819513
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.
#1819520
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.
OP #1819656
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ß
#1819666
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren