Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с таймером в AT91SAM7X
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Yarvi
Уже достаточно долгое время над казалось бы простой проблемой.

Собственно необходимо запустить таймер и обрабатывать его прерывания.

Инициализация таймера:

Код
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 не влияет на частоту мигания светодиода.

Совершенно не пойму почему так получается, ведь судя по всему прерывание срабатывает гораздо чаще, ему следовало бы срабатывать.


Буду очень благодарен, если кто сможет помочь.
aaarrr
Запрещать прерывания смысла нет - они и так уже запрещены. PIO_SODR, PIO_CODR и TC_CCR - write-only регистры, зачем их читать? Зачем останавливать клок таймеру в прерывании?

И главное: Вы забыли прочитать TC_SR - без этого прерывание сброшено не будет.
Yarvi
Спасибо большое!
Все дело действительно в сбросе прерывания в регистре статуса.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.