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

[复制链接]
 楼主| xiaoIIhei 发表于 2007-11-20 11:16 | 显示全部楼层 |阅读模式
我的程序如下:<br />1、这是中断处理程序,其它的都注掉了,只有这四行,每接收一个字节,中断退出后,ARM就复位,不知为何。我发现只能注掉A或B这两行中的任意一行,ARM就不复位了,当然这样的中断也就没法用了。<br />void&nbsp;__irq&nbsp;IRQ_UART0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;uTemp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(0x04==(U0IIR&0x0f))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uTemp=U0RBR;&nbsp;//A<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;//B<br /><br />}<br />2.这是UART0初始化程序,我用的是9600,8,1,n的通讯设置。<br />uint8&nbsp;UART0_INI(uint32&nbsp;baud,uint8&nbsp;datab,uint8&nbsp;stopb,uint8&nbsp;parity)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;bak;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//参数过滤<br />&nbsp;&nbsp;&nbsp;&nbsp;if((0==baud)||(baud&gt115200))return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;if((datab&lt5)||(datab&gt8))return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;if((0==stopb)||(stopb&gt2))return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(parity&gt4)return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置串口波特率<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR=0x80;//DLAB位置1<br />&nbsp;&nbsp;&nbsp;&nbsp;bak=(Fpclk&gt&gt4)/baud;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLM=bak&gt&gt8;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0DLL=bak&0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;//设置串口模式<br />&nbsp;&nbsp;&nbsp;&nbsp;bak=datab-5;//设置字长度<br />&nbsp;&nbsp;&nbsp;&nbsp;if(2==stopb)bak|=0x04;//判断是否为2位停止位<br />&nbsp;&nbsp;&nbsp;&nbsp;if(0!=parity){parity=parity-1;bak|=0x08;}<br />&nbsp;&nbsp;&nbsp;&nbsp;bak|=parity&lt&lt4;<br />&nbsp;&nbsp;&nbsp;&nbsp;U0LCR=bak;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;U0FCR=0x01;//触发点为1个字节&nbsp;&nbsp;0xc1<br />&nbsp;&nbsp;&nbsp;&nbsp;U0IER=0x01;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect=0x00000000;//设置所有通道为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0=0x26;//UART0中断通道分配到IRQ&nbsp;slot&nbsp;0,即优先级最高<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0=(int)IRQ_UART0;//设置UART0向量地址<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable|=1&lt&lt0x06;//使能UART0中断<br />&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br />}
arzhiy 发表于 2007-11-20 12:05 | 显示全部楼层

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

<br />&nbsp;&nbsp;&nbsp;&nbsp;莫非是传说中的串口中断引起的伪中断问题<br />&nbsp;&nbsp;&nbsp;&nbsp;看看下面**中描述是否有用:<br />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中断的初始化程序就明白了。<br />void&nbsp;I2cInit(uint32&nbsp;Fi2c)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Fi2c&nbsp;&gt&nbsp;400000)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fi2c&nbsp;=&nbsp;400000;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;=&nbsp;(PINSEL0&nbsp;&&nbsp;(~0xF0))&nbsp;|&nbsp;0x50;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;不影响其它管脚连接<br />&nbsp;&nbsp;&nbsp;&nbsp;I2SCLH&nbsp;=&nbsp;(Fpclk/Fi2c&nbsp;+&nbsp;1)&nbsp;/&nbsp;2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设定I2C时钟&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;I2SCLL&nbsp;=&nbsp;(Fpclk/Fi2c)/2;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONCLR&nbsp;=&nbsp;0x2C;<br />&nbsp;&nbsp;&nbsp;&nbsp;I2CONSET&nbsp;=&nbsp;0x40;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能主I2C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置I2C中断允许&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;IRQEnable();<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect&nbsp;=&nbsp;0x00000000;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置所有通道为IRQ中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;0x09);//A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;I2C通道分配到IRQ&nbsp;slot0,最高优先级&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0&nbsp;=&nbsp;(int)IRQ_I2C;//B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;设置I2C中断向量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable&nbsp;=&nbsp;0x0200;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;使能I2C中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />}<br />将AB两行改成以下就好了。<br />VICVectCntl3&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;0x09);&nbsp;&nbsp;&nbsp;&nbsp;<br />VICVectCntl3&nbsp;=&nbsp;(0x20&nbsp;|&nbsp;0x09);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
arzhiy 发表于 2007-11-21 12:00 | 显示全部楼层

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

长时间的串口中断通讯可以导致系统复位<br />我原来碰到过<br />一天时间里面可以碰到2到3次系统复位
liren001 发表于 2012-10-15 14:49 | 显示全部楼层
请问你是怎么解决的?
我现在也遇到这个问题了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

47

帖子

1

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

16

主题

47

帖子

1

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