" I would personally use the double buffer mode rather than the circular buffer mode for streaming samples to DACs. Now it probably all depends on your exact use case - maybe you're storing a single period of signal in the buffers and just want to generate it continuously, in which case the circular mode would be appropriate."
I looked this up and it seems to be for usage where one wants to be dynamically changing the DMA addresses. I may well want that. The source buffer for DMA -> DAC will always be a fixed size e.g. 500 values, but it will be recomputed frequently - probably around every 100ms. I want to vary the frequency and amplitude of the waveform. The frequency can be done in two ways: change the timer driving the DAC, or change the DMA source table length. Both give similarly fine control; I will be generating around 400Hz and with say a 250 sample table that is 100kHz i.e. 10us between samples, and the timer (which will be driven from APB1 or APB2; both 42MHz in my case) which with a x1 prescaler gives a frequency control resolution of 1/420 of 10us, while varying the table length will give a resolution of 1/250. The timer value can be changed without messing up its current cycle AFAIK, and the DMA double buffer mode gives you the same thing for the source address (but seems a lot more complicated to configure).
It would be handy to be generating one table while the DMA is reading from another, and then switch the tables, preferably at the next zero crossing so there are no glitches. Again, this would be trivial with an interrupt from the DMA, with the ISR checking if the other table is ready for use.
Normally the output will be a sinewave, but the amplitude will vary, from +1 through zero to -1. For those who know, this is to emulate an LVDT. Of course the obvious way to do this is to have a four quadrant multiplying DAC, with the above mentioned reference waveform being its input, and with the digital input coming from software, but I want to do it all in the CPU.
For measurement of the input waveform period, I recall reading somewhere that one can config a DMA to be triggered from a pin and do a transfer from a timer to memory, but we also want to reset the timer, and if the timer is configured to reset from the pin also, does the timer get reset before or after the DMA transfer?
Again, an ISR would make this more obviously controlled.