Прерывания в Xmega

Posted by Reason89 | Posted in , ,


     В семейсте Xmega добавлена разветвленная система прерываний. Дл каждого прерывания может быть задано 4 уровня приоритета прерываний(High (высокий), Medium (средний),Low (низкий) и Off (выключенный). Плюс есть несколько не маскируемых прерываний, на вроде отказа внешней частоты.
     При поступлении запроса на обслуживание прерывания с более высоким уровнем приоритета процесс обработки прерывания с более низким уровнем приостанавливается, и процессор начинает обрабатывать более значимый запрос. Запросы на прерывание, которым присвоен статус High, обслуживаются немедленно после поступления, даже если центральный процессор сильно загружен. Чтобы не пропал ни один из запросов, и все они были обслужены, пусть даже и с задержкой есть специальная процедура Round Robin , этакий своеобразный циклический алгоритм диспетчеризации.
    Общая команда для включения всех прерываний осталась неизменной:
sei();
    Далее необходимо включить все три уровня прерываний:
PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
    Соответственно если нужно включить только низкий уровень прерываний, то код упрощается:
PMIC.CTRL |= PMIC_LOLVLEN_bm
    О более конкретной настройке PMIC.CTRL можно прочесть в мануале.
    Для всех переферийных прерываний уровень приоритета выставляется отдельно, в соответствующем регистре. В качестве примера назначи прерыванию по таймеру TCC0, самый высокий уровень прерываний:
TCC0.INTCTRLA = 0x03;
    а для внешнего прерывания на порт ввода-вывода поставим самый низкий уровень прерываний:
PORTA.INTCTRL = 0x01;
    Для каждого порта может быть объявленно только 2 прерывания, int0 и int1:
PORTA.DIR = 0x00;
PORTA.INT0MASK = 0x01;
PORTA.INT1MASK = 0x02;
    Далее для корректной работы прерываний, необходимо подтянуть вывод порта:
PORTA.PIN1CTRL= PORT_OPC_WIREDANDPULL_gc;
PORTA.PIN2CTRL= PORT_OPC_WIREDANDPULL_gc;
    Так же можно настроить по какому из фронтов будет срабатывать прерывание, в качестве примера приведем срабатывание по заднему фронту:
PORTA.PIN1CTRL = PORT_ISC_FALLING_gc;
PORTA.PIN2CTRL = PORT_ISC_FALLING_gc;
     После того, как правильно настроили работу прерываний, необходимо написать обработчки этого прерывания:
ISR(PORTA_INT0_vect)
{
   //Code
}
    В Xmega огромное количество всевозможных прерываний, как по приему и передаче данных по всевозможным протоколам, так и по переполнению и совпаднию таймеров. Гибкая настройка позволяет реализовать практически любые свои потребности.



Comments (0)

Отправить комментарий