fpga schrieb:
> Nun CRC ist nicht zwingend; wenns ohne CRC ohne ISR geht ist das ein
> guter tradeoff.
Das sollte doch ganz einfach funktionieren, ohne Interrupts und ohne
Zwischenpuffer? Zumindest mit den STM32L4?
SPI wird als Master, nur TX, 8 oder 16 Bit, kein DMA konfiguriert. Beim
ADC wird DMA eingeschaltet, Peripheral to Memory, Cyclic Mode, 16-Bit
lesen und schreiben und als Ziel wird das SPI-TX-FIFO eingetragen. Das
geht, weil alles Memory Mapped ist.
Der Slave Select Ausgang wird und bleibt dabei aktiv, sobald SPI
eingeschaltet wird. Evt. kann man zwischen den einzelnen Datenworten
einen Impuls erzeugen, indem man das NSSP Bit setzt.
Wenn mehr als ein Kanal gewandelt wird, kann der SPI-Slave nur
mitzählen...
Die Länge eines DMA-Transfers (CNDTR) ist eigentlich genau 1, aber wenn
man hier einen größeren Wert einträgt, könnte man Interrupts mit
entsprechend niedrigerer Frequenz erzeugen.
Der ADC kann in Hardware den Mittelwert über 2,4,8... Wandlungen bilden.
Wenn die Timer knapp werden, kann man den ADC frei laufen lassen und das
Abtastintervall per Vorteiler plus Sample Time plus Kanalzahl
einstellen.
fpga schrieb:
> Wie kann ich im cube genau feststellen, wie lange die ISR dauert?
> (also nicht nur Anzahl Instruktionen sondern wirklich Anzahl Systemclk)
Garnicht, dazu müsste cube wissen, wie der Compiler optimiert. Auf einen
einzelnen Taktzyklus genau geht es sowieso nicht, weil DMA, Flash Cache
und andere Interruptroutinen dazwischen funken können. Auch, wenn die
eine niedrigere Priorität haben, brauchen die einige wenige unteilbare
Zyklen.
Man kann Interruptroutinen ein wenig optimieren, indem man sie auf eine
runde Adresse linkt. Bei den kleineren Chips reicht ALIGN(8), weil das
Flash nur 64 Bit breit ist; aber es gibt breitere.