Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at91sam7s64 & uart & прерывания (interrupt)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
dmvy
собрал на микроконтроллере at91sam7s64 индикатор с ЖК. uart настроил - принимает данные в цикле нормально. но в цикле очень неудобно - начал возиться с прерываниями.

Код
#define AIC_SMR(n) (*(&AIC_SMR0 + n))
#define AIC_SVR(n) (*(&AIC_SVR0 + n))
#define AIC_SRCTYPE_INT_LEVEL_SENSITIVE 0x00    /* Level Sensitive */
#define AIC_SRCTYPE_INT_EDGE_TRIGGERED  0x20    /* Edge Triggered */
#define AIC_SRCTYPE_EXT_LOW_LEVEL       0x00    /* Low Level */
#define AIC_SRCTYPE_EXT_NEGATIVE_EDGE   0x20    /* Negative Edge */
#define AIC_SRCTYPE_EXT_HIGH_LEVEL      0x40    /* High Level */
#define AIC_SRCTYPE_EXT_POSITIVE_EDGE   0x60    /* Positive Edge */
#define US0_ID 6

void uart0_irq(void) __attribute__ ((interrupt("IRQ")));
void uart0_irq(void)
{
  
//  PIOA_CODR = 0x01;
//  delaym(100000);
//  PIOA_SODR = 0x01;
  int act=uart_get_sc(), i;
  for (i=0;i<6;i++)
  {
    prev_active[i]=active[i];
    active[i]=(act>>i) & 0x1;
  }
  AIC_EOICR = 0;
}

в мэйне:
AIC_IDCR = 1 << 6;
  AIC_SVR(6) = (unsigned)uart0_irq;
  AIC_SMR(6) = 0x00;//AIC_SRCTYPE_INT_EDGE_TRIGGERED;
  AIC_ICCR = 1 << 6;
  AIC_IECR = 1 << 6;
__ARMLIB_enableIRQ();


на uart каждую секунду идет информация со скоростью 9600 бод, но прерывание не происходит...

в чем причина? что забыли?
KRS
а в самом UART разрешили нужные прерывания? (AT91C_US0_IER)
dmvy
да. но после написания поста. тоже нолик... =(
Код
  AIC_IDCR = 1 << 6;
  AIC_SVR(6) = (unsigned)uart0_irq;
  AIC_SMR(6) = 0;//AIC_SRCTYPE_INT_EDGE_TRIGGERED;
  AIC_ICCR = 1 << 6;
  AIC_IECR = 1 << 6;
  US0_IER = 0x1;
__ARMLIB_enableIRQ();


мне только на прием нужно прерывание. по доку оно в первом бите регистра
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.