各位好,我今天碰到这样一个问题不知道如何解决.
环境:IAR
芯片:MSP430FR6972
问题描述:
程序运行过程中,执行一个函数的时候,莫名其妙的进入一个未知错误,现象是进不去main函数了(没有使能低功耗模式),但是却可以进入TimerB0中断以及ADC12中断,反倒我程序开始运行时候使能的Timer0却进不去了。这是什么情况呀?我之前猜想是跑飞了,原因可能是栈溢出,但是我增大栈大小后还是如此,可能引起错误的函数是一个数据发送函数里面调用的函数层级是比较多,但是我觉得也不是很多呀,没道理会导致溢出呀。后面我把这个函数注释掉,确实可以稳定运行一会,但是随后又会出现这个问题,进不去main函数。会是这几个中断哪里没处理好吗?比如要开嵌套,(之前有个问题就是因为嵌套导致重启,所以全关了)
补充:在使能采样和定时器B0前,程序都能很好的收发,但是一旦开启这两个中断后,就一堆问题。严重怀疑是这两个中断问题。
函数(注这个函数正常情况下是可以使用的):
void RF_Duty_Tx(u8* pbuf, u8 length)
{
CMT2300A_ExitAutoDutyCycleMode();
RF_Tx(pbuf,length);
CMT2300A_EnterDutyCycleMode(MODE5);
}
这个函数大概层级:
"Fault_Monitor"
"Runing_Status_Monitor"
"Send_Power_State"
"RF_Duty_Tx"
"CMT2300A_ExitAutoDutyCycleMode"
"RF_Tx"
"CMT2300A_EnterDutyCycleMode"
"CMT2300A_GoStby"
"CMT2300A_AutoSwitchStatus"
"CMT2300A_SwitchStatusAndWait"
"CMT2300A_GetChipStatus"
"CMT2300A_ReadReg"
"cmt_spi3_read"
"cmt_spi3_send"
"cmt_spi3_delay"
相关中断:
__interrupt void Timer0_A0_ISR(void)
{
/* 这个定时器里面就是一些定时信息 ,是个秒中断,没有开中断嵌套 */
}
__interrupt void Timer0_B0_ISR(void)
{
/* 这个中断用来触发ADC采样的(1ms一次) ,也没有打开中断嵌套 */
ADC12CTL0 |= ADC12SC;
}
/* 这个中断用于初始化ADC和使能定时器B0 */
#pragma vector=PORT4_VECTOR
__interrupt void Port_4(void)
{
// _EINT();
if(P4IFG&BIT4)
{
P4IFG &= ~BIT4; //清除中断标志
Indicator_Status.PowerUp_Flag = 1; //这个标志只是表示刚才有电了,但不表示线路稳定工作
if(Indicator_Status.WorkStatus == LowPower)
{
Indicator_Status.WorkStatus=Test;
Start_ADC();
TimerB0_Init(); //开启采样定时器
}
}
}
/* 采样中断,未使能中断嵌套 ,未使能低功耗模式 */
__interrupt void ADC12_ISR(void)
{
if(ADC12IV & ADC12IFG1)
{
// _EINT();
/* Indicator_Status ,Task_Handle_Status两个全局结构体 */
if(Task_Handle_Status.RMS_Calculate_Flag == 0)
{
Indicator_Status.Sample_Current[Indicator_Status.Sample_Count] = ADC12MEM0;
Indicator_Status.Sample_Voltage[Indicator_Status.Sample_Count] = ADC12MEM1;
Indicator_Status.Sample_Count++; //采样计数
if(Indicator_Status.Sample_Count == 20)//20点采样完成
{
Indicator_Status.Sample_Count=0;
Task_Handle_Status.Task_Count++;
Task_Handle_Status.RMS_Calculate_Flag=1;
#ifdef LOW_POWER
LPM3_EXIT;
#endif
}
}
}
}
IAR堆栈分析:
Call Graph Root Category Max Use Total Use
------------------------ ------- ---------
interrupt 82 154
Program entry 118 118
从这里看也没用多少栈空间呀,我设置的500肯定够了吧。
崩溃了呀,为什么我写的程序这么多问题,上午刚解决重启问题,又来一个。写的比较多(怕描述不清),但是问题只有一个,麻烦你们仔细看一下了<-_->