打印
[ZLG-ARM]

LPC2103不能产生UART串口中断?

[复制链接]
3402|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
海辰|  楼主 | 2009-12-5 20:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教各位,我用了LPC2103的串口中断程序时钟不能产生中断什么原因,大家帮忙看看。程序如下:
主程序
int main (void)
{
   
    uiGRcvNew = 0;
   
    PINSEL0 = PINSEL0 & (~0x0F);                                       
    PINSEL0 = PINSEL0 | 0x05;                                           /*  设置I/O连接到UART           */        
    UARTInit();                                                        /*  串口初始化                  */
    U0FCR = 0x01;                                                       /*  使能FIFO,设置8个字节触发点 */
    U0IER = 0x01;                                                       /*  使能接收中断                */      
    IRQEnable();
//VICIntEnClear = 0xffffffff;
    VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x06;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (uint32)UART0_IRQ;                                   /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断                */
   
    while(1)  
{                       /*  判断是否有新数据  U0RBR     */
        if (uiGRcvNew == 1)
{                                          
            uiGRcvNew = 0;                    /*  清除标志                    */
   
                  UART0SendStr (uiGRcvBuf, uiGNum);                           /*  向串口发送数据              */
        }
    }
    return 0;
}
中断入口程序
void  __irq  UART0_IRQ (void)
{
    n++;
    uiGNum = 0;
      
    while ((U0IIR & 0x01) == 0)
    {                                        /*  判断是否有中断挂起          */
        switch (U0IIR & 0x0f)
        {                                          /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
                uiGRcvNew = 1;                                          /*  置接收新数据标志            */
                for (uiGNum = 0; uiGNum < 8; uiGNum++)        /*  连续接收8个字节             */
    {               
                    uiGRcvBuf[uiGNum] = U0RBR;
              
                }
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                uiGRcvNew = 1;           
                while ((U0LSR & 0x01) == 1)        /*  判断数据是否接收完毕        */
    {                          
                    uiGRcvBuf[uiGNum] = U0RBR;
                    uiGNum++;
                }
                break;
               
            default: break;
        }
    }
if (uiGRcvNew == 1)
  {                                          
            uiGRcvNew = 0;                                              /*  清除标志                    */
   
         for(uiGNum=0;uiGNum<8;uiGNum++)
            {
               sprintf(cStr,"接收数据为:%d\n",*p);
               ISendStr (0,0,0x30,cStr);   
            }
            
        }
        VICVectAddr = 0x00;
   
}
始终不能产生中断,请问是什么原因?

相关帖子

沙发
zlgARM| | 2009-12-7 20:48 | 只看该作者
试试下面的程序,按照下面的设置进行操作:

/****************************************Copyright (c)***************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info--------------------------------------------------------------------------------
** File name:                        main.c
** Last modified Date:  2004-09-16
** Last Version:                1.0
** Descriptions:                The main() function example template
**
**-------------------------------------------------------------------------------------------------------
** Created by:                        Chen Mingji
** Created date:                2004-09-16
** Version:                                1.0
** Descriptions:                The original version
**
**-------------------------------------------------------------------------------------------------------
** Modified by:         Li Baihua
** Modified date:       2008-04-03
** Version:             1.1
** Descriptions:        串口0通信-中断方式实验
**
*********************************************************************************************************/
#include "config.h"

# define    UART_BPS    115200                                          /*  串口通信波特率              */

volatile    uint8 uiGRcvNew;                                            /*  串口接收新数据的标志        */
uint8       uiGRcvBuf[30] = {0};                                        /*  串口接收数据缓冲区          */
uint32      uiGNum;                                                     /*  串口接收数据的个数          */

/*********************************************************************************************************
** Function name:                DelayNS
** Descriptions:                延时函数
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void DelayNS (uint32 uiDly)
{
    uint32 i;
   
    for (; uiDly > 0; uiDly--){
        for(i = 0; i < 50000; i++);
    }
}

/*********************************************************************************************************
** Function name:                UART0_IRQ
** Descriptions:                串口中断服务函数
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void __irq UART0_IRQ (void)
{
    uiGNum = 0;
      
    while ((U0IIR & 0x01) == 0){                                        /*  判断是否有中断挂起          */
        switch (U0IIR & 0x0E){                                          /*  判断中断标志                */
        
            case 0x04:                                                  /*  接收数据中断                */
                uiGRcvNew = 1;                                          /*  置接收新数据标志            */
                for (uiGNum = 0; uiGNum < 8; uiGNum++){                 /*  连续接收8个字节             */
                uiGRcvBuf[uiGNum] = U0RBR;
                }
                break;
            
            case 0x0C:                                                  /*  字符超时中断                */
                uiGRcvNew = 1;
                while ((U0LSR & 0x01) == 0x01){                         /*  判断数据是否接收完毕        */
                    uiGRcvBuf[uiGNum] = U0RBR;
                    uiGNum++;
                }
                break;
               
            default:
                break;
        }
    }
   
   VICVectAddr = 0x00;
   
}

/*********************************************************************************************************
** Function name:                UARTInit
** Descriptions:                串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
** input parameters:    uiDly   值越大,延时时间越长
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UARTInit (void)
{
    uint16 uiFdiv;
   
    U0LCR  = 0x83;                                                      /*  允许设置波特率              */
    uiFdiv = (Fpclk / 16) / UART_BPS;                                   /*  设置波特率*/
    U0DLM  = uiFdiv / 256;
    U0DLL  = uiFdiv % 256;
    U0LCR  = 0x03;                                                      /*  锁定波特率                  */
}

/*********************************************************************************************************
** Function name:                UART0SendByte
** Descriptions:                向串口发送子节数据,并等待数据发送完成,使用查询方式
** input parameters:    uiDat   要发送的数据
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART0SendByte (uint8 uiDat)
{
    U0THR = uiDat;                                                      /*  写入数据                    */
    while ((U0LSR & 0x20) == 0);                                        /*  等待数据发送完毕            */
}

/*********************************************************************************************************
** Function name:                UART0SendStr
** Descriptions:                向串口发送字符串
** input parameters:    uiStr   要发送的字符串指针
**                      uiNum   要发送的数据个数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void UART0SendStr(uint8 const *uiStr, uint32 uiNum)
{
    uint32 i;
   
    for (i = 0; i < uiNum; i++){                                        /*  发送指定个字节数据           */
        UART0SendByte (*uiStr++);
    }

}

/*********************************************************************************************************
** Function name:                main
** Descriptions:                跳线JP6短接,打开串口调试软件,串口0中断方式通信
** input parameters:    无
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
int main (void)
{
   
    PINSEL0 = PINSEL0 & (~0x0F);                                       
    PINSEL0 = PINSEL0 | 0x05;                                           /*  设置I/O连接到UART           */
   
    uiGRcvNew = 0;

    UARTInit ();                                                        /*  串口初始化                  */
    U0FCR = 0x81;                                                       /*  使能FIFO,设置8个字节触发点 */
    U0IER = 0x01;                                                       /*  使能接收中断                */
   
    IRQEnable ();
   
    VICIntSelect = 0x00000000;                                          /*  设置所有中断为向量中断      */
    VICVectCntl0 = 0x20 | 0x06;                                         /*  设置串口中断为最高优先级    */
    VICVectAddr0 = (uint32)UART0_IRQ;                                   /*  设置向量地址                */
    VICIntEnable = 1 << 0x06;                                           /*  使能串口中断                */
   
    while (1){
        if (uiGRcvNew == 1){                                            /*  判断是否有新数据            */
            uiGRcvNew = 0;                                              /*  清除标志                    */
            UART0SendStr (uiGRcvBuf, uiGNum);                           /*  向串口发送数据              */
        }
    }

    return 0;
}
/*********************************************************************************************************
**                            End Of File
**********************************************************************************************************/

使用特权

评论回复
板凳
海辰|  楼主 | 2009-12-7 21:05 | 只看该作者
谢谢楼上的朋友,如果不介意希望做个朋友,QQ1090349817

使用特权

评论回复
地板
海辰|  楼主 | 2009-12-7 21:09 | 只看该作者
其实,我的那个程序就是光盘里面的那个程序,我复制下来的。但是就是不能产生中断,很奇怪

使用特权

评论回复
5
linhai1986| | 2009-12-7 23:35 | 只看该作者
好长的程序啊,收藏了,慢慢学习

使用特权

评论回复
6
373634600| | 2009-12-8 10:12 | 只看该作者
你好,这个实验我不久前做过~程序没有问题的。问题出在断点调试的问题上,调试软件往往会出现各种问题(我用的ADS就是),建议你将程序烧录进LPC2131~,不行就用ISP烧写,也不知道是不是用久了,个人感觉LPC2131老出问题,呵呵ISP烧进去因该就没问题了。前几天又买个块2148,个人利用那本书做了个2131作主SPI与2148作SSP的实验,成功之余希望能分享,呵呵,我还自己编了些小程序呵呵,希望我们多多交流!ARM之路漫漫~

使用特权

评论回复
7
373634600| | 2009-12-8 18:08 | 只看该作者
补充下,我说的正确的程序是周工的那段程序~也就是2楼的程序

使用特权

评论回复
8
skypoet| | 2009-12-8 23:09 | 只看该作者
好长的程序啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

32

帖子

0

粉丝