Thanks for the info mikerj
What you are trying to say is instead of using Circular DMA use Normal DMA and also increase the size of the DMA buffer.
Yes, this is how I have implemented this on an STM32F103.
So I get something like what you showed
Chan1, Chan2, Chan3, Chan4, Chan1, Chan2 .... and so on
Now suppose I need 16 sets of readings for Chan1 to Chan4 and 2 bytes each per channel. so that would make a 16 * 4 * 2 = 128 byte buffer.
So if the the 128byte buffer overflows do I have to set the DMA manually back to the start of the buffer?
You will need to re-start the DMA after the transfer has completed. How and when you do this depend on how often you want a new filtered ADC value. For maximum throughput you could use the end of transfer interrupt to start a new DMA transfer in a second buffer whilst averaging the values in the first (i.e. double buffering).
Also you are doing this averaging after the needed 16 samples per channel are acquired right?
Yes, you acquire the samples and then average them.
In the system I was working on we used oversampling to gain some more resolution. The DMA was started by a timer interrupt and the averaging was performed in the end of transfer interrupt. IIRC there was 5 or 6 ADC channels, 64 samples from each channel and the calculations were quite fast, less than 50 microseconds with full C optimisations enabled. Our clock speed was fairly low as well, only about 33MHz.