MSP430在运行过程中会出现复位

2019-07-23 15:50发布

本帖最后由 mouxiang 于 2014-12-10 11:06 编辑

想请教大家一个问题。

使用了MSP430的两个串口,UART0和UART1。上位机通过UART0与MSP430通信,根据其发送过来的指令,MSP430会启动UART1发送相应的指令去查询一个485设备,然后将查询到的值通过UART0回送给上位机。UART0和UART1的波特率都设定为115200,这样一个通信周期为7.5~8ms。

使用了定时器A,其中,A0的周期为2ms,A1的周期为100us。在A0中我打开了总中断,这样A1的中断能够打断A0的中断,从而使得100us定时器能够准确定时。在A0的中断服务程序中,我放了一些判断代码和IO操作的代码,例如获取光电管状态的代码,但是不多。现在的问题是,MSP430运行一段时间后会发生复位。如果我将获取光电管状态的代码放在main中执行,就不会复位了。

我比较迷惑的是,造成复位的原因是定时器呢还是UART通信?或者是两者共同造成的?因为我放在定时器中断服务中的代码的执行时间应该是很短的,不会超过1ms,照理说那段代码放在定时器里和放在main中是没什么区别的。

各位朋友如果有这方面的经验,还请指点一下,十分感谢!

整个代码比较复杂,各种命名的含义也不太好解释,我贴出来大家也不一定看得明白。所以我后面会陆续将一些函数做一些简化修改会贴出来。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
mouxiang
1楼-- · 2019-07-24 20:39
我将定时器中断Timer_A()中的涉及到输出口开关操作的代码移到main中,Timer_A()中只保留光电管监测的代码,然后我让机器跑一晚上试试看会不会出现复位。如果这时仍然出现复位现象,那么我想可以判断是光电监测代码有问题。如果不出现复位,那么我可以判断是定时器中的代码执行时间稍长时与其他部分的代码有冲突,冲突可能最大的我估计是UART通信的代码。
我在UART1_Send()发送函数中有一句while循环:while((UTCTL1&0x01)==0); 是否有这种可能,就是我在用UART发送的时候被定时器中断打断,造成发送失败,一直死在这个while循环里,然后看门狗引起复位?
as564335sa
2楼-- · 2019-07-25 01:39
 精彩回答 2  元偷偷看……
mouxiang
3楼-- · 2019-07-25 07:31
我昨天将定时器中断中输出口开关操作的代码移到了main中,而保留了光电监测代码。经过一晚上测试,机器没有出现复位。

此外,我今天会做一个测试,在定时器中断中放一个1ms的延时,如果这样也不会出现复位,那么可能是堆栈溢出造成的复位。

关闭看门狗的操作我今天也会去试一下。
HORSE7812
4楼-- · 2019-07-25 09:30
学习
mouxiang
5楼-- · 2019-07-25 10:54
上午做了一下测试,是这么一个情况:如果在定时器中断中加入0.2ms的延时,则不会引发立即复位;如果加入0.3ms以上的延时,则会引起立即复位(我这里指的立即复位,意思是当上位机开始发起通信后,MSP430就不断复位。而之前我所说的复位是指能够正常开机运行一段时间,但是经过一晚上的运行后,可以观测到MSP430发生了复位)。关闭看门狗后,如果是加入0.2ms延时则不会复位,加入0.3ms延时则仍会复位,这说明复位不是由看门狗造成的,而应该是定时器中断中的代码执行时间过长与其他部分冲突而引起的。

我在定时器2ms中断中开了总中断,这是否会有影响?而且当我加入0.3ms延时的时候,MSP430是在上位机发起UART通信的时候才开始复位,这是否是由于UART通信的相关操作引起的?我的UART只用了接收中断,而接收中断应该是可以打断定时器2ms中断的(因为我开了总中断)。有没有可能是在这里出现了问题呢?
dirtwillfly
6楼-- · 2019-07-25 11:44
mouxiang 发表于 2014-12-11 13:21
上午做了一下测试,是这么一个情况:如果在定时器中断中加入0.2ms的延时,则不会引发立即复位;如果加入0.3 ...

你看过你的定时器A0和A1的中断服务程序执行过程分别占用多长时间吗?
根据执行时间算一下,是不是造成多重中断嵌套了?

一周热门 更多>