Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Имею спросить за прирывания в LPC

Отправлено колян безпарольный 30 марта 2009, г. 23:26


картина маслом, инициалирую прерывания так:

VICIntSelect = 0; // Все каналы на IRQ
VICIntEnClear = 0xFFFFFFFF; // Все запретить
VICSoftIntClear = 0xFFFFFFFF; // Все очистить
VICProtection = 0; // VIC registers can be accessed in User or privileged mode
VICVectAddr = 0; // Все очистить
VICDefVectAddr = 0; // Очистить адрес ISR для non-vectored
// Clear address of the Interrupt Service routine (ISR) for vectored IRQs.
VICVectAddr0= VICVectAddr1= VICVectAddr2= VICVectAddr3= \
VICVectAddr4= VICVectAddr5= VICVectAddr6= VICVectAddr7 = \
VICVectAddr8= VICVectAddr9= VICVectAddr10=VICVectAddr11 = \
VICVectAddr12=VICVectAddr13=VICVectAddr14=VICVectAddr15 = 0;
// Disable all vectored IRQ slots
VICVectCntl0 =VICVectCntl1 =VICVectCntl2 =VICVectCntl3 = \
VICVectCntl4 =VICVectCntl5 =VICVectCntl6 =VICVectCntl7 = \
VICVectCntl8 =VICVectCntl9 =VICVectCntl10 =VICVectCntl11 = \
VICVectCntl12 =VICVectCntl13 =VICVectCntl14 =VICVectCntl15 = 0;
}

Настраиваю его на таймер 0, совпадение по T0MR0

VICIntSelect &= ~(1 << VIC_TIMER0); // IRQ on RTC line.
VICIntEnable |= (1 << VIC_TIMER0);

Сам обработчик такой

__irq __arm void IRQ_Handler (void)
{ if (T0IR_bit.MR0INT==1)
{T0IR_bit.MR0INT=1;
if (++c0&0x01) IO0SET=(1<<31);
else IO0CLR=(1<<31);
}
}

Всё работает, лампочка в 31вом порту моргает.
Но имею желание сделать как положенно, через адресные регистры.
Инициализация таже, прерывания настраиваю так

void VICT0init(void)
{ /*ПРЕРЫВАНИЯ*/
VICIntSelect &= ~(1 << VIC_TIMER0); // IRQ on RTC line.
VICVectAddr0 = (unsigned int) & TIMER0_ISR;
VICVectCntl0 = 0x20 | VIC_TIMER0; // Enable vector interrupt for RTC.
VICIntEnable |= (1 << VIC_TIMER0);
}

функция

void TIMER0_ISR()
{ if (T0IR_bit.MR0INT==1)
{T0IR_bit.MR0INT=1;
if (++c0&0x01) IO0SET=(1<<31);
else IO0CLR=(1<<31);
}
}

А вектор взял в точности как в примере из IARа или из борды

__irq __arm void IRQ_ISR_Handler (void)
{
void (*interrupt_function)();
unsigned int vector;

vector = VICVectAddr; // Get interrupt vector.
interrupt_function = (void(*)())vector;
(*interrupt_function)(); // Call vectored interrupt function.

VICVectAddr = 0; // Clear interrupt in VIC.
}

Ну и хрена лысого. Неработает. Мож чего незнал незнал и забыл?


Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 2 на три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru