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
2019-07-24 07:28
Get_Phototube_Info_In_TimerA()定义如下:
  1. void Get_Phototube_Info_In_TimerA(void)//精简的函数,仅用于在定时器中断中获取光电管状态变化的时刻
  2. {  
  3.   if(!Flag_for_Non_Trigger)
  4.   {
  5.     Phototube_1_State = Obtain_Phototube_State_1();//获取光电管1状态,这是一个读取IO口状态的操作
  6.   }
  7.   else
  8.   {
  9.     Phototube_1_State = 7;//处于不触发时间内,光电管状态设定为一直遮挡
  10.     if(Count_for_Non_Trigger >= Effective_Irregular_Object_Not_Trigger_Time*5)//不触发时间到
  11.     {
  12.       Flag_for_Non_Trigger = 0;
  13.       Count_for_Non_Trigger = 0;
  14.     }
  15.   }
  16.   
  17.   if(Phototube_1_State == 1 || Phototube_1_State == 5)         //这表明光电管开始被遮挡
  18.   {
  19.     Rejection_Admin[Rejection_Num].Rise_Time = Timer_A1_count;//存储光电管上升沿时刻
  20.   }  
  21. }
复制代码一般情况下,如果光电管不被遮挡,则Flag_for_Non_Trigger=0,Phototube_1_State=0,也就是说Get_Phototube_Info_In_TimerA()这个函数中仅仅只是获取光电管状态。

一周热门 更多>