本帖最后由 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中是没什么区别的。
各位朋友如果有这方面的经验,还请指点一下,十分感谢!
整个代码比较复杂,各种命名的含义也不太好解释,我贴出来大家也不一定看得明白。所以我后面会陆续将一些函数做一些简化修改会贴出来。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- void TIMERA_init(void)
- {
- CCTL0 = CCIE; // 开启比较器0中断
- CCR0 = 2000; // 2ms
- CCTL1 = CCIE; // 开启比较器1中断
- CCR1 = 100; //
- TACTL = TASSEL_2 + ID_3 + MC_1; // SMCLK, 8分频为1Mhz, Up to CCR0
- }
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A (void)
- {
- _EINT();//开总中断,以便100us定时器能够正常进行
- if(System_Time_Interval(Timer_2ms_Count, System_Timer) >= 20)//时间间隔20*100us=2ms
- {
- Get_System_Time_Current_Count(Old_Timer_2ms_Count, Timer_2ms_Count);
- Get_System_Time_Current_Count(Timer_2ms_Count, System_Timer);
-
- Timer_A1_count++;
- Flag_Timer_A1_Updated = 1;
-
- //下面这段被注释掉的代码,此时放在main中运行,MSP430不会出现复位;若放在此处运行,则MSP430运行一段时间后就会出现复位
- // if(Phototube_Info_is_Needed)
- // {
- // Get_Phototube_Info_In_TimerA();
- // }
- }
- /***************************/
- //这里是一些输出口开关操作
- /***************************/
- }
- #pragma vector=TIMERA1_VECTOR
- __interrupt void Timer_A1 (void)
- {
- if( TAIV != 0x02)//比较器1中断
- return;
-
- CCR1 += 100;
- if(CCR1 >= 2000)
- CCR1 -= 2000;
-
- System_Time_Increase(System_Timer);
- }
复制代码以上是定时器的初始化和中断服务程序。一周热门 更多>