6.2. Прерывания
(Руководство разработчика по микроконтроллерам семейства HCS08)Модуль внешнего прерывания IRQ — это модуль в составе процессорного ядра МК. Модуль IRQ имеет собственный выделенный вектор прерывания, который обладает одним из наивысших приоритетов. Аппаратные средства модуля способны детектировать запросы на прерывание в статическом и динамическом режимах.
Модуль IRQ очень прост в использовании. Если соответствующий вывод МК сконфигурирован для работы в качестве входа внешнего прерывания (IRQPE = 1), то можно установить режим его работы. Различают статический и динамический режимы генерации запросов на прерывание.
В статическом режиме (бит IRQMOD = 1) запрос генерируется, если на входе IRQ установлен активный уровень сигнала. Например, для модуля IRQ назначили статический режим работы и НИЗКИЙ активный уровень сигнала. Тогда при подаче на вход IRQ логического 0 будет сгенерирован запрос на прерывание. Центральный процессор выполнит подпрограмму прерывания и вернется к исполнению основной программы. Если на входе IRQ все еще будет удерживаться активный НИЗКИЙ уровень, то модуль IRQ сгенерирует новый запрос, и подпрограмма прерывания будет выполнена вторично. Таким образом, в статическом режиме генерация запроса на прерывание будет продолжаться до тех пор, пока на входе IRQ не установится высокий неактивный уровень сигнала запроса. В англоязычной литературе этот режим называют «Edge and Level Sensitivity».
В динамическом режиме (бит IRQMOD = 0) запрос генерируется, если уровень сигнала на входе IRQ изменился с неактивного на активный. Например, для модуля IRQ назначили динамический режим работы и НИЗКИЙ активный уровень сигнала. Тогда при изменении на входе IRQ сигнала с 1 на 0 будет сгенерирован запрос на прерывание. Центральный процессор выполнит подпрограмму прерывания и вернется к исполнению основной программы. Новый запрос не будет сгенерирован, даже если на входе IRQ все еще будет удерживаться низкий активный уровень. Таким образом, в динамическом режиме генерация запроса на прерывание будет выполнена только один раз, независимо от длительности активного уровня сигнала запроса. В англоязычной литературе этот режим называют «Edge only Sensitivity».
Важно отметить, что в обоих режимах работы длительность сигнала запроса должна быть такой, чтобы центральный процессор успел перейти к исполнению подпрограммы прерывания. Если при установленном сигнале запроса ЦП не перешел в прерывание и запрос был снят, то запрос не запоминается и подпрограмма прерывания не исполняется.
Большинство МК из семейства HCS08 (кроме QA и QG) позволяют выбрать активный уровень и фронт, по которым модуль IRQ будет детектировать внешний запрос на прерывание. Если бит IRQEDG регистра IRQSC установить в 1, то активными будут ВЫСОКИЙ уровень и нарастающий фронт внешнего сигнала; если бит установить в 0 — то НИЗКИЙ уровень и спадающий фронт.
После того, как работа модуля IRQ была разрешена посредством установки бита IRQF в регистре IRQSC, аппаратные средства модуля осуществляют непрерывный мониторинг уровня сигнала на выводе IRQ. При регистрации выбранного фронта/уровня на входе IRQ, устанавливается флаг запроса IRQF в регистре управления и состояния IRQSC, и генерируется запрос на прерывание в ЦП. Для сброса флага IRQF необходимо записать 1 в бит подтверждения IRQACK того же регистра.
Чтобы сигнал внешнего прерывания был обработан должным образом, необходимо, чтобы длительность импульса на входе IRQ была не менее 100нс при отключенной системе тактирования МК и не менее полутора периодов частоты BUSCLK во время работы системы тактирования.
Сразу после разрешения работы модуля внешнего прерывания ко входу IRQ автоматически подключается подтягивающий резистор: верхний — при выборе режима детектирования нарастающего фронта и ВЫСОКОГО уровня и нижний — для режима детектирования НИЗКОГО уровня и спадающего фронта.
Таблица6.2. Режимы детектирования сигнала внешнего запроса
Биты регистра IRQSC | Сигнал IRQ, при котором устанавливается флаг IRQF | |
---|---|---|
IRQMOD | IRQEDG | |
0 | 0 | Спадающий фронт |
0 | 1 | Нарастающий фронт |
1 | 0 | Спадающий фронт или НИЗКИЙ уровень |
1 | 1 | Нарастающий фронт или ВЫСОКИЙ уровень |
Во всех моделях МК, кроме серий AW, GB, GT и Rx, внутренние подтягивающие резисторы можно отключить с помощью бита IRQDD регистра IRQSC.
В следующем примере рассмотрены принципы программного обслуживания внешнего прерывания IRQ. Это модифицированная версия Примера 6.2, в которой для изменения состояния светодиода используется клавиша RESET. После первого нажатия светодиод начнет мигать, после второго — перестает мигать.
Пример 6.3. Мигающий светодиод с управлением по входу внешнего прерывания IRQ
//КатодсветодиодаLED1соединенсPTB6
//КнопкаRESETсоединенасPTA5
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedcharblinking=0;
//ФункцияобработкивнешнегопрерыванияповходуIRQ
voidinterruptVectorNumber_VirqIRQ_isr()
{
IRQSC_IRQACK=1;//ПодтверждениепрерыванияпоIRQ(сбросфлагаIRQF)
blinking=!blinking;//Изменитьсостояниепеременнойрежимаработысветодиода
//ПрерываниепоIRQзапрещаетсядлязащитыотмеханическогодребезгаконтактов
IRQSC_IRQIE=0;//ЗапретитьпрерываниеотIRQ
}
voidmain(void)
{
unsignedinttemp;
SOPT1=bBKGDPE;//ИнициализациярегистраSOPT1,разрешитьотладкупоBKGD
PTADD=0;//ВселинииPTAнаввод
PTBDD=0xFE;//ЛинияPTB0наввод,остальныелиниипортаPTB—навывод
PTBD=0xC0;/*ВыключитьсветодиодыLED1иLED2(тожеприсутствуетна
плате),установитьв0остальныелиниипортаPTB*/
PTAPE=BIT_5;//ПодключитьподтягивающийрегистрдляPTA5
IRQSC=bIRQPE|bIRQIE;//РазрешитьпрерыванияпоIRQ
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
if(blinking)
{
PTBD_PTBD6=0;//Светодиодвключен
for(temp=3000;temp;temp--);//Программнаязадержка
PTBD_PTBD6=1;//Светодиодвыключен
for(temp=30000;temp;temp--);//Программнаязадержка
}
IRQSC_IRQIE=1;//РазрешитьпрерыванияпоIRQ
}
}
Приведем некоторые комментарии к этому примеру:
- В МК семейства QG модуль IRQ может детектировать только спадающий фронт и/или НИЗКИЙ активный уровень сигнала.
- В данном примере переменная blinking — глобальная, поскольку ее необходимо изменять вне функции main().
- В этом примере прерывание запрещается в самой подпрограмме прерывания IRQ_isr() и снова разрешается лишь в конце очередного цикла программы main. Такой прием в данном конкретном случае применяется для борьбы с механическим дребезгом кнопки.
- МК семейства HCS08 допускают одновременный сброс флага IRQF и запрет работы модуля внешнего прерывания:
IRQSC = bIRQPE | bIRQACK; // Подтвердить прерывание по IRQ и запретить функцию
// внешнего прерывания для линии IRQ
В таком случае код ISR будет выглядеть так:
void interrupt VectorNumber_Virq IRQ_isr() {
IRQSC = bIRQPE | bIRQACK;
blinking = Iblinking; // Инвертировать переменную blinking
}
В следующем примере показана реализация счетчика событий по входу IRQ. Программа считает количество спадающих фронтов на входе IRQ без защиты от дребезга сигнала на входе.
Пример 6.4. Счетчик событий по входу внешнего прерывания IRQ
//СветодиодыподключеныкпортуPTC
//КнопкаRESET/IRQсоединенасPTA5
#include
#include"derivative.h"/*includeperipheraldeclarations*/
#include"hcs08.h"//Этонашфайлсобъявлениями!
unsignedcharcounter=0;
//ФункцияобработкивнешнегопрерыванияпоIRQ
voidinterruptVectorNumber_VirqIRQ_isr()
{
IRQSC_IRQACK=1;//ПодтверждениепрерыванияпоIRQ(сбросфлагаIRQF)
counter++;//Увеличитьпрограммныйсчетчикcounterна1
}
voidmain(void)
{
SOPT1=bBKGDPE;//ИнициализациярегистраSOPT1,разрешитьотладкупоBKGD
PTCDD=0xFF;//ЛиниипортаPTC–навывод
PTEDD=BIT_7|BIT_6;//ЛинииPTE7иPTE6–навывод
PTAPE=BIT_5;//ВключитьподтягиваюшийрезистордляPTA5
IRQSC=bIRQPE|bIRQIE;//РазрешитьпрерыванияпоIRQ
EnableInterrupts;//РазрешитьпрерыванияЦП(CCR:I=0)
while(1)
{
PTCD=~counter;/*Отобразитьнасветодиодахсостояниесчетчикакоманд.
ДляэтоговывестинапортPTCпобитовуюинверсиюcounter*/
PTED_PTED7=PTCD_PTCD7;//PTE7=PTC7
PTED_PTED6=PTCD_PTCD6;//PTE6=PTE6
}
}
6.2.1.1. Регистр управления IRQSC
Регистр | Режим | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|
IRQSC | Чтение | 0 | IRQDD | IRQEDG | IRQPE | IRQF | 0 | IRQ1E | IRQMOD |
Запись | — | — | IRQACK | ||||||
Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Описание битов:
Имя бита | Описание | Символ в языке С |
---|---|---|
IRQDD | Включение подтягивающего резистора для входа IRQ: 0 — подтягивающий резистор подключен; 1 — подтягивающий регистр отключен. Бит недоступен в микроконтроллерах серий AW, GB, GT, и Rx! | bIRQDD |
IRQEDG | Выбор активного уровня, по которому будет детектироваться запрос: 0 — спадающий фронт и/или НИЗКИЙ уровень; 1 — нарастающий фронт и/или ВЫСОКИЙ уровень. Этот бит недоступен в микроконтроллерах серий QA и QG! | bIRQEDG |
IRQPE | Бит разрешения линии IRQ в качестве входа запроса на прерывание: 0 — линия IRQ активирована. 1 — линия IRQ не действует. | bIRQPE |
IRQF | Флаг события запроса внешнего прерывания: 0 — запроса на прерывание нет; 1 — запрос на прерывание поступил. Бит доступен только для чтения! | bIRQF |
IRQACK | Бит подтверждения запроса о прерывании: 0 — не дает никакого эффекта; 1 — очистка триггера запроса на прерывание IRQF. | bIRQACK |
IRQIE | Разрешение прерываний от модуля IRQ: 0 — прерывания от модуля запрещены; 1 — прерывания от модуля разрешены. | bIRQIE |
IRQMOD | Режим детектирования сигнала запроса: 0 — динамический режим; 1 — статический режим. | bIRQMOD |
Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>