Установка таймера для AT91SAM7S256

Установка таймера для AT91SAM7S256.

Например необходимо установить таймер для светодиода, что бы тот мигал с периодом в 1 секунду.

Пример на C.

// обработчик прерывания. вызывается через ~1 сек
void TC0_ISREntry( void )
{
unsigned long STATUS = AT91C_BASE_TC0->TC_SR;
//тут изменять состояние светодиода или обработчик

AT91C_BASE_AIC->AIC_IVR = 0;
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);
/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = 0;
}

// —————- INITIALIZE TCO —————-
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0);
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS;
AT91C_BASE_TC0->TC_IDR = 0xFFFFFFFF;
AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK | AT91C_TC_CPCTRG;
AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN;
AT91C_BASE_TC0->TC_RC = 46285;  // MCK / 1024 = 47,4МГц / 1024 => 1 сек
AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG;
AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
// —————- INITIALIZE AIC FOR TCO —————-
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_TC0);
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) TC0_ISREntry;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x3;
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC0);
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC0
);

Один комментарий

  1. Небольшое замечание для тех, кто работает в Keil:
    Перед функцией void TC0_ISREntry( void ) необходимо вставить «__irq «, иначе Keil подпрограмму обработки не найдет.

Добавить комментарий