Код:
int16_t bufferDMA[<размер буфера>];
...................
...................
// init DMA0
DMA0CON = 0;
DMA0CONbits.MODE = 0b00; //Continuous - после завершения пакета авт. перезапуск
// или:
//DMA0CONbits.MODE = 0b01; //One-Shot - после завершения пакета выключение канала
DMA0CONbits.AMODE = 0b00; //Register Indirect with Post-Increment mode
DMA0CONbits.DIR = 0b00; //Reads from peripheral address, writes to RAM address
DMA0CONbits.SIZE = 0; //Word
DMA0REQ = 0b1101; // request from ADC1
DMA0STA = (uint16_t)&bufferDMA;
DMA0PAD = (uint24_t)&ADC1BUF0;
DMA0CNT = <размер буфера>-1;
// init ADC with DMA
AD1CON4bits.ADDMAEN = 1;
...................
...................
// где нужно запускаем DMA:
DMA0CONbits.CHEN = 1;
Могу ошибаться в синтаксисе uint24_t , нужно посмотреть в хедере stdint.h
Настройку самого АЦП я не привел. Это зависит от конкретной реализации. Там же нужно указать источник запусков АЦП.
Учтите, что DSP обработка с помощью библиотек самого XC16 не слишком эффективна по скорости. Лучше писать АСМ-вставки или АСМ-функции.
При семплировании АЦП 10 кспс верхняя частота сигнала составит максимум 2,5...3 кГц (с учетом антиалиасинга).
Реально сделать SDR с АМ модуляцией примерно до 50 кГц несущей. Выше не хватит производительности МК.
Бабочка БПФ - это минимум НЕТТО 23 инструкции. Брутто добавятся вызовы бабочки и адресация данных и коэффициентов. То есть это контроллер не для потокового звука. Звук - это очень серьезно. Эквалайзер на звук - уровень топовых DSP от Техаса примерно за 20...30 баксов за кристалл.
ЗЫ. Не очень понял зачем вам выводить через DMA в порт?