各位好,我今天碰到这样一个问题不知道如何解决.
环境: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肯定够了吧。
崩溃了呀,为什么我写的程序这么多问题,上午刚解决重启问题,又来一个。写的比较多(怕描述不清),但是问题只有一个,麻烦你们仔细看一下了<-_->
灰小子:
你先看一下中断服务程序要执行多长时间,然后多久会产生一次中断。
JIUGEN LI:
回复 灰小子:
你好是这样的,PORT4使能ADC和TimerB后程序能按照我设想的运行(正常采样,正常计算),但是一到执行数据发送函数就飞了,关键时这个函数在采样之前运行好好的呀,栈溢出我为什么把栈空间增大到1K了还是一样 有问题呢。
灰小子:
回复 JIUGEN LI:
你单独调试一下这个发送函数,看占用多少资源和时间。
JIUGEN LI:
回复 灰小子:
好像找到问题了,是我ADC采样中断写错了, if(ADC12IV & ADC12IFG1)应该要改成ADC12IV_ADC12IFG1,然后再加一条ADC12IV=0。我之前以为他能自动清标志。改好后,没有那问题了,真是要扇自己。但是我很好奇,他一开始为什么能正常运行一会。也正是因为正常了一会,我就没有怀疑时采样写错了
Susan Yang:
回复 JIUGEN LI:
很高兴您能解决问题!
您也可以对照官方例程来编写程序,C:\ti\msp\MSP430Ware_3_80_03_07\examples\devices\MSP430FR5xx_6xx\MSP430FR5x7x_MSP430FR6x2x_MSP430FR6x7x_Code_Examples\C