Forum: Mikrocontroller und Digitale Elektronik STM32F4 µs Tick


von Sim (Gast)


Lesenswert?

Hallo Leute,

gerade hänge ich an dem Problem, dass ich gerne in meinem STM32F4 alle n 
µs einen Datensatz über ein SPI Interrupt losschicken möchte.
Mein erster Ansatz war das ganze über den SysTick laufen zu lassen. Im 
ms Bereich kein Problem, da ich hier einfach mit dem SysTick_Handler 
arbeiten kann. Die Zeit zum Aufruf des Interrupts kann man ja einfach 
per HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/Timebase) bestimmen.
Rufe ich jedoch den Interrupt alle µs auf, bekomme ich direkt Probleme 
mit der SPI Übertragung. Was ja auch Sinn macht, da hier SysTick und SPI 
Interrupt in Konflikt kommen.
Nun die Frage, wie kann ich möglichst ohne Interrupt einen µs-Tick 
erzeugen, welcher mir dann den die SPI_Transmit_IT Funktion triggert?
Meine Idee wäre das ganze irgendwie über den aktuellen Wert des 
SysTick->VAL zu machen. Allerdings fehlt mir hier der Ansatz zur 
Umsetzung. Habt ihr eine Idee, wie ich das ganze möglichst elegant lösen 
kann?

von Daniel V. (voda) Benutzerseite


Lesenswert?

Schau mal hier:

Beitrag "STM32F4: µs-Delay"

Gruß
Daniel

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Wie gross ist ein Datensatz. Falls es nicht mehr als 2 Byte sind, 
triggert ein Timer Event einen DMA Transfer auf das SPI TX Register. SPI 
fertigt kann dann ueber einen anderer DMA Kanal das Ergebniss 
wegschreiben und Dir einen Interrupt geben, wenn ein Block fertig ist. 
Mache ich auf einem F3 um mit 200 kHz Daten von einem LTC2326 ADC zu 
holen.

von Sim (Gast)


Lesenswert?

Ein Datensatz ist 3 Byte groß..

von Sim (Gast)


Lesenswert?

@Daniel V.
Auf den Thread bin ich auch schon gestoßen. Wenn ich mir die Formel zur 
Berechnung der µs anschaue kommen mir jedoch einige Fragen.

us = ticker * 1000 + 1000 - SysTick->VAL/168

SysTick->VAL/168 verringert sich jede µs um 1, richtig?
ticker * 1000 benötige ich doch eigentlich nicht, wenn ich nur von 0-1ms 
zählen will, oder?

von aSma>> (Gast)


Lesenswert?

Sim schrieb:
> us = ticker * 1000 + 1000 - SysTick->VAL/168
>
> SysTick->VAL/168 verringert sich jede µs um 1, richtig?
> ticker * 1000 benötige ich doch eigentlich nicht, wenn ich nur von 0-1ms
> zählen will, oder?

Der SysTick ist ein down-counter, deshalb ergibt es diese Formel.

Du darfst da nix verändern, höhstens "168" ergibt den Systemtakt in MHZ. 
Um es variabel zu machen, könnte man den Nenner durch den define 
"SystemCoreClock" bestimmen.

Zum ausprobieren ist es vielleicht ganz nett. Ich würde eher den Weg 
gehen, den Uwe vorgeschlagen hat. Mit DMA und einen extra Timer.

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.