INTERRUPCION UART LPC2134

robertito_c_r

New member
En primer lugar hola a todos.
Les cuento.
Estoy comenzando a usar microcontroladores ARM7 en concreto el LPC2134 y estoy realizando una comunicacion serie bidireccional.
El programa consiste en hacer parpadear un led para verificar que el sistema esta funcionando, y una comunicacion UART con un PC y un adaptador serie para convertir niveles.
Mi proposito es usar una interrupcion IRQ vectorizada, para que cuando llegue algun dato se detenga el programa y atienda la interrupcion y guarde los datos recibidos en un array para posteriormente procesarlos.
Ademas realizo un bluque enviando la tabla ASCII al PC.
Mi problema es que encuanto recivo un dato salta la interrupcion y no consigo de ninguna forma que salga de ella quedandose en un bucle infinito en la interrupcion.
El programa lo estoy realizando con el KEIL 4.

Programa principal.
int main()
    {
    Init_pll();
    VICIntEnClr=0xFFFF;//Borro cualquier posible interrupcion
    Init_gpio();
    init_uart();
    i=0;                                 
    while (1)
      {
      for(i=0;i<256;i++)
          {
        LED_blink ();//Parpadeo del LED
  ENVIA_BYTETX0(i);
  }                                                   
      }   
  }

Configuracion de la UART
void init_uart(void)
    {     
    U0LCR=0x03;
    U0FDR=0x10;//Multivall a 1
    U0LCR|=BIT7;//Activo Bit DLAB para poder configurar velocidad
    U0DLL=divisor & 0xFF;
    U0DLM = (divisor >> 8) & 0xFF;
    U0LCR &=~BIT7;//Borro Bit DLAB para poder configurar velocidad
    U0FCR=1;//Activo FIFO
    U0IER = 0;//Desabilito interrupciones UART 1
       
    VICIntSelect &= ~(1<<UART_0);
    VICDefVectAddr |= (1<<UART_0);
    VICVectCntl10 = 0x20 | UART_0;                    /* Prioridad 0 Vectorizada use it for UART 0 Interrupt*/
    VICVectAddr10 = (unsigned long)RX_UART_CERO ;          /* set interrupt vector in 0  */
    VICIntEnable |= BIT6;                  /* Enable UART0 Interrupt    */
    U0IER = 1;//Habilito interrupcion de recepcion de datos validos
    }

Y la interrupcion
_irq void RX_UART_CERO (void)
{
if(U0IIR&DR)
{
while (!(U0LSR&DR));
if(PUNT_W0<512)
{
BUFFER_UART0[PUNT_W0]=U0RBR;
PUNT_W0++;
}
else;
}
else;
VICVectAddr &= 0x0000;//Borro cualquier posible fuente de interrupcion
}

Todo funciona bien hasta recibir un dato en el LPC. Entonces salta a la interrupcion y de ahi no sale.
No se ya lo que hacer, llevo ya varios dias leyendo el datasheet y revisando el programa, pero no encuentro nada mal.
Solicito ayuda de alguien que sepa orientarme para poder solventar el problema y continuar aprendiendo.
 

Welcome to EDABoard.com

Sponsor

Back
Top