Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Шрифт:
2. Каково различие между маскируемыми и немаскируемыми прерываниями?
Ответ: Немаскируемое прерывание не может быть запрещено программистом. Напротив, маскируемое прерывание может быть многократно разрешено и запрещено в ходе исполнения прикладной программы.
3. Каково различие между прерываниями по входам
Ответ: И
4. Как организовать подсистему прерывания с несколькими внешними запросами для МК семейства 68HC12/HCS12, используя лишь один вход внешнего прерывания
Ответ: Вход внешнего прерывания
4.10.3. Вектора исключений
При переходе микроконтроллера в состояние прерывания или сброса должна реализовываться некоторая внутренняя последовательность действий, которая приведет к изменению текущего состояния счетчика команд центрального процессора, т.е. к исключению. Последнее вызовет исполнение подпрограммы прерывания или программного фрагмента начального запуска МК. Причем и подпрограмма прерывания, и программный фрагмент начального запуска должны быть разными и соответствовать тому событию, которое вызвало конкретное исключение. Другими словами, МК должен обладать аппаратными средствами, которые позволят ему начать программу с адреса, который определяется источником исключения.
В МК семейства 68HC12/HCS12 начальные адреса подпрограмм прерывания и начального запуска располагаются в специальной области памяти, которая называется таблицей векторов прерывания. Таблица векторов прерывания размещается в последних 128 ячейках резидентной линейно адресуемой Flash памяти программ. Это означает, что независимо от того, каким реальным объемом резидентного ПЗУ обладает конкретная модель МК, имеет или не имеет этот МК страничную адресацию памяти программ, таблица векторов прерывания будет помещена в адресном пространстве $FF80…$FFFF. Причем, не все 128 ячеек памяти могут быть заняты векторами исключений. Объем таблицы векторов определяется числом источников прерываний и сброса в конкретной модели МК.
Адреса вектора | Источник исключения | Глобальная маска в регистре CCR | Биты разрешения прерывания в регистрах специальных функций | Значение регистра HPRIO для установления наивысшего уровня приоритета | |
---|---|---|---|---|---|
Регистр | Бит | ||||
$FFFE, $FFFF | Внешний сброс | нет | нет | нет | — |
$FFFC, $FFFD | Сброс от системы тактирования нет | COPCTL | CME, FCME | — | |
$FFFA, $FFFB | COP | нет | нет | COP rate selected | — |
$FFF8, $FFF9 | Сброс по несуществующему коду команды | нет | нет | нет | — |
$FFF6, $FFF7 | Программное прерывание SWI | нет | нет | нет | — |
$FFF4, $FFF5 | Внешнее прерывание XIRQ | X | нет | нет | — |
$FFF2, $FFF3 | Внешнее прерывание IRQ | I | INTCR | IRQEN | $F2 |
$FFF0, $FFF1 | Метки реального времени RTI | I | RTICTL | RTIE | $F0 |
$FFEE, $FFEF | Канал 0 таймера | I | TMSK1 | C0I | $EE |
$FFEC, $FFED | Канал 1 таймера | I | TMSK1 | C1I | $EC |
$FFEA, $FFEB | Канал 2 таймера | I | TMSK1 | C2I | $EA |
$FFE8, $FFE9 | Канал 3 таймера | I | TMSK1 | C3I | $E8 |
$FFE6, $FFE7 | Канал 4 таймера | I | TMSK1 | C4I | $E6 |
$FFE4, $FFE5 | Канал 5 таймера | I | TMSK1 | C5I | $E4 |
$FFE2, $FFE3 | Канал 6 таймера | I | TMSK1 | C6I | $E2 |
$FFE0, $FFE1 | Канал 7 таймера | I | TMSK1 | C7I | $E0 |
$FFDE, $FFDF | Переполнение счетчика таймера | I | TMSK1 | TOI | $DE |
$FFDC, $FFDD | Переполнение счетчика внешних событий | I | PACTL | PAOVI | $DC |
$FFDA, $FFDB | Событие на входе счетчика внешних событий | I | PACTL | PAI | $DA |
$FFD8, $FFD9 | Контроллер SPI | I | SP0CR1 | SPIE | $D8 |
$FFD6, $FFD7 | Контроллер SCI | I | SP0CR2 | TIE, TCIE, RIE, ILIE | $D6 |
$FFD4, $FFD5 | зарезервирован | I | — | — | $D4 |
$FFD2, $FFD3 | Модуль ATD | I | ATDCTL2 | ASCIE | $D2 |
$FFD0, $FFD1 | Модуль BDLC | I | BCR1 | IE | $D0 |
$FF80, $FFC1 | зарезервирован | I | — | — | $80–$C0 |
$FFC2, $FFC9 | зарезервирован | I | — | — | $C2–$C8 |
$FFCA, $FFCB | Переполнение счетчика внешних событий B | I | PBCTL | PBOVI | $CA |
$FFCC, $FFCD | Переполнение счетчика | I | MCCTL | MCZI | $CC |
$FFCE, $FFCF | зарезервирован | I | — | — | $CE |
Рис. 4.17. Таблица
На рис. 4.17 приведен формат таблицы векторов прерываний для МК B32. В первой колонке приведены адреса двух ячеек памяти, в которых должен располагаться двухбайтовый адрес начала подпрограммы прерывания или сброса. Во второй колонке указан источник события исключения, подпрограмма обслуживания которого должна начинаться с адреса, записанного в соответствующих ячейках памяти. Если, например, на входе внешнего запроса
Рис. 4.18. Формат регистра INTCR
Внимательный читатель должен был заметить, что адреса ячеек памяти, в которых располагаются вектора исключений, находятся в защищенной области памяти. Эту область памяти невозможно стереть и затем занести в нее новые вектора. Для того чтобы программист в процессе отладки все-таки имел возможность использования подсистемы прерывания с произвольными векторами входа в подпрограммы, в отладочном режиме работы МК семейства 68HC12/HCS12 используют дополнительную таблицу векторов, которая располагается в незащищенной области памяти. Соответствие адресов таблиц векторов прерывания в отладочном и пользовательском режиме работы приведено на рис. 4.19. На рис. 4.19 представлены альтернативные адреса размещения векторов прерываний для МК MC68HC912B32. В других моделях МК альтернативная таблица может располагаться в области ОЗУ, поскольку она предназначена только для целей отладки.
Адреса вектора | Источник исключения | Адрес передачи управления |
---|---|---|
$FFC0–$FFCF | зарезервирован | $F7C0–$F7CF |
$FFD0 | Модуль BDLC | $F7D0 |
$FFD2 | Модуль ATD | $F7D2 |
$FFD4 | зарезервирован | $F7D4 |
$FFD6 | Контроллер SCI | $F7D6 |
$FFD8 | Контроллер SPI | $F7D8 |
$FFDA | Событие на входе счетчика внешних событий | $F7DA |
$FFDC | Переполнение счетчика внешних событий | $F7DC |
$FFDE | Переполнение счетчика таймера | $F7DE |
$FFE0 | Канал 7 таймера | $F7E0 |
$FFE2 | Канал 6 таймера | $F7E2 |
$FFE4 | Канал 5 таймера | $F7E4 |
$FFE6 | Канал 4 таймера | $F7E6 |
$FFE8 | Канал 3 таймера | $F7E8 |
$FFEA | Канал 2 таймера | $F7EA |
$FFEC | Канал 1 таймера | $F7EC |
$FFEE | Канал 0 таймера | $F7EE |
$FFF0 | Метки реального времени RTI | $F7F0 |
$FFF2 | Внешнее прерывание IRQ | $F7F2 |
$FFF4 | Внешнее прерывание XIRQ | $F7F4 |
$FFF6 | Программное прерывание SWI | $F7F6 |
$FFF8 | Сброс по несуществующему коду команды | $F7F8 |
$FFFA | COP | $F7FA |
$FFFC | Сброс от системы тактирования | $F7FC |
$FFFE | Внешний сброс | $F7FE |
Рис. 4.19. Таблица адресов, которым передается управление исключениями в пользовательском и отладочном режимах работы МК
4.10.4. Система приоритетов для исключений
Среди представленного множества событий, которые могут вызвать исключения, ряд событий обладают большей значимостью для системы, чем другие. В микропроцессорной технике значимость события характеризуют термином «приоритет». События большей значимости обладают более высоким приоритетом. Рассматривая множество исключений для 68HC12/HCS12, можно отметить, что все немаскируемые источники исключений по умолчанию наделены более высоким приоритетом, нежели маскируемые. Поэтому, если в один и тот же момент времени поступят два запроса, то первым будет обслужен немаскируемый запрос, который обладает более высоким приоритетом. Затем будет выполнена подпрограмма обслуживания запроса с низшим приоритетом, в нашем случае этот запрос маскируемый.
Немаскируемые запросы исключений также ранжируются по приоритету. В приведенном ниже списке приоритет событий снижается с увеличением номера записи:
1. Внешний сброс по входу
2. Сброс по монитору системы тактирования;
3. Сброс по переполнению сторожевого таймера COP;
4. Программное прерывание SWI;
5. Немаскируемое прерывание по входу
Очередность приоритетов маскируемых прерываний отображена на рис. 4.17. Чем выше строка источника события в таблице векторов, тем выше его приоритет. Однако приоритет маскируемого прерывания может быть повышен посредством записи соответствующей комбинации битов в регистр уровня приоритета HPRIO. Код, который следует записать в регистр HPRIO для назначения выбранному источнику запросов наивысшего приоритета среди маскируемых прерываний, приведен в последней колонке таблицы рис. 4.17. Следует помнить, что изменение кода в регистре HPRIO возможно только при единичном значении глобальной маски прерываний I, т.е. когда маскируемые прерывания запрещены. После повышения уровня прерывания какого либо запроса остальные источники запросов сохраняют приведенное в таблице векторов прерываний рис. 4.17 распределение приоритетов.