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

 
 
> UART прерывания, Несколько прерываний
Hexart
сообщение Oct 23 2011, 14:11
Сообщение #1


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

Группа: Свой
Сообщений: 76
Регистрация: 7-10-05
Из: Москва
Пользователь №: 9 370



Привет всем. Разбираюсь с UART и прерываниями. Разбираю код из примера Keil UART с обработкой прерывания. Никак не могу понять зачем там while. В других примерах нету в обработчике while. Если произошло прерывание по UART1 какое либо. Там в регистре U1IIR - есть три бита (3:1) IntId: Iterrupt identification. Но может быть записан идентификатор только одного прерывания, который выбирается в switch. После считывания значений в case'ax, нулевой бит в U1IIR, в котором записан "0", свидетельствующий о прерывании устанавливается в "1". Если во время обработки прерывания, пришло еще одно прерывание, опять по UART1, то в регистр U1IIR опять запишется значение о новом прерывании еще до выхода из обработчика?

Код
void sio_irq (void) __irq {
  volatile char dummy;
  volatile char IIR;
  struct buf_st *p;

  /*------------------------------------------------
Repeat while there is at least one interrupt source.
  ------------------------------------------------*/
  while (((IIR = U1IIR) & 0x01) == 0) {
     switch (IIR & 0x0E) {
       case 0x06: /* Receive Line Status */
         dummy = U1LSR;  /* Just clear the interrupt source */
         break;

       case 0x04: /* Receive Data Available */
       case 0x0C: /* Character Time-Out */
         p = &rbuf;

         if (((p->in - p->out) & ~(RBUF_SIZE-1)) == 0) {
           p->buf [p->in & (RBUF_SIZE-1)] = U1RBR;
           p->in++;
         }
         break;

       case 0x02: /* THRE Interrupt */
         p = &tbuf;

         if (p->in != p->out) {
           U1THR = p->buf [p->out & (TBUF_SIZE-1)];
           p->out++;
           tx_restart = 0;
         }
         else {
           tx_restart = 1;
         }
         break;

       case 0x00: /* Modem Interrupt */
         dummy = U1MSR;  /* Just clear the interrupt source */
         break;

       default:
         break;
     }
  }

  VICVectAddr = 0; /* Acknowledge Interrupt */
}
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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