реклама на сайте
подробности

 
 
> IRQ, Как подкючить канал перываний к слоту прерыванй
Novichok1
сообщение Jul 23 2009, 09:53
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Разбираюсь с LPC2478, после прочтения соответствующей литературы сложилось некоторое представление о настройке IRQ прерываний:
есть некотроый канал прерываний, по которому некое устройство шлет свои прерывания,
есть модуль VIC со своими слотами, причем у каждого слота есть регистр адреса обработчика прерывания VICVectAddrxx(это понятно), и регистр упраления вектором VICVectCntrlxx, у котрого имеется два поля: номер канала и флаг разрешения прерывания, причем последнее наверное состоит из одного млашего бита.
Так вот, хотелось бы знать, верно ли мое представление, и откуда брать номер канала прерывания для различных устройств.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Novichok1
сообщение Jul 24 2009, 06:19
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Все, вроде понимание появилось, но прерывания все-равно не хотят работатьsad.gif
Подскажите пожалуйста, что делаю не так, или чего не хватает?

Настраиваю прерывания IRQ таким образом

Код
void Irq_init
{
        PINSEL0 = 0x00100000; // Настраиваю пин P2.10 на внешнее прерывание EINT0
      VICIntSelect &= ~0x00004000; // Настраиваю прерывание по слоту 14 как IRQ
      VICIntEnable |= 0x00004000; // Делаю это прерывание доступным
      VICVectCntl14 = 0x05; // Настраиваю приоритет прерывания (наверное)
      VICVectAddr14 = (tU32)Irq_Handler; // Указываю адрес обработчика
}

void Irq_Handler(void) __attribute__((interrupt("IRQ"))); // Указываю компилятору, что это IRQ- обработчик

Собственно, обработчик:
void Irq_Handler(void)
{
    FIO2DIR |= P2i00;
    FIO2SET |= P2i00; // Мигаю светодиодом

        EXTINT = 0x00000002;//Clear the peripheral interrupt flag
        VICVectAddr = 0x00000000;//Dummy  write to signal end of interrupt
}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Jul 24 2009, 06:43
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Похоже, что в обработчике проблема точно есть (независимо от того, вызывается он или нет smile.gif ). Мигание светодиодом означает его переодическое включение и отключение, а у Вас на каждом шаге только включение - он должен просто гореть.
Go to the top of the page
 
+Quote Post
Novichok1
сообщение Jul 24 2009, 06:45
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Ну да, согласен- описался- включение светодиода, не миганиеsmile.gif
Ну так он же и не горит, зараза!
Go to the top of the page
 
+Quote Post
espectro
сообщение Jul 24 2009, 08:21
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 17-02-08
Пользователь №: 35 137



Novichok1, пишите в ИАРе?
Go to the top of the page
 
+Quote Post
Novichok1
сообщение Jul 24 2009, 08:25
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Нет, пользуюсь GNUARM.
Go to the top of the page
 
+Quote Post
Novichok1
сообщение Jul 24 2009, 10:38
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 73
Регистрация: 8-07-09
Пользователь №: 51 032



Ну как всегда, все дело в невнимательности и мелких мелочах.
Во-первых не PINSEL0, а PINSEL4.
Во-вторых в конфиге нужно было прописать
#define IRQ_HANDLER 1
вместо
#define IRQ_HANDLER 0.

Сообщение отредактировал Novichok1 - Jul 24 2009, 10:39
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 23:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.06811 секунд с 7
ELECTRONIX ©2004-2016