реклама на сайте
подробности

 
 
> не могу запустить таймер
srm
сообщение May 20 2010, 19:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 144
Регистрация: 27-12-09
Из: Пермь
Пользователь №: 54 501



Здравствуйте. Возникла проблема с таймером. Никак не могу настроить прерывания. На симуляторе (Keil) всё работает, на железе под JTAG'ом - нет. Счётчик тикает, а вот прерывание не срабатывает. Мало того, значение регистра AT91C_BASE_TC0->TC_IER почему-то всегда равно нулю.

Код
#include "AT91SAM7S256.h"
#include "lib_at91sam7s256.h"

__irq void timer_interrupt_handler()
{
  static unsigned int ra, rb, rc;
  unsigned int mask = AT91C_BASE_TC0->TC_SR; // mask clears after read
  
  if (mask & AT91C_TC_CPAS)
  {
    ra ++;
  }
  if (mask & AT91C_TC_CPBS)
  {
    rb ++;
  }
  if (mask & AT91C_TC_CPCS)
  {
    rc ++;
  }

  AT91C_BASE_AIC->AIC_EOICR = 1;
}

void system_init()
{
  AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;
  AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS;
  AT91C_BASE_PMC->PMC_MOR = AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN;

  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

  AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_DIV & 14 ) |
    (AT91C_CKGR_PLLCOUNT & (28<<8)) |
    (AT91C_CKGR_MUL & (72<<16)));

  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

  AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;

  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

  AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;

  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
}

void aic_init()
{
  AT91F_AIC_CfgPMC();
}

void timer_init()
{
  AT91F_TC0_CfgPMC();

  AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV2_CLOCK | AT91C_TC_WAVESEL_UP_AUTO | AT91C_TC_WAVE | AT91C_TC_EEVT_XC0;
  AT91C_BASE_TC0->TC_IER = (AT91C_TC_CPAS|AT91C_TC_CPBS|AT91C_TC_CPCS);
  AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_TC0, 0, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (void(*)(void))timer_interrupt_handler);
  AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_TC0);
  AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC0);

  AT91C_BASE_TC0->TC_RC = 0x0000100;
  AT91C_BASE_TC0->TC_RB = 0x0000200;
  AT91C_BASE_TC0->TC_RA = 0x0000300;
  
  AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}

int main()
{
  system_init();
  aic_init();
  timer_init();

  while (1)
  {
  }
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016