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

IEC0bits.DMA0IE = 1; // Разрешаем прерывание DMA

Установка DMA Канал 1, чтобы Получать в Непрерывном Режиме Пинг-понга:

DMA1CON = 0x0002; // непрерывный, Ping-Pong, Post-Inc., Periph-RAM

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

DMA1REQ = 0x001E; // Выбираем UART2 приёмник

DMA1PAD = (volatile unsigned int) &U2RXREG;

DMA1STA = __builtin_dmaoffset(BufferA);

DMA1STB = __builtin_dmaoffset(BufferB);

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

IEC0bits.DMA1IE = 1; // Активизировать DMA прерываниеinterrupt

DMA1CONbits.CHEN = 1; // Активизировать DMA канал

Настройка подпрограммы обработки прерывания DMA

void __attribute__((__interrupt__)) _DMA0Interrupt(void)

{

IFS0bits.DMA0IF = 0;// Очищаемфлагпрерывания DMA0;

}

void __attribute__((__interrupt__)) _DMA1Interrupt(void)

{

static unsigned int BufferCount = 0; // Keep record of which buffer contains Rx Data

if(BufferCount == 0)

{

DMA0STA = __builtin_dmaoffset(BufferA);// указываем DMA 0 дляданных

// будет передача

}

else

{

DMA0STA = __builtin_dmaoffset(BufferB); // указываем DMA 0 дляданных

// будет передача

}

DMA0CONbits.CHEN = 1;// Активизируемканал DMA0

DMA0REQbits.FORCE = 1;// Ручнойрежим: Kick-start the 1st transfer

BufferCount ^= 1;

IFS0bits.DMA1IF = 0;// Очищаемфлагпрерывания DMA1

}

11. РАБОТА UART В РЕЖИМЕ КОГДА CPU НАХОДИТСЯ В РЕЖИМЕ SLEEP И РЕЖИМЕ IDLE

11.1 Работа UART в режиме SLEEP

Когда микроконтроллер входит в режим Sleep, все источники тактовых импульсов, принадлежащие модулю UART прекращают свою работу и находятся в логическом «0». Если микроконтроллер переходит в режим Sleep в середине передачи или приёма UARTа , операция отменяется и выводы модуля UART  (BCLKx, UxRTS, и UxTX) переводятся в состояние по умолчанию.

Бит Start, когда обнаруживается на вывод  (UxRX) приёмника UART,  может пробудить устройство из режима sleep, если бит WAKE (UxMODE <7>) установлен как раз перед вводом в режим Sleep. В этом режим, если разрешено прерывание приёмника UART  (UxRXIE), то при заднем фронте на выводе приёмника UART генерируется прерывания приёмника UART (UxRXIF).

Прерывание приёмника пробуждает устройство из режима sleep, и происходит следующее:

• если назначенный приоритет для прерывания - меньше или равный текущему приоритету CPU, то устройство пробуждается и продолжает выполнение программы после командыPWRSAV которая инициализировала режим Sleep.

• если назначенный приоритетный уровень для источника прерывания больше чем текущий приоритет CPU, устройство пробуждается, и процесс пробуждения CPU начинается. Выполнение кода продолжается от первой команды обработки данного прерывания.

Бит WAKE автоматически очищается, когда происходит переход от низкого к высокому уровню (передний фронт) на линии UxRX происходит событие пробуждения (The WAKE bit is automatically cleared when a low-to-high transition is observed on the UxRX line following the wake-up event)

11.2 Работа UART в Idle режиме

Когда микроконтроллер входит  в Idle (нерабочий) режим, тактовые генераторы CPU остаются функционировать и CPU остановит выполнение программы. При помощи бита (USIDL) в регистре UART  (UxMODE <13>) можно определить будет ли продолжена работа модуля UART при переходе микроконтроллера в режим Idle или нет:

• если USIDL = 0 (UxMODE <13>), модуль продолжает работать в Idle режиме и обеспечивает полные функциональные возможности.

• если USIDL = 1 (UxMODE <13>), модуль останавливается в Idle режиме. Модуль исполняет те же самые функции когда остановлен в Idle режиме как в режиме Sleep (смотрите 11.1 Работа UART в режиме SLEEP).

Примечание 1:SyncBreak (или Wake-upSignal) символ должен иметь достаточную длину, чтобы было достаточно времени для выбранного генератора, чтобы запуститься и обеспечивать надлежащую инициализацию UART. Чтобы гарантировать, что UART проснулся вовремя, пользовательское приложение должно читайте значение бита WAKE. Если WAKE=0,когда UART не был готов вовремя, чтобы получить следующий символ и модуль, возможно, должен быть повторно синхронизирован