Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

на рисунке 1.11.1. Назначать один и тот же источник прерывания нескольким слотам не рекомендуется, хотя практически это возможно и допустимо. Если такое произошло, то использоваться будет слот с меньшим номером.

Регистры VICVectAddr0–15 задают адрес обработчика прерывания для каждого слота.

Регистр VICVectAddr автоматически загружается адресом обработчика из VICVectAddr0–15 при запросе прерывания. Содержимое регистра используется командой LDR по адресу 0x00000018 для передачи управления обработчику прерывания.

Регистр VICDefVectAddr — адрес обработчика невекторных прерываний. Если прерывание разрешено через VICIntEnable, не классифицировано как FIQ через VICIntSelect, но не ассоциировано ни с одним из 16 слотов через VICVectCntl0–15, оно считается невекторным. В этом случае управление будет передано по адресу, записанному в VICDefVectAddr. Невекторные прерывания используют, если все слоты заняты. При обработке невекторного прерывания его источник идентифицируется через регистр VICIRQStatus.

Регистр VICProtection содержит единственный управляющий бит (рисунок 1.11.1). Установка единицы разрешает управление прерываниями только в привилегированных режимах. В режиме User управление прерываниями становится запрещено.

1.11.5 Порядок настройки прерывания IRQ

В ходе настройки системы прерываний рекомендуется придерживаться следующего порядка действий.

1.Принять решение о том, какой из свободных слотов (0–15) будет использоваться для данного источника прерывания.

2.Записать адрес обработчика прерывания в регистр VICVectAddr0– 15, соответствующий выбранному слоту, например для слота 0

VICVectAddr0 = (unsigned) Имя процедуры-обработчика ;

3. Назначить выбранному слоту источник прерывания

VICVectCntl0 = 0x20 | Номер источника ;

Под номером понимается десятичное число (номер источника или номер разряда на рисунке 1.11.1).

4.Настройка по пунктам 1–3 повторяется для каждого источника.

5.Включить прерывание от данного источника

VICIntEnable = Маска источника ;

Под маской понимается двоичный код с единицами в разрядах, соответствующих разрешенным прерываниям (рисунок 1.11.1).

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

Порядок настройки невекторного прерывания IRQ:

1. Аналогично пункту 2 для векторного прерывания поместить адрес обработчика в регистр VICDefVectAddr.

45

2. Аналогично пункту 5 для векторного прерывания разрешить обработку прерывания от данного источника через регистр VICIntEnable.

1.11.6 Порядок настройки быстрого прерывания FIQ

1. Классифицировать прерывание от данного источника, как быстрое прерывание FIQ. Установить единицу в разряд регистра VICIntSelect, соответствующий данному источнику

VICIntEnable = Маска источника ;

2.Включить прерывание от данного источника

VICIntEnable = Номер источника ;

3.Внести изменения в код инициализации Startup.s. Заменить строку

FIQ_Handler

B

FIQ_Handler

на

 

 

IMPORT

FIQ_Handler

В дальнейшем использовать имя FIQ_Handler для процедуры-обработчика прерывания. Заголовок процедуры-обработчика должен быть таким:

irq void FIQ_Handler ()

Имя подпрограммы может быть произвольным, но должно совпадать c именем после директивы IMPORT.

1.11.7 Процедура обработки прерывания

Процедура обработки прерывания на языке Си, ориентированном на использование компилятора RealView 4 создается по шаблону:

irq void Имя_функции()

{

...

Регистр = Код ; // Сброс флага запроса прерывания

VICVectAddr=0;

}

Строка «Сброс флага запроса прерывания» обращается к регистру управления периферийным устройством, вызвавшим прерывание. Например, для таймера 0 это

T0IR=1;

Если сброс флага не произвести, запрос прерывания останется активным и обработка прерывания начнет повторяться циклически.

1.11.8 Задержка обработки прерывания

В микроконтроллерах семейства LPC21xx задержка при передаче управления обработчику прерывания сравнительно велика. Минимальное время от появления запроса прерывания до выполнения первой команды обработчика составляет 12 тактов для FIQ и 13 тактов для IRQ. Максимальное время реакции на запрос на 20 тактов больше минимального. Дополнительные 20 тактов определяются временем, необходимым для завершения команды, с выполнением которой совпал запрос прерывания, такой как

46

LDMFA

R0, {R0-R15}

Выполнение первой эффективной команды будет отложено еще на несколько тактов, необходимых для сохранения в стек регистров общего назначения такой командой, как

STMDB

R13!, { ... }

Затраты времени на сохранение регистров зависят от их числа. На 13 регистров R0–R13 уходит 14 тактов.

Таким образом, задержка обработки прерывания IRQ может варьировать от 13 до тактов; для FIQ задержка варьирует от 12 до

46тактов.

Вкачестве подтверждения приведем результат простого эксперимента. На вход запроса прерывания EINT3 поступают периодические импульсы от генератора. Обработчик прерывания по внешнему сигналу в ответ формирует короткий одиночный импульс. Интервал времени между фронтами импульсов от генератора и ответного, формируемого микроконтроллером, соответствует задержке обработки прерывания.

Листинг программы приведен в приложении А. Отметим, что тактовая частота микроконтроллера равна 12 МГц, умножитель отсутствует, обращение к портам выполняется через высокоскоростную шину.

На рисунке 1.11.2 приведено семейство осциллограмм, записанных многократно в случайные моменты времени. Жирным пунктиром выделены импульсы, соответствующие самой короткой и самой длинной задержкам.

Задержка в 21 такт для IRQ складывается из тринадцати базовых, трех, затраченных на сохранение регистров R0–R1 и пяти на вывод в порт.

Рисунок 1.11.2 – Осциллограммы импульсов, показывающих временную задержку обработки прерывания IRQ (вверху) и FIQ (внизу)

47