картина маслом, инициалирую прерывания так:
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.
}
Ну и хрена лысого. Неработает. Мож чего незнал незнал и забыл?