Уже достаточно долгое время над казалось бы простой проблемой.
Собственно необходимо запустить таймер и обрабатывать его прерывания.
Инициализация таймера:
Код
void InitTimer()
{
m_pTC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV5_CLOCK | AT91C_TC_WAVESEL_UP_AUTO
| AT91C_TC_WAVE;
m_pTC0->TC_IER = (1<<4); //прерывание RC Compare
m_pTC0->TC_RC = 0xFFFF;
m_pAic->AIC_SVR[AT91C_ID_TC0] = (unsigned int) timer_c_irq_handler;
m_pAic->AIC_SMR[AT91C_ID_TC0] = ( AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | 0x5 );
m_pAic->AIC_ICCR = (1<<AT91C_ID_TC0);
m_pAic->AIC_IECR = (1<<AT91C_ID_TC0);
m_pTC0->TC_CCR = AT91C_TC_CLKEN;
}
Обработчик прерывания таймера
Код
__arm __irq void timer_c_irq_handler(void)
{
__disable_interrupt();
m_pTC0->TC_CCR = AT91C_TC_CLKDIS;
count++;
if (count == 100000)
{
blink = !blink;
count = 0;
}
if (blink)
{
m_pPioB->PIO_SODR |= BIT19; //включаем светодиод
}
else m_pPioB->PIO_CODR |= BIT19; // выключаем
m_pTC0->TC_CCR = AT91C_TC_CLKEN;
m_pTC0->TC_CCR |= AT91C_TC_SWTRG;
m_pAic->AIC_EOICR = 0x1;
}
Вроде проще простого, однако, что наблюдается:
светодиод мигает, с частотой 7 раз в 10 сек, при этом изменение значения предделителя таймера счетчика НИКАК НЕ влияет на эту частоту. Также и изменение значения RC не влияет на частоту мигания светодиода.
Совершенно не пойму почему так получается, ведь судя по всему прерывание срабатывает гораздо чаще, ему следовало бы срабатывать.
Буду очень благодарен, если кто сможет помочь.