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)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.