[ZLG-ARM] lpc2131 uart0只进入一次中断就再也进入去了。怎么回事?

[复制链接]
 楼主| jiaduo 发表于 2012-7-15 17:15 | 显示全部楼层 |阅读模式
#include "config.h"

typedef struct{
    unsigned int baud;              //波特率
    unsigned char longth;           //数据长度5\6\7\8
    unsigned char stop;             //停止位个数1或者2
    unsigned char check;            //奇偶校验位0--奇 1--偶 2--不校验
}UARTNODE;

unsigned char sum;
unsigned char rec_buf[20];
unsigned char rec_new;

int uart_init(UARTNODE set)
{
    unsigned int bak;
    if(set.baud<300 || set.baud >115200) return (-1);
    if(set.longth <5 || set.longth>8) return (-1);
    if(set.stop <1 || set.stop >2 ) return (-1);
    if(set.check >3) return (-1);
    U0LCR = 0X80;                   //DLAB = 1;ENABLE BAUD CHANGE
    bak = (Fpclk/16)/(set.baud);
    U0DLL = bak&0xff;
    U0DLM = bak>>8;
    bak = 0;                        //准备存放配置位
    bak |= set.longth - 5;          //设置数据长度
    if(set.stop == 2) bak |= 1<<2;      //设置停止位
    if(set.check == 0 ) bak |= 1<<3;     //设置校验位
    else if(set.check == 1) bak = 3<<3;  
    else if(set.check == 2) bak =bak;
    U0LCR= 0X00;
    U0LCR = bak;
    return 0;   
}

int uart_transmit(unsigned char serial_data)
{
    U0THR = serial_data;
    while(!(U0LSR & 0X40));
    return 0;   
}


void  _uart_rec_IRQ(void )
{
    unsigned char i=0;
    unsigned char iir;
    uart_transmit('c');
    rec_new = 1;
    while(((iir=U0IIR) & 0x01)== 0)//0代表有中断没有处理
    {
       switch(iir&0x0e)
       {
         //触发了8个字节
         case 0x04:for(i=0;i<8;i++){
                        rec_buf[sum++]= U0RBR;
                    }
                    break;
         //超时中断
         case 0x0c:
                rec_buf[++sum] = U0RBR;
                break;
         default:break;  
       }
    }
    VICVectAddr=0;            //中断清零
}

int  main(void )
{
    unsigned char i,j;
    UARTNODE temp;
    temp.baud = 9600;
    temp.longth = 8;
    temp.check = 0;
    temp.stop = 1;
    PINSEL0 = (PINSEL0 & 0XFFFFFFF0)|0X05;   //使能uart0
    uart_init(temp);
    U0IER = 0x01;                             //使能接受中断
    U0FCR = 0x81;                             //使能fifo设置触发点为8

    //中断设置   
    IRQDisable();
    VICIntSelect = 0x00000000;                  //设置中断位irq中断
    VICVectCntl5 = 0x20|0x06;                   //使能并且使用通道5,
    //0x06是向量号。勿写成1<<6注意了!!!!!
    VICVectAddr5 = (unsigned int)_uart_rec_IRQ;
    VICIntEnable |=1<<6;                    //使能中断,别忘了
    IRQEnable();
   
    uart_transmit('a');
    uart_transmit('b');
    while(1)
    {   
        if(rec_new==1&&sum)
        {
            rec_new=0;
            j=sum;
            sum=0;
            for(i=0;i<j;i++)
                uart_transmit(rec_buf);
        }   
    }
    return 0;
}
那位帮看看代码。easyarm2131 zlg的板子。接受中断只进入了一次。
  1. #include "config.h"

  2. typedef struct{
  3.     unsigned int baud;              //波特率
  4.     unsigned char longth;           //数据长度5\6\7\8
  5.     unsigned char stop;             //停止位个数1或者2
  6.     unsigned char check;            //奇偶校验位0--奇 1--偶 2--不校验
  7. }UARTNODE;

  8. unsigned char sum;
  9. unsigned char rec_buf[20];
  10. unsigned char rec_new;

  11. int uart_init(UARTNODE set)
  12. {
  13.     unsigned int bak;
  14.     if(set.baud<300 || set.baud >115200) return (-1);
  15.     if(set.longth <5 || set.longth>8) return (-1);
  16.     if(set.stop <1 || set.stop >2 ) return (-1);
  17.     if(set.check >3) return (-1);
  18.     U0LCR = 0X80;                   //DLAB = 1;ENABLE BAUD CHANGE
  19.     bak = (Fpclk/16)/(set.baud);
  20.     U0DLL = bak&0xff;
  21.     U0DLM = bak>>8;
  22.     bak = 0;                        //准备存放配置位
  23.     bak |= set.longth - 5;          //设置数据长度
  24.     if(set.stop == 2) bak |= 1<<2;      //设置停止位
  25.     if(set.check == 0 ) bak |= 1<<3;     //设置校验位
  26.     else if(set.check == 1) bak = 3<<3;  
  27.     else if(set.check == 2) bak =bak;
  28.     U0LCR= 0X00;
  29.     U0LCR = bak;
  30.     return 0;   
  31. }

  32. int uart_transmit(unsigned char serial_data)
  33. {
  34.     U0THR = serial_data;
  35.     while(!(U0LSR & 0X40));
  36.     return 0;   
  37. }


  38. void  _uart_rec_IRQ(void )
  39. {
  40.     unsigned char i=0;
  41.     unsigned char iir;
  42.     uart_transmit('c');
  43.     rec_new = 1;
  44.     while(((iir=U0IIR) & 0x01)== 0)//0代表有中断没有处理
  45.     {
  46.        switch(iir&0x0e)
  47.        {
  48.          //触发了8个字节
  49.          case 0x04:for(i=0;i<8;i++){
  50.                         rec_buf[sum++]= U0RBR;
  51.                     }
  52.                     break;
  53.          //超时中断
  54.          case 0x0c:
  55.                 rec_buf[++sum] = U0RBR;
  56.                 break;
  57.          default:break;  
  58.        }
  59.     }
  60.     VICVectAddr=0;            //中断清零
  61. }

  62. int  main(void )
  63. {
  64.     unsigned char i,j;
  65.     UARTNODE temp;
  66.     temp.baud = 9600;
  67.     temp.longth = 8;
  68.     temp.check = 0;
  69.     temp.stop = 1;
  70.     PINSEL0 = (PINSEL0 & 0XFFFFFFF0)|0X05;   //使能uart0
  71.     uart_init(temp);
  72.     U0IER = 0x01;                             //使能接受中断
  73.     U0FCR = 0x81;                             //使能fifo设置触发点为8

  74.     //中断设置   
  75.     IRQDisable();
  76.     VICIntSelect = 0x00000000;                  //设置中断位irq中断
  77.     VICVectCntl5 = 0x20|0x06;                   //使能并且使用通道5,
  78.     //0x06是向量号。勿写成1<<6注意了!!!!!
  79.     VICVectAddr5 = (unsigned int)_uart_rec_IRQ;
  80.     VICIntEnable |=1<<6;                    //使能中断,别忘了
  81.     IRQEnable();
  82.    
  83.     uart_transmit('a');
  84.     uart_transmit('b');
  85.     while(1)
  86.     {   
  87.         if(rec_new==1&&sum)
  88.         {
  89.             rec_new=0;
  90.             j=sum;
  91.             sum=0;
  92.             for(i=0;i<j;i++)
  93.                 uart_transmit(rec_buf[i]);
  94.         }   
  95.     }
  96.     return 0;
  97. }














您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

34

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部