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