P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал.
P.P.S. Но раз уж взялись - придется только добить.
P.P.S. Но раз уж взялись - придется только добить.
А поясните, пожалуйста, почему этот таймер не так прост и не рекомендуется использовать прерывания? Тоже только недано начал ковырять АРМ на AT91SAMx256 борде. И тоже попробовал поднять RTT. Поллинг работает, а прерывание стартует только в режиме LEVEL, но почему-то

Если кому не напряжно глянуть в мои каракули, может подскажете где грабли?
Код
// Initialize the timer
AT91F_RTTC_CfgPMC(); //Enable a clock source
AT91F_RTTClearAlarmINT(AT91C_BASE_RTTC);
AT91F_RTTSetPrescaler(AT91C_BASE_RTTC, 0x4000);
AT91F_RTTRestart(AT91C_BASE_RTTC);
AT91F_RTTSetRttIncINT(AT91C_BASE_RTTC);
// AIC initialization
AT91F_AIC_CfgPMC();
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_SYS,
AT91C_AIC_PRIOR_LOWEST,
// AT91C_AIC_SRCTYPE_HIGH_LEVEL,
AT91C_AIC_SRCTYPE_POSITIVE_EDGE,
(void (*)())isr_system);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
// Loop forever
while (1)
{
int c;
c = AT91F_RTTReadValue(AT91C_BASE_RTTC);
if (c != cval)
{
cval = c;
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[1]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[1]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[1]);
}
}
AT91F_RTTC_CfgPMC(); //Enable a clock source
AT91F_RTTClearAlarmINT(AT91C_BASE_RTTC);
AT91F_RTTSetPrescaler(AT91C_BASE_RTTC, 0x4000);
AT91F_RTTRestart(AT91C_BASE_RTTC);
AT91F_RTTSetRttIncINT(AT91C_BASE_RTTC);
// AIC initialization
AT91F_AIC_CfgPMC();
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_SYS,
AT91C_AIC_PRIOR_LOWEST,
// AT91C_AIC_SRCTYPE_HIGH_LEVEL,
AT91C_AIC_SRCTYPE_POSITIVE_EDGE,
(void (*)())isr_system);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
// Loop forever
while (1)
{
int c;
c = AT91F_RTTReadValue(AT91C_BASE_RTTC);
if (c != cval)
{
cval = c;
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[1]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[1]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[1]);
}
}
Код
__irq void isr_system()
{
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[3]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[3]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[3]);
//If this is RTT interrupt
if (AT91F_RTTGetStatus(AT91C_BASE_RTTC) != 0)
{
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[0]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[0]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[0]);
}
AT91C_BASE_AIC->AIC_EOICR = 0;
}
{
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[3]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[3]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[3]);
//If this is RTT interrupt
if (AT91F_RTTGetStatus(AT91C_BASE_RTTC) != 0)
{
if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[0]))
AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[0]);
else
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[0]);
}
AT91C_BASE_AIC->AIC_EOICR = 0;
}