|
LPC2124 проблема с прерыванием на UART THRE |
|
|
|
Feb 21 2007, 14:51
|
Знающий
   
Группа: 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
|
|
|
|
|
 |
Ответов
|
Feb 22 2007, 12:18
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата и нигде небыло проблем.
Их нет и в LPC, если чуть-чуть подумать. да нет никаких проблем в работе, броблема в том что надо переписывать драйвер под этот проц что даже не планировалось. по поводу времени выполнения тут спорный момент. тест 1 Код IO1SET = (1<<16); U0IER_bit.THREIE = 1; IO1CLR = (1<<16); врямя замеряю осцилом ~387нс тест 2 Код volatile unsigned char status_word; //<= volatile т.к. изменяется в прерываниии
IO1SET = (1<<16); status_word |= 1<<0; IO1CLR = (1<<16); врямя замеряю осцилом ~218нс а у вас 2 вызова идет это примено 218*2 что больше 387 Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть.
|
|
|
|
|
Feb 22 2007, 12:44
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(MALLOY2 @ Feb 22 2007, 12:18)  врямя замеряю осцилом ~218нс
а у вас 2 вызова идет это примено 218*2 что больше 387
Вывод: бесполезный спор который никому не нужен, на этом тему лучше закрыть. Вы говорите о двух принципиально разных подходах в реализации железа UART. AVR и LPC имеют разные реализации и управлять ими придется по-разному. Для LPC, имхо, zltigo показал более правильный способ. У Вас в функции print, якобы, меньше действий, но в прерывании первый байт вычитывается из буфера и помещается в регистр для отправки. Об этом забываете??? И при чем тут время, затрачиваемое на установку или проверку флага занятости передатчика? Если он занят, а Вы хотите дождаться его освобождения, не все ли равно сколько нс будет затрачено на проверку занятости? Ведь времена проверки флага и передачи бита, который эту занятость вызвал, просто несоизмеримы. Цитата(MALLOY2 @ Feb 22 2007, 12:18)  тест 2 Код volatile unsigned char status_word; //<= volatile т.к. изменяется в прерываниии
IO1SET = (1<<16); status_word |= 1<<0; IO1CLR = (1<<16); тест неправильный. ARM - 32-битная архитектура, которой тяжело работать с байтами. zltigo говорил про 32 флага, а Вы char тестируете. Ради интереса сделайте тест с int и сравните полученный код
|
|
|
|
Сообщений в этой теме
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 ЦитатаВ "идеальном" с Вашей точки зрения... Feb 22 2007, 01:08 zltigo Цитата(MALLOY2 @ Feb 22 2007, 00:08) но к... Feb 22 2007, 01:51 zltigo Цитата(MALLOY2 @ Feb 22 2007, 11:18) а у ... Feb 22 2007, 18:12 MALLOY2 результат такой же , и АRM имеет команды которые ... Feb 22 2007, 13:20
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|