Hallo,
ich versuche eine Softwarebasierte Schnittstellenlösung (ist nur ein
paar Millisekunden pro Sekunde aktiv) zu realisieren und denke, dass die
bisherig verwendete Routine vor allem bei höheren Datenraten zu langsam
ist und damit Probleme verursacht. Dazu verwende ich den DAC mit DMA, um
Signal-Rampen zu erzeugen.
Eigentlich wende ich nur diese Funktion an, es wird nur das Datenfeld
(hier: interface_zero_low) gewechselt:
1 | HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*) interface_zero_low, INTERFACE_RAMP_RES, DAC_ALIGN_12B_R);
|
Dann wird mit einem Timer ein Interrupt generiert und ein weiterer Timer
für den DAC-Trigger angeworfen. Ist die Rampe fertig (DMA-TC-Interrupt),
wird der Timer gestoppt und ich bereite die nächste Rampenfunktion vor.
Nun ändere ich eigentlich nur das Feld für die Rampe, daher habe ich mir
gedacht, so was in der Art sollte reichen, aber es reicht nicht:
1 | DMA1_Stream5 -> M0AR = (uint32_t)(&interface_low_return_to_zero);
|
Irgendwo habe ich das gefunden, hat mich aber auch nicht weiter
gebracht:
1 | DMA1_Stream5 -> NDTR = INTERFACE_RAMP_RES;
|
2 | DMA1_Stream5 -> PAR = (uint32_t)&(DAC -> DHR12R1);
|
3 | DMA1_Stream5 -> M0AR = (uint32_t)(&interface_zero_low);
|
4 | DMA1_Stream5 -> CR = (DMA_SxCR_TEIE | DMA_SxCR_CHSEL | DMA_SxCR_CIRC | DMA_SxCR_DIR_0 | DMA_SxCR_EN | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_MINC | DMA_SxCR_PL_0);
|