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?
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.
@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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.