DMA для dsPIC. Контроллер Прямого доступа к памяти (DMA). DMA контроллер. Регистр Смещения Адреса Начала A DPSRAM Канала DMA x, страница 10

Если режим адресации изменяется к Регистрировой Косвенной Адресации Без Постприращения, в то время как канал DMA активен (то есть, после того, как некоторые передачи DMA произошли), DMA DPSRAM адрес укажет на текущий адрес буфера DPSRAM (то есть, не содержание DMAxSTA или DMAxSTB, который к тому времени мог отличаться от текущего адреса буфера DPSRAM).  рисунок22-9 иллюстрирует передачу данных от периферийного устройства к DMA DPSRAM, противопоставляя использование с и без адресации постприращения.

рисунок 22-9: противопоставление косвенной адресации передачи данных с и без постинкремента

пример 22-4: код для InputCapture и DMA с  регистровой косвенной адресацией без постприращения

установка Input Capture 1 module for DMA operation:

IC1CON = 0;               // сброс модуля IC

IC1CONbits.ICTMR = 1;         // выбор  Timer2 для защелкивания

IC1CONbits.ICM = 2; // защелкивать по каждому положительному фронту

IC1CONbits.ICI = 0;    //генерировать DMA запрос при каждом событии защелкивания

установка Timer 2 to be used by Input Capture module:

PR2 = 0xBF;                            // Initialize count value

T2CONbits.TON = 1;               // Start timer

установка DMA Channel 0 for no Post Increment mode:

unsigned int CaptureValue __attribute__((space(dma)));

DMA0CONbits.AMODE = 1;   // Configure DMA for Register indirect

// without post-increment

DMA0CONbits.MODE = 0;                 // Configure DMA for Continuous mode

DMA0PAD = (volatile unsigned int)&IC1BUF;// Point DMA to IC1BUF

DMA0CNT = 0;                                   // Interrupt after each transfer

DMA0REQ = 1;                       // Select Input Capture module as DMA Request source

DMA3STA = __builtin_dmaoffset(&CaptureValue);

IFS0bits.DMA0IF = 0;              // Clear the DMA interrupt flag bit

IEC0bits.DMA0IE = 1;                         // Set the DMA interrupt enable bit

DMA0CONbits.CHEN = 1;                  // Enable DMA

установка DMA Channel 0 Interrupt Handler:

void __attribute__((__interrupt__)) _DMA3Interrupt(void)

{

/* Process CaptureValue variable here*/

IFS0bits.DMA0IF = 0; //Clear the DMA3 Interrupt Flag

}

22.6.6 Режим переферийной косвенной адресации

Способ Периферийной Косвенный адресации - специальный способ адресации, где периферийное устройство, а не канал DMA, обеспечивает переменную часть адреса DPSRAM. То есть периферийное устройство генерирует младшие биты (LSbs) адреса DPSRAM, в то время как канал DMA обеспечивает фиксированный базовый адрес буфера. Однако, канал DMA продолжает координировать фактическую передачу данных, следя за передачей, счетом и генерирует соответствующие прерывания CPU.

Способ Периферийной Косвенный адресации может работать двунаправлено, в зависимости от потребности периферии, так что канал DMA должен быть конфигурирован соответственно, чтобы поддержать целевое периферийное устройство, чтение или запись.

Способ Периферийной Косвенный адресации выбирается, программируя биты Выбора Способа адресации AMODE <1:0> к ‘1x’ в регистре Управления Канала DMA (DMAxCON).

Возможность DMA в Способе Периферийной Косвенной адресации может быть определенно приспособлена, чтобы выполнить потребности каждого периферийного устройства, которое поддерживает его. Периферийное устройство определяет последовательность адреса чтобы обратиться к данным в пределах DPSRAM, позволяя ему, например, сортировать приходящие данные ADC в несколько буферов, освобождая загрузку CPU.

Если Способ Периферийной Косвенный адресации поддерживается периферийным устройством, прерывание запроса DMA от этого периферийного устройства сопровождается адресом, который представлен каналу DMA. Если канал DMA, который отвечает на запрос, также разрешен для Периферийной Косвенной Адресации, он будет логическое ИЛИ базового адреса буфера с нулем расширил{продлил} входящий Периферийный Косвенный Адрес, чтобы создать фактический адрес смещения DPSRAM, как показано в Рисунке 22-10.