Коллеги, прошу помощи, всю голову уже сломал.
Необходимо прерывание по таймеру. Инициализирую AIC, инициализирую и запускаю таймер. Таймер считает. Но обработчик прерывания не вызывается, не смотря на то, что я в IARe вижу, что в AIC_IPR (pending register) выставляется соответствующий бит.
Кусок программы:
CODE
volatile uDWORD temp = 0;
void Timer0_Handler()
{
temp++;
AT91C_BASE_AIC -> AIC_EOICR = 1;
}
void main()
{
AT91C_BASE_PMC -> PMC_PCER = (1 << AT91C_ID_TC0);
AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_TC0] =
(0x00 << 5) | // Level sensitive
(0x07 << 0); // Prior
AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_TC0] = (unsigned int) Timer0_Handler;
AT91C_BASE_AIC -> AIC_ICCR = (0x1 << AT91C_ID_TC0);
AT91C_BASE_AIC -> AIC_IECR = (0x1 << AT91C_ID_TC0);
AT91C_BASE_TC0 -> TC_CMR =
(0x1 << 0) |
(0x2 << 13) |
(0x1 << 15);
AT91C_BASE_TC0 -> TC_RC = 60000;
AT91C_BASE_TC0 -> TC_CCR = (0x1 << 0) | (0x1 << 2);
AT91C_BASE_TC0 -> TC_IER = (1 << 4);
while (1);
}
void Timer0_Handler()
{
temp++;
AT91C_BASE_AIC -> AIC_EOICR = 1;
}
void main()
{
AT91C_BASE_PMC -> PMC_PCER = (1 << AT91C_ID_TC0);
AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_TC0] =
(0x00 << 5) | // Level sensitive
(0x07 << 0); // Prior
AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_TC0] = (unsigned int) Timer0_Handler;
AT91C_BASE_AIC -> AIC_ICCR = (0x1 << AT91C_ID_TC0);
AT91C_BASE_AIC -> AIC_IECR = (0x1 << AT91C_ID_TC0);
AT91C_BASE_TC0 -> TC_CMR =
(0x1 << 0) |
(0x2 << 13) |
(0x1 << 15);
AT91C_BASE_TC0 -> TC_RC = 60000;
AT91C_BASE_TC0 -> TC_CCR = (0x1 << 0) | (0x1 << 2);
AT91C_BASE_TC0 -> TC_IER = (1 << 4);
while (1);
}
Пробовал также сделать прерывание на ногу контроллера. Тот же результат. Бит в AIC Pendidng-регистре выставляется, а в обработчик программа не входит.
В чем может быть дело? Что я упустил?
Заранее благодарен.