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