Цитата(romez777 @ May 9 2008, 06:09)

Спасибо за советы, понятно в каком направлении двигаться

Теперь есть более практический вопрос: как обеспечить таймером длинные интервалы, скажем 5секунд.
С этим справился, но столкнулся с новой проблемой

Таймер не запускается, судя по всему.
При этом, отрабатывая это на атмеловском примере из аппнота "Getting started with at91sam7 microcontrollers", все работает, таймер отсчитывает нужный интервал и пр.
В моем проекте не работает, я подозреваю, что дело в стартапе, в аппноте делается ремап, у меня нет - это может как-то влиять на работу таймера?
На всякий случай привожу код инициализаци таймера и обработчика прерывания:
Код
void timer_handler(void)
{
volatile unsigned long dummy;
/* Clear status bit */
dummy = AT91C_BASE_TC0->TC_SR;
....
}
Код
static void configure_tc(void)
{
volatile unsigned long dummy;
/* Enable periph clock for the PIO controller */
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0);
/* Enable the periph */
/* Disable the clock and the interrupts */
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;
/* Clear status bit */
dummy = AT91C_BASE_TC0->TC_SR;
/* Set the Mode of the Timer Counter */
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK | AT91C_TC_CPCTRG;
AT91C_BASE_TC0->TC_RC = AT91B_MASTER_CLOCK >> 12; /* MCKR divided by 1024 * 4 */
/* Enable interrupts */
/* Disable the interrupt on the interrupt controller */
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_TC0);
/* Save the interrupt handler routine pointer and the interrupt priority */
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned long) timer_handler;
/* Store the Source Mode Register */
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;
/* Clear the interrupt on the interrupt controller */
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
/* Enable the interrupt on the interrupt controller */
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0);
}