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

Пример 22-2: Code to Clear DMA Channel 0 Interrupt

void __attribute__((__interrupt__)) _DMA0Interrupt(void)

{

. . .

IFS0bits.DMA0IF = 0;

}

Table 22-4: Interrupt Controller Settings for Clearing DMA Interrupt Status Flags DMA

 

22.6.4 Режим регистровой косвенной адресации с постинкрементом

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

По умолчанию этом режим устанавливается после сброса контроллера DMA. Этот режим выбирается, программируя биты Выбора Способа адресации AMODE <1:0> в ‘00’ в регистре Управлении Канала DMA (DMAxCON). В этом режиме регистр Смещения Адреса Начала DPSRAM (DMAxSTA или DMAxSTB) обеспечивает стартовый адрес буфера DPSRAM.

Приложение определяет последний адрес смещения передачи DPSRAM, читая регистр Смещения Адреса Начала DPSRAM. Однако, содержание этого регистра не изменяется контроллером DMA.

Рисунок 22-8 иллюстрирует передачу данных в этом режиме.

Рисунок 22-8: Передача данных с регистровой косвенной адресацией с постинкрементом

пример 22-3: код для OutputCompare и DMA с регистровой косвенной адресацией с постприращением

Установка модуля OutputCompare 1 для режима PWM :

OC1CON = 0;                          // сброс OC модуля

OC1R = 0x60;                          // инициализация PWM Duty Cycle

OC1RS = 0x60;                                   // инициализация буфера PWM Duty Cycle

OC1CONbits.OCM = 6;                       // конфигурация OC для режима PWM

Установка канала 3 DMA для режима с постинкрементом с Timer 2 RequestSource:

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

/* вставь здесь код для инициализации BufferA с желаемым значением Duty Cycle */

DMA3CONbits.AMODE = 0;                          // конфигурация DMA для режима косвенной

// адресации с постинкрементом

DMA3CONbits.MODE = 0;                             // конфигурация DMA для Continuous mode

DMA3CONbits.DIR = 1;                                 // RAM-to-Peripheral передача данных

DMA3PAD = (volatile unsigned int)&OC1RS;             // указатель DMA на OC1RS

DMA3CNT = 31;                                             // 32 запроса DMA

DMA3REQ = 7;                                              // выбор Timer2 как источник запроса DMA

DMA3STA = __builtin_dmaoffset(BufferA);

IFS2bits.DMA3IF = 0;                         // очистка бита флага прерывания DMA

IEC2bits.DMA3IE = 1;                                    // установка бита разрешения прерывания DMA

DMA3CONbits.CHEN = 1;                              // разрешение DMA

Установка Timer 2 для OutputCompare для PWM режима:

PR2 = 0xBF;                                                   // инициализация периода PWM

T2CONbits.TON = 1;                                       // старт timer 2

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

void __attribute__((__interrupt__)) _DMA3Interrupt(void)

{

/* обновить BufferA новым значением Duty Cycle если требуется здесь*/

IFS2bits.DMA3IF = 0;                                     // очистка бита флага прерывания DMA3

}

22.6.5 Режим регистровой косвенной адресации без постинкремента

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

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