Вроде всё верно. Сойдет вообщем.
PMIC.CTRL=0
| (0<<PMIC_RREN_bp)
| (0<<PMIC_IVSEL_bp)
| (1<<PMIC_HILVLEN_bp)
| (1<<PMIC_MEDLVLEN_bp)
| (1<<PMIC_LOLVLEN_bp)
;
Больше ничего не надо. Хотя это и так понятно.
Эту строку
#pragma vector=DMA_CH0_vect __interrupt void isrDMA0() {
Flag |= Flag_DMA; // моя маска события
DMA.INTFLAGS |= DMA_CH0TRNIF_bm;
}
Лучше так, но тоже не принципиально:
DMA.INTFLAGS = DMA_CH0TRNIF_bm;
В DMA.INTFLAGS точно ничего полезного нет.
DMA.CH0.CTRLB |= DMA_CH_TRNINTLVL_LO_gc;
Или там по умолчанию лежит что-то полезное?Правильнее использовать = (если из main, то есть при запуске очередной транзакции), потому как ничего полезного там не лежит. Разве что флаги сработавших прерываний зодно сбросить (но они в прерывании сбрасываются).
3. Достаточно ли этого для разрешения прерывания или надо еще где-то заглушки снимать?Ещё нужно
DMA.CH0.CTRLA = DMA_CH_ENABLE_bm | DMA_CH_SINGLE_bm | DMA_CH_BURSTLEN_2BYTE_gc; // reload source after every burst, reload dest after every blockможно самой последней делать - если DMA_CH_ENABLE равно 1, то транзакция уже разрешена, а ещё ничего не настроено (мало ли что не так пойдёт). Это вообще лишнее, но мешать не будет:
DMA.CH0.REPCNT = 1;Блок всё равно 1 на всю транзакцию.
"АЦП даже на макс. скорости выдает данные раз в ~160 тактов, ..." - не согласна. Если в даташите указана макс.частота 1 МГц, то ее периолд уже равен 32 такта, поскольку тактовая частота этого МК у меня 32 МГц.Как бы правильно, но по факту АЦП у xmega на редкость мерзкая штука. Цифровая часть конечно может 1MS/s выдать, но при этом нелинейные искажения такие, что просто ужас (может нужно как-то входные цепи правильнее делать или ещё что...). Про конвейерный режим и не говорю - ад и израиль. Или у вас как-то по-другому?
5. В каком регистре можно удостовериться, что канал DMA свое задание выполнил и остановился, если не использовать для этой цели прерывание?DMA.INTFLAGS:
When a transaction on channel n has been completed, the CHnTRFIF flag will be set. If unlimited repeat count is enabled, this flag is read as one after each block transfer. Writing a one to this bit location will clear the flag.или DMA.CHx.CTRLA бит ENABLE (для многоблочной транзакции):
Bit 7 – ENABLE: Channel Enable Setting this bit enables the DMA channel. This bit is automatically cleared when the transaction is completed.
6. Можно ли во время выполнения DMA своего задания выяснить, насколько далеко оно продвинулось?Есть регистр DMA.CHx.TRFCNT. По его содержимому можно узнать как далеко транзакция продвинулась. P.S. Тут был недавно пост про DMA канал как аппаратный FIFO.
которых от 12-разрядного АЦП никогда не бывает, а потом просматривать от конца к началу, но как-то это не элегантно.Можно и так, но зачем? В ДМА всё что надо есть.