feo_kos (16.12.2011 03:04, просмотров: 3981)
at91sam7 среда keil четвёртый Разбираюсь с timer counter. По совпадению с RC должно быть прерывание. Но в обработчик не заходит. Может что-то забыл?
(никакого практического применения, просто должно моргать. дилей добавил чтобы наверняка заметить моргание)
#include "AT91SAM7S256.h"
#include "board.h"
int b=1;
AT91PS_TC pTC0 =AT91C_BASE_TC0;
AT91PS_AIC pAIC =AT91C_BASE_AIC;
AT91PS_PIO pPIO =AT91C_BASE_PIOA;
AT91PS_PMC pPMC=AT91C_BASE_PMC;
void delay(unsigned d)
{
for(;d;d--);
}
__irq void tc_irq_handler(void)
{
if(b)
{
pPIO->PIO_CODR=LED_MASK;
}
else
pPIO->PIO_SODR=LED_MASK;
b=~b;
delay(100000);
pTC0->TC_SR;
AT91C_BASE_AIC->AIC_EOICR = 0;
}
void ConfigureTC (void)
{
AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_TC0);
pAIC->AIC_IDCR = 1 << AT91C_ID_TC0;
pAIC->AIC_SVR[AT91C_ID_TC0] = (unsigned int) tc_irq_handler;
pAIC->AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_PRIOR_LOWEST;
pAIC->AIC_ICCR = 1 << AT91C_ID_TC0;
pAIC->AIC_IECR = 1 << AT91C_ID_TC0;
pTC0->TC_RC=0xFFFF;
pTC0->TC_CMR=AT91C_TC_CLKS_TIMER_DIV1_CLOCK;//mck/2
pTC0->TC_IER=AT91C_TC_CPCS;
pTC0->TC_CCR=AT91C_TC_CLKEN;
pTC0->TC_CCR=AT91C_TC_SWTRG;
}
int main (void)
{ pPIO->PIO_OER=LED_MASK;
pPIO->PIO_SODR=LED_MASK;
ConfigureTC();
while (1);
}