Здравствуйте. Возникла проблема с таймером. Никак не могу настроить прерывания. На симуляторе (Keil) всё работает, на железе под JTAG'ом - нет. Счётчик тикает, а вот прерывание не срабатывает. Мало того, значение регистра AT91C_BASE_TC0->TC_IER почему-то всегда равно нулю.
Код
#include "AT91SAM7S256.h"
#include "lib_at91sam7s256.h"
__irq void timer_interrupt_handler()
{
static unsigned int ra, rb, rc;
unsigned int mask = AT91C_BASE_TC0->TC_SR; // mask clears after read
if (mask & AT91C_TC_CPAS)
{
ra ++;
}
if (mask & AT91C_TC_CPBS)
{
rb ++;
}
if (mask & AT91C_TC_CPCS)
{
rc ++;
}
AT91C_BASE_AIC->AIC_EOICR = 1;
}
void system_init()
{
AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
AT91C_BASE_PMC->PMC_MOR = AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14 ) |
(AT91C_CKGR_PLLCOUNT & (28<<8)) |
(AT91C_CKGR_MUL & (72<<16)));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
}
void aic_init()
{
AT91F_AIC_CfgPMC();
}
void timer_init()
{
AT91F_TC0_CfgPMC();
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE | AT91C_TC_EEVT_XC0;
AT91C_BASE_TC0->TC_IER = (AT91C_TC_CPAS|AT91C_TC_CPBS|AT91C_TC_CPCS);
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_TC0, 0, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (void(*)(void))timer_interrupt_handler);
AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_TC0);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC0);
AT91C_BASE_TC0->TC_RC = 0x0000100;
AT91C_BASE_TC0->TC_RB = 0x0000200;
AT91C_BASE_TC0->TC_RA = 0x0000300;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}
int main()
{
system_init();
aic_init();
timer_init();
while (1)
{
}
}