Модуль Универсального Асинхронного Приёмо-передатчика (UART). Упрощённая блок схема модуля UART. Регистры управления, страница 11

Таблица 2: Регистр инициализации канала DMA для UARTа ассоциированного с ним DMA

Периферия связанная с DMA

Регистр DMAxREQ

Биты IRQSEL<6:0>

Регистр DMAxPAD Значения, чтобы читать с периферии

Регистр DMAxPAD Значения, чтобы записывать в периферию

UART1RX–UART1 Приёмник

0001011

0x0226 (U1RXREG)

UART1TX–UART1 Передатчик

0001100

0x0224 (U1TXREG)

UART2RX–UART2 Приёмник

0011110

0x0236 (U2RXREG)

UART2TX–UART2 Передатчик

0011111

0x0234 (U2TXREG)

Кроме того, UART должен быть настроен, чтобы генерировать прерывание  для каждого полученного или переданного символа. Для приёмника UARTа, чтобы генерировать прерывание приёмника для каждого полученного символа, нужно биты выбора режима прерывания (URXISEL <1:0>) установить как ‘00’ или ‘01’ в регистре статуса и управлении (UxSTA). Для передатчика UART, чтобы генерировать прерывание передатчика для каждого переданный символ, биты выбора режима прерывания передатчика (UTXISEL0 и

UTXISEL1) должен быть установлены в ‘0’ в регистре UxSTA.

Когда UART и канал DMA должным образом конфигурированы, приёмник UART делает запрос DMA, как только данные получены. Никакие другие специальные действия не должны предприниматься пользовательским приложением чтобы инициализировать перемещение DMA. Однако, передатчик UARTа делает запрос DMAа как только UART и передатчик включены. Это означает, что канал DMA и буфера должны быть инициализированы и разрешены до инициализации и активизации UART и передатчика. Альтернативно, UART и UART передатчик можно активизировать раньше, чем канал DMA активизируется. В этом случае, UART передатчик DMA запрос  будет потерян, и пользовательское приложение должно закончить просить запрос DMA передачи для настройки бита FORCE в регистре DMAxREQ.

Пример 4 показывает типовой код для приема UART и передачи при помощи канала

DMAа. UART получает и буферизует символы от гипертерминала в 9600 битах в секунду.

После того, как 8 символов получены, UART передает передаёт их назад на гипертерминал.

Канал DMA 0 конфигурирован для передачи UARTа со следующей конфигурацией:

• данные перемещаются из оперативной памяти в  UART

• режим One-Shot

• Регистр, косвенный с Постприращением

• Использование единственного  буфера

• Восемь передач в буфер

• слова Передачи

DMA Канал 1 конфигурирован для приема UARTа со следующей конфигурацией:

• данные передаются с UART в оперативную память Непрерывно

• Регистр, косвенный с Постприращением

• Использование двух буферов "пинг-понга"

• Восемь передач в буфер

• слова Передачи

Пример 4. UART Прием и Передача с DMA

Настройка  UART  для приёма и передачи:

#define FCY 40000000

#define BAUDRATE 9600

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

U2MODEbits.STSEL = 0; // 1 стоп бит

U2MODEbits.PDSEL = 0; // Без чётности, 8-ми битная передача

U2MODEbits.ABAUD = 0; // Отключаем Auto-Baud

U2BRG = BRGVAL;// BAUD Rate устанавливаем равной 9600

U2STAbits.UTXISEL0 = 0; // Прерывание происходит после каждого переданного символа

U2STAbits.UTXISEL1 = 0;

U2STAbits.URXISEL = 0; // Прерывание происходит после каждого принятого символа

U2MODEbits.UARTEN = 1; // Включаем UART

U2STAbits.UTXEN = 1; // Включаем передатчик UART

Установка DMA Канал 0, чтобы Передать в Однократном, однобуферном Режиме:

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

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

DMA0CON = 0x2001; // Однократный, Постприращение, канал «память-переферия»

DMA0CNT = 7; // 8 DMA запросов

DMA0REQ = 0x001F; // Выбор UART2 передатчик

DMA0PAD = (volatile unsigned int) &U2TXREG;

DMA0STA = __builtin_dmaoffset(BufferA);

IFS0bits.DMA0IF = 0; // Очистка флагов DMA прерываний