ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
753293 Топик полностью
Apтём (01.05.2017 00:49 - 00:58, просмотров: 274) ответил Ксения на Спасибо за труды! У меня получилось вот что (кое-где отступила от рекомендаций):
Вроде всё верно. Сойдет вообщем. 
DMA.CH0.CTRLB |= DMA_CH_TRNINTLVL_LO_gc;
Или там по умолчанию лежит что-то полезное?
Правильнее использовать = (если из main, то есть при запуске очередной транзакции), потому как ничего полезного там не лежит. Разве что флаги сработавших прерываний зодно сбросить (но они в прерывании сбрасываются).
3. Достаточно ли этого для разрешения прерывания или надо еще где-то заглушки снимать?
Ещё нужно PMIC.CTRL=0 | (0<<PMIC_RREN_bp) | (0<<PMIC_IVSEL_bp) | (1<<PMIC_HILVLEN_bp) | (1<<PMIC_MEDLVLEN_bp) | (1<<PMIC_LOLVLEN_bp) ; Больше ничего не надо. Хотя это и так понятно. Эту строку
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 на всю транзакцию. #pragma vector=DMA_CH0_vect __interrupt void isrDMA0() { Flag |= Flag_DMA; // моя маска события DMA.INTFLAGS |= DMA_CH0TRNIF_bm; } Лучше так, но тоже не принципиально: DMA.INTFLAGS = DMA_CH0TRNIF_bm; В DMA.INTFLAGS точно ничего полезного нет.
"АЦП даже на макс. скорости выдает данные раз в ~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-разрядного АЦП никогда не бывает, а потом просматривать от конца к началу, но как-то это не элегантно.
Можно и так, но зачем? В ДМА всё что надо есть.