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

 
 
> LPC2124 проблема с прерыванием на UART THRE
MALLOY2
сообщение Feb 21 2007, 14:51
Сообщение #1


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



При включении прерывания U0IER_bit.THREIE = 1 не происходит прерывание при этом в U0LSR бит THRE и TEMT установлины. Происходит только после того как что то запишеш в U0THR. Я уже замучялся...

Код инициализации:

Код
    ubuff = &u0buff;
       ubuff->tx_buff = u0_buff_tx;
       ubuff->rx_buff = u0_buff_rx;
    ubuff->tx_buff_size = sizeof(u0_buff_tx);
    ubuff->rx_buff_size = sizeof(u0_buff_rx);
    PCONP_bit.PCURT0 = 1; //UART power on
    PINSEL0_bit.P0_0 = 1;//select pin for UART0  
    PINSEL0_bit.P0_1 = 1;
    U0FCR = 0xC1;
    uart_bautrate(UART0,32);
    U0LCR = 0x03; //1-8-N
    INT_Plug(UART0_ISR,VIC_UART0,IRQ_int,IRQ_Slot0);
    VIC_IntEnable(BIT(VIC_UART0));
    U0IER_bit.RDAIE = 1;
    U0IER_bit.RXLSIE = 1;


код функции передачи


Код
int uart_send_str(TUartChanel dev, const char* data)
{
  TUART_BUFF* ubuff;
  int len,fsize,head,i;
  unsigned long old_irq;
  char *ptr;
  ubuff = &u0buff;
  fsize = 0;
  len = strlen(data);
  ptr = (char*)data;
  do
   {
    do fsize = uart_tx_free(dev); while(fsize == 0);
    if (fsize > len) fsize = len;
    head = ubuff->tx_head;
    for (i=0;i<fsize;i++)
     {
      ubuff->tx_buff[head] = *ptr++;
      if(++head == ubuff->tx_buff_size) head = 0;
     }
    ubuff->tx_head = head;
    old_irq = disable_IRQ();
    ubuff->tx_size = ubuff->tx_size+i;
    restore_IRQ(old_irq);
    U0IER_bit.THREIE = 1; //<= включаем прерывание и оно не происходит
    len = len - fsize;    
   }
  while((*ptr!='\0')&&(len > 0));
  return(0);
};


код main

Код
  //U0THR = 0x00;  //<- если включить эту строку UART начинает генерить прерывания
  while(1)
   {
     uart_send_str(UART0,"HELLO WORD");
   }





Код обработчика:

Код
void UART0_ISR (void)
{
unsigned int tmp;
TUART_BUFF* ubuff = &u0buff;  
switch((U0IIR>>1)&0x7)
  {
   case IIR_THRE:   // continue sending data
        if (ubuff->tx_size == 0)U0IER_bit.THREIE = 0;
        else
         {
          U0THR = ubuff->tx_buff[ubuff->tx_tail];  
          ubuff->tx_size--;
          if (++ubuff->tx_tail == ubuff->tx_buff_size) ubuff->tx_tail = 0;
         }  
        break;
   case IIR_RSL:    
        tmp = U0LSR;
        ubuff->last_error |= tmp & 0x9E;
        break;
   case IIR_RDA:    // receive data
   case IIR_CTI:    // time out
        tmp = U0RBR;
        if (ubuff->eho_state == ON)
         {
          while(!U0LSR_bit.THRE);
          U0THR = tmp;
         };    
        if ((tmp == 0x0D) || (tmp == 0x0A)) ubuff->str_flag = 1;
        if (ubuff->rx_size == (ubuff->rx_buff_size-1))
         {
          ubuff->last_error |= RC_FIFO_OVERRUN_ERR;
         }
        else
         {
          ubuff->rx_buff[ubuff->rx_head] = tmp;    
          ubuff->rx_size++;
          if (++ubuff->rx_head == ubuff->rx_buff_size) ubuff->rx_head = 0;
         }
        break;
   }//switch
}  //isr
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Feb 22 2007, 01:08
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Цитата
В "идеальном" с Вашей точки зрения железе дергать разрешение прерывания когда есть/нет чего передавать (разбираясь перед этим есть или нет чего)это типа "прямо" и правильно . А глянуть на один флаг в момент начала передачи порции это "разве это работа".


ну насчет правильно неправильно тут я судить не буду

но код

U0IER |= IER_THREIE;

куда быстрее выполняется чем код

if( !(status_word & STW_THR_BUSY) )
{ status_word |= STW_THR_BUSY;
U0THR = *string++;
}

и места меньше потребляет и линейный полностью и конвейер проца не сбрасывает (зависит от компилятора). И флагов дополнительных не надо, одни минусы, так вчем прикол ? я реализовал обмен через разрешение прерываний во многих процах(ATMEGA, ST16C1550+8051, TMS320VC5502 ... ) и намой взгляд это наиболее быстрый и экономический вариант если проц без ДМА, и нигде небыло проблем.

Цитата
(MALLOY2 @ Feb 21 2007, 16:41)

но у меня лежит плата с ST16C1550 и все он генерирует при включении прерывания.


Вот именно он и "кривой", если так поступает.


Он оптимизированный smile.gif, просто тогда об этом недогадывались наверное ....
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 22 2007, 01:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MALLOY2 @ Feb 22 2007, 00:08) *
но код

U0IER |= IER_THREIE;

куда быстрее выполняется чем код

if( !(status_word & STW_THR_BUSY) )
{ status_word |= STW_THR_BUSY;
U0THR = *string++;
}

Ну раз речь пошла о быстродействии smile.gif smile.gif smile.gif
1.Знаете сколько наносекунд выполняется у LPC обращение к периферии? Cоветую поинтересоваться на досуге.
2.Приведенная Вам строка совершенно не заменяет приведенный мною код.
В своем варианте Вы кроме разрешения прерывания сделаете
- лишнее занесение первого байта в буфер в функции передачи
- лишнее извлечение первого байта из буфера в обработчике (все это естественно работа с байтами и возня с указателями)
- ну и само собой еще одно обращение в обработчике к медленной периферии для запрещения прерывания.

Вместо всех этих телодвижений - анализ/сброс бита и прямое без промежуточной буферизации занесение в THR.
Цитата
и места меньше потребляет

Да. Сколько там FLASH у LPC2124 не напомните? Сколько написали кода?
Цитата
и линейный полностью и конвейер проца не сбрасывает (зависит от компилятора).
И флагов дополнительных не надо

один бит smile.gif в слове где используется дюжина флагов из 32. Кроме того можете работать и по железному флагу TEMT - выиграите 5-6 команд (в сумме с обработчиком прерывния).
Цитата
одни минусы, так вчем прикол ?

Прикол в том, что в Ваших рассуждениях ошибка на ошибке sad.gif
Цитата
я реализовал обмен через разрешение прерываний во многих процах(

Ну и что? Из этого следует что всегда и везде надо поступать по этому шаблону?
Цитата
и нигде небыло проблем.

Их нет и в LPC, если чуть-чуть подумать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MALLOY2   LPC2124 проблема с прерыванием на UART THRE   Feb 21 2007, 14:51
- - DASM   Читаем. Внимательно. The UART0 THRE interrupt (U0I...   Feb 21 2007, 15:07
- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 13:51) При ...   Feb 21 2007, 15:13
- - MALLOY2   Вот кривизна, одно растройство, придется драйвер п...   Feb 21 2007, 15:43
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 14:43) а чт...   Feb 21 2007, 15:56
|- - Alex03   Цитата(MALLOY2 @ Feb 21 2007, 17:43) Вот ...   Feb 21 2007, 17:19
|- - Alex03   Цитата(Alex03 @ Feb 21 2007, 19:19) Если ...   Feb 21 2007, 17:30
- - MALLOY2   Цитата7:6 Rx Trigger Level Select 00: trigger leve...   Feb 21 2007, 16:19
|- - Сергей Борщ   Цитата(MALLOY2 @ Feb 21 2007, 15:19) а эт...   Feb 21 2007, 17:23
- - MALLOY2   ЦитатаК какому кривому? Мой примерный перевод (уск...   Feb 21 2007, 17:41
|- - zltigo   Цитата(MALLOY2 @ Feb 21 2007, 16:41) но у...   Feb 21 2007, 18:25
|- - Alex03   Цитата(zltigo @ Feb 21 2007, 20:25) Цитат...   Feb 22 2007, 08:38
|- - zltigo   Цитата(Alex03 @ Feb 22 2007, 07:38) ИМХО ...   Feb 22 2007, 09:22
|- - Alex03   Цитата(zltigo @ Feb 22 2007, 11:22) Цитат...   Feb 22 2007, 10:44
- - MALLOY2   ЦитатаНу а потом пауза в передаче и ..... кто пино...   Feb 21 2007, 18:38
|- - zltigo   Цитата(MALLOY2 @ Feb 21 2007, 17:38) Это ...   Feb 21 2007, 20:36
|- - Сергей Борщ   Цитата(zltigo @ Feb 21 2007, 19:36) После...   Feb 21 2007, 22:22
|- - zltigo   Цитата(Сергей Борщ @ Feb 21 2007, 21:22) ...   Feb 21 2007, 22:40
|- - smac   Цитата(zltigo @ Feb 22 2007, 01:40) .. ре...   Nov 29 2009, 15:42
- - MALLOY2   Цитатаи нигде небыло проблем. Их нет и в LPC, ес...   Feb 22 2007, 12:18
|- - gladov   Цитата(MALLOY2 @ Feb 22 2007, 12:18) врям...   Feb 22 2007, 12:44
||- - zltigo   Цитата(gladov @ Feb 22 2007, 11:44) У Вас...   Feb 22 2007, 18:24
|- - zltigo   Цитата(MALLOY2 @ Feb 22 2007, 11:18) а у ...   Feb 22 2007, 18:12
- - MALLOY2   результат такой же , и АRM имеет команды которые ...   Feb 22 2007, 13:20


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

 


RSS Текстовая версия Сейчас: 1st August 2025 - 20:06
Рейтинг@Mail.ru


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