打印
[ZLG-ARM]

LPC2214串行中断后,ARM就复位了,请教高手!

[复制链接]
2972|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoIIhei|  楼主 | 2007-11-20 11:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序如下:
1、这是中断处理程序,其它的都注掉了,只有这四行,每接收一个字节,中断退出后,ARM就复位,不知为何。我发现只能注掉A或B这两行中的任意一行,ARM就不复位了,当然这样的中断也就没法用了。
void __irq IRQ_UART0(void)
{
    uint8 uTemp;
    if(0x04==(U0IIR&0x0f))
    {
        uTemp=U0RBR; //A
    }
    VICVectAddr=0x00;//B

}
2.这是UART0初始化程序,我用的是9600,8,1,n的通讯设置。
uint8 UART0_INI(uint32 baud,uint8 datab,uint8 stopb,uint8 parity)
{
    uint32 bak;

    //参数过滤
    if((0==baud)||(baud>115200))return(0);
    if((datab<5)||(datab>8))return(0);
    if((0==stopb)||(stopb>2))return(0);
    if(parity>4)return(0);
    //设置串口波特率
    U0LCR=0x80;//DLAB位置1
    bak=(Fpclk>>4)/baud;
    U0DLM=bak>>8;
    U0DLL=bak&0xff;
    //设置串口模式
    bak=datab-5;//设置字长度
    if(2==stopb)bak|=0x04;//判断是否为2位停止位
    if(0!=parity){parity=parity-1;bak|=0x08;}
    bak|=parity<<4;
    U0LCR=bak;

    U0FCR=0x01;//触发点为1个字节  0xc1
    U0IER=0x01;
  
    IRQEnable();
    VICIntSelect=0x00000000;//设置所有通道为IRQ中断
    VICVectCntl0=0x26;//UART0中断通道分配到IRQ slot 0,即优先级最高
    VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址
    VICIntEnable|=1<<0x06;//使能UART0中断
    return(1);
}

相关帖子

沙发
arzhiy| | 2007-11-20 12:05 | 只看该作者

莫非是传说中的串口中断引起的伪中断问题


    莫非是传说中的串口中断引起的伪中断问题
    看看下面**中描述是否有用:
http://arzhiy.21ic.org/user1/3572/archives/2006/32342.html#cmt

使用特权

评论回复
板凳
xiaoIIhei|  楼主 | 2007-11-20 13:21 | 只看该作者

应该不是伪中断

如果是伪中断中应该有中断重复进入的现象,可UART0中断处理程序,只运行一次就复位了,还没有溢出的就复位了。还是谢谢zrzhiy老兄。

使用特权

评论回复
地板
xiaoIIhei|  楼主 | 2007-11-20 13:40 | 只看该作者

问题解决

原来是一个范了个低级错误,原来是中断地址定义重复了,看一我的I2C中断的初始化程序就明白了。
void I2cInit(uint32 Fi2c)
{
    if (Fi2c > 400000)
        Fi2c = 400000;
        
       PINSEL0 = (PINSEL0 & (~0xF0)) | 0x50;     // 不影响其它管脚连接
    I2SCLH = (Fpclk/Fi2c + 1) / 2;                        /* 设定I2C时钟                         */
    I2SCLL = (Fpclk/Fi2c)/2;
    I2CONCLR = 0x2C;
    I2CONSET = 0x40;                                    /* 使能主I2C                         */
    
    /* 设置I2C中断允许 */
    IRQEnable();
    VICIntSelect = 0x00000000;                            /* 设置所有通道为IRQ中断             */
    VICVectCntl0 = (0x20 | 0x09);//A                        /* I2C通道分配到IRQ slot0,最高优先级 */
    VICVectAddr0 = (int)IRQ_I2C;//B                        /* 设置I2C中断向量                     */
    VICIntEnable = 0x0200;                            /* 使能I2C中断                         */
}
将AB两行改成以下就好了。
VICVectCntl3 = (0x20 | 0x09);    
VICVectCntl3 = (0x20 | 0x09);                    

使用特权

评论回复
5
arzhiy| | 2007-11-21 12:00 | 只看该作者

长时间的串口中断通讯可以导致系统复位

长时间的串口中断通讯可以导致系统复位
我原来碰到过
一天时间里面可以碰到2到3次系统复位

使用特权

评论回复
6
liren001| | 2012-10-15 14:49 | 只看该作者
请问你是怎么解决的?
我现在也遇到这个问题了!

使用特权

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

本版积分规则

16

主题

47

帖子

1

粉丝