这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 串口中断进不去,谁能帮帮我

共2条 1/1 1 跳转至

串口中断进不去,谁能帮帮我

院士
2006-09-17 18:14:16     打赏
串口中断进不去,谁能帮帮我



关键词: 串口     中断     进不去     谁能     帮我    

院士
2006-12-22 22:43:00     打赏
2楼
问 各位大侠好,用LPC2114设计的板子,两个串口运行串口实验程序收发都正常,硬件应该没问题,用了自己编写的串口程序就不能进中断正常收数,不知是什么原因,哪位高手能帮帮我,谢谢了
用的是2114的ARM Executable Image for lpc2100的工程模板,串口部分程序如下:
#include "config.h"
volatile uint8 rcv0_new;
volatile uint8 rcv1_new;
uint8 RcvFromARM[7];    //UART0数据接收数组
uint8  rcv0_buf[8];      // UART0数据接收缓冲区
uint8  rcv1_buf[8];      // UART1数据接收缓冲区
/********************************************************************
*名称:UART0_SendByte()
*功能:向串口UART0发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/

  void UART0_SendByte(uint8 data)
  {
   U0THR=data; //发送数据
   }
   
   
/********************************************************************
*名称:UART1_SendByte()
*功能:向串口UART1发送字节数据
*入口参数:data,要发送的数据
*出口参数:返回接收到的数据
********************************************************************/

  void UART1_SendByte(uint8 data)
  {
   U1THR=data; //发送数据
   }
/********************************************************************
* 名称:UART0_SendBuf()
* 功能:向串口0发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void  UART0_SendBuf(void)
{  uint8  i;

   
   for(i=0; i<7; i++)
           UART0_SendByte(RcvFromARM[i]);
        while( (U0LSR&0x20)==0 );             // 等待数据发送
}               
/********************************************************************
* 名称:UART1_SendBuf()
* 功能:向串口1发送缓冲区的数据,并等待发送完毕
* 入口参数:无
* 出口参数:无
********************************************************************/
void  UART1_SendBuf(void)
{  uint8  i;

   
   for(i=0; i<8; i++)
           UART1_SendByte(rcv1_buf[i]);
   while( (U1LSR&0x20)==0 );             // 等待数据发送
}    
/***************************************************************
*名称:IRQ_UART0()
*功能:串口UART0接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void  __irq  IRQ_UART0(void)

{  uint8 i;

   if( 0x04==(U0IIR&0x0F) )
            rcv0_new=1;                    // 设置接收到新的数据标志 rcv0_new
   
   for(i=0; i<6; i++)
   {
       RcvFromARM[i] = U0RBR;   // 读取FIFO的数据,并清除中断标志
   }
   
   VICVectAddr = 0x00;                  // 中断处理结束
   
}

/********************************************************************
*名称:IRQ_UART1()
*功能:串口UART1接收中断
*入口参数:无
*出口参数:无
********************************************************************/
void __irq IRQ_UART1(void)
{  uint8 i;

   if( 0x04==(U1IIR&0x0F) )
            rcv1_new=1;                    // 设置接收到新的数据标志 rcv1_new
   RcvCPLDHead= U1RBR;
   for(i=0; i<8; i++)
   {
       RcvFromCPLD[i] = U1RBR;    // 读取FIFO的数据,并清除中断标志
   }
   
   VICVectAddr = 0x00;                  // 中断处理结束

}
/*******************************************************************
*名称:UART0_Ini()
*功能:初始化串口0,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void  UART0_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U0LCR=0x83;               //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/*******************************************************************
*名称:UART1_Ini()
*功能:初始化串口1,设置为8位数据位,1位停止位,无奇偶校验
*入口参数:无
*出口参数:无
********************************************************************/
void  UART1_Ini(uint32 UART_BPS)
{
uint16 Fdiv;
U1LCR=0x83;               //DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS; //设置波特率
U1DLM=Fdiv/256;
U1DLL=Fdiv%256;
U1LCR=0x03;
}
int main (void)
{  
   uint8 i;
   
PINSEL0=(PINSEL0&0xFFF0FFF0)|0x00050005 ; //UART0初始化,UART1初始化
rcv0_new=0;
UART0_Ini(19200);
U0FCR=0x81;//使能FIFO,并设置出发点为8字节
U0IER=0x01;//允许RBR中断,即接收中断

rcv1_new=0;
UART1_Ini(19200);
U1FCR=0x81;//使能FIFO,并设置出发点为8字节
U1IER=0x01;//允许RBR中断,即接收中断
/*设置中断允许*/
VICIntSelect=0x00000000;   //设置所有通道为IRQ中断
VICVectCntl0=0x26;   //UART0中断通道分配到IRQ slot 0,VIC通道号为6
VICVectCntl1=0x27;   //UART1中断通道分配到IRQ slot 1,VIC通道号为7
VICVectAddr0=(uint32)IRQ_UART0;   //设置UART0向量地址
VICVectAddr1=(uint32)IRQ_UART1;   //设置UART1向量地址
VICIntEnable=0x000000C0;   //使能UART0、UART1,即bit6、bit7为1
while(1)
     {
     if(1==rcv0_new)
       {
               rcv0_new=0;
             if (0x59==RcvFromARM[0])
                 {
               if(0x43==RcvFromARM[1])
                  UART1_SendByte(0xFF);  //向串口1发送FF命令
                     }
       }
        
     if(1==rcv1_new)
        {
            rcv1_new=0;
                      if ( RcvCPLDHead==0xAA)
             {
                 rcv0_buf[0]=0x59;
                 rcv0_buf[1]=0x43;
       
                  for(i=2;i<8;i++)
                 {
                     rcv0_buf[i]= RcvFromCPLD[i-1];

                  }
                   UART0_SendByte(0x22);//向串口0发送数据0x22
                   UART0_SendBuf();//向串口0发送数组rcv0_buf[]
                  
               }
             }
     
     return(0);
}
   1: RE检查你的启动代码中断开了没 2: 没中断UART0_IER那,你好像没设置啊 3: 看看启动代码中CPSR中的向量中断可打开了

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]