Hi
Try removing the printf() from DMA_CH1_OnComplete() or moving it "after" the code that configures the DMA for the next transfer. You may find that it then works (I think that completely removing the printf() does make it work because there looks to be no more DMA errors resulting then).
The problem seems to be more system design than DMA code itself. The code is not very easy to follow (I think that you are using PE generated code which uses a lot of deferred function calls that are not easy to follow without investing a certain amount of time understanding where they are and where they are being called from) but I believe that there is a timer being used to regularly trigger than next DMA transfer sequence. At the end of a successful transfer you then set the DMA source pointer back and configure another sequence of 8 transfers. The problem looks to be the fact that you are using a blocking version of printf() which is taking a long time to complete - the next timer event seems to take place faster than the output and so it fires when the DMA (still) has a value of 0 for its transfer count still and this is an illegal configuration when triggering it - thus the following failure.
As long as your code is "fast enough" to set up the next transfer before the next timer event triggers it it is then OK. If you use printf() in a code area that is critical in terms of timing you will either need to use a non-blocking version or else call it after the critical work has been done. If it's execution generally takes longer than the timer period that is triggering the DMA you will not be able to use it in the path since it will not allow the system to keep up with the trigger rate.
Since the code is not obvious without quite a lot of study (which I prefer not to do for an otherwise quite simple case) I am not even sure whether your DMA_CH1_OnComplete() is being called from an interrupt or not, but generally it may be best to avoid any prinf() use in interrupts.
Regards
Mark
P.S: I don't think that the KDS viewer is a problem for debugging.
If you set the breakpoint at the "start" of your OnComplete routine/interrupt you will see that there is no DMA error but if you then step over the printf() you will see that the error has then occurred. This show that the error occurs "while" the printf() routien is being executed... If you set it at the end you just always see the error with no obvious reason why.