|
Понял следующие в регистры AIC_SVR0-AIC_SVR31 я загружаю адреса соответствующих обработчиков прерывания например так:
Обработчик
__irq __arm void irq0_func(void) // функция обработчика прерывания
{
int temp;
temp= AIC_IVR; //При входе в прерывания этот регистр должен быть считан
………………………………..//Здесь что нибудь делаем
………………………………
AIC_EOICR =0; // После возникновения прерывания это регистр должен быть записан
}
Главная программа
void main (void)
{
Инициализируем прерывание пины, регистры
AIC_SVR16=& irq0_func(void) // В регистр IRQ0 записываем адрес нашего обработчика прерывания.
Enable_interrupt (); // Разрешаем внешние прерывания путем обнуления битов 6,7 в регистре CPSR
}
Это вот пример программы
Как я понял это все работает
При возникновении прерывания из регистра соответствующего этому прерыванию (у меня AIC_SVR16 ) в котором содержится адрес обработчика прерывания происходит перепись в регистр AIC_IVR . Программный счетчик загружается адресом обработчика прерывания находящимся в регистре AIC_IVR . А старое содержимое программного счетчика сохраняется по адресу 0x18. После отработки программы обработчика прерывания значение программного счетчика извлекается из адреса 0x18. Я правильно понял или нет ? Мне не совсем понятно роль адреса 0x18
E-mail: info@telesys.ru