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

DMA0REQ = 0x22;                                         // выбор ECAN1 Rx как источника запроса DMA

IEC0bits.DMA0IE = 1;                                    // разрешить прерывание канала0 DMA

DMA0CONbits.CHEN = 1;                              // разрешить канал0 DMA

установка обслуживания прерывания DMA :

void __attribute__((__interrupt__)) _DMA0Interrupt(void)

{

ProcessData(Ecan1Rx[C1VECbits.ICODE]);    // обработка приемного буфера;

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

}

DMA 22

Figure 22-14: Data Transfer from ECAN with Register Indirect Addressing

22.6.7 Однократный Режим

Однократный режим используется программой, когда повторяющаяся передача данных не требуется.

Однократный режим выбирается, установкой битов Выбора Режима Операций (MODE <1:0>) в ‘x1’ в регистре Управления Канала DMA (DMAxCON). В этом режиме, когда весь блок данных перемещен (длина блока как определено в DMAxCNT ) канал автоматически запрещается (то есть, бит CHEN в регистре Управления Канала DMA (DMAxCON) очищается аппаратно). Рисунок 22-15 иллюстрирует режим One-Shot.

Рис 22-15: Передача блока данных в однократном режиме

Если установлен бит HALF в регистре Управления Канала DMA (DMAxCON) и установлен бит DMAxIF (и прерывание DMA сгенерировано, если разрешено программой), когда половина пересылки блока данных закончена, то канал остается разрешенным. Когда вся пересылка блока закончена, флажок прерывания не устанавливается и канал автоматически запрещается. См. Раздел 22.6.3" Полный или Половину Прерываний Поблочной пересылки” для информации относительно того, как установить канал DMA, чтобы прервать на половине и на полной пересылке блока.

Если каналу вновь дает возможность установка CHEN в DMAxCON к ‘1’, поблочная пересылка имеет место от адреса начала, как предусмотрено регистрами Адреса Начала Смещения DPSRAM (DMAxSTA и DMAxSTB). Пример 22-9 иллюстрирует код для операции One-Shot.

Пример 22-9: код для UART и DMA в One-ShotMode

установка UART для Rx и Tx:

#define FCY 40000000

#define BAUDRATE 9600

#define BRGVAL ((FCY/BAUDRATE)/16)-1

U2MODEbits.STSEL = 0;                    // 1-stop bit

U2MODEbits.PDSEL = 0;                    // No Parity, 8-data bits

U2MODEbits.ABAUD = 0;                  // Autobaud Disabled

U2BRG = BRGVAL;                           // BAUD Rate Setting for 9600

U2STAbits.UTXISEL0 = 0;      // прерывание после передачи 1 символа

U2STAbits.UTXISEL1 = 0;

U2STAbits.URXISEL = 0;                   // прерывание после приема 1 символа

U2MODEbits.UARTEN = 1;                // Enable UART

U2STAbits.UTXEN = 1;                      // Enable UART Tx

установка DMA канала 0 для передачи в однократном однобуферном режиме:

unsigned int BufferA[8] __attribute__((space(dma)));

unsigned int BufferB[8] __attribute__((space(dma)));

DMA0CON = 0x2001;             // One-Shot, Post-Increment, RAM-to-Peripheral

DMA0CNT = 7;                                   // 8 DMA requests

DMA0REQ = 0x001F;             // Select UART2 Transmitter

DMA0PAD = (volatile unsigned int) &U2TXREG;

DMA0STA = __builtin_dmaoffset(BufferA);

IFS0bits.DMA0IF = 0;              // Clear DMA Interrupt Flag

IEC0bits.DMA0IE = 1;                         // Enable DMA interrupt

установка DMA канала 1 дляприемавповторяющемся Ping-Pong режиме:

DMA1CON = 0x0002;             // Continuous, Ping-Pong, Post-Inc., Periph-RAM

DMA1CNT = 7;                                   // 8 DMA requests

DMA1REQ = 0x001E;             // Select UART2 Receiver

DMA1PAD = (volatile unsigned int) &U2RXREG;

DMA1STA = __builtin_dmaoffset(BufferA);

DMA1STB = __builtin_dmaoffset(BufferB);

IFS0bits.DMA1IF = 0;              // Clear DMA interrupt

IEC0bits.DMA1IE = 1;                         // Enable DMA interrupt

DMA1CONbits.CHEN = 1;                  // Enable DMA Channel

установка DMA Interrupt Handlers:

void __attribute__((__interrupt__)) _DMA0Interrupt(void)