MSP430AFE253 程序运行一段时间后堆栈出错,错误信息如下:
从图中可以看出,程序在运行了大约50分钟后出现了这个问题,有人遇到过这样的问题吗,求指导?
说明:看门狗已关闭,使用内部DCO时钟,8MHz
程序很简单,只有一个 SD24A 的采样程序,连续采样,程序如下:
void main(void)
{
StartUp();
Sd24aInit();
while(1)
{
StartConvert(); // 触发一次转换
__bis_SR_register(LPM0_bits); // 进入低功耗模式,采样完成后在中断中退出低功耗
if(Sd24aFlag & Sd24aSelfCal) // SD24A 自校准模式
{
Sa24aDataSum[0] += Sd24aTemp[0]; // 采样值累加
Sa24aDataSum[1] += Sd24aTemp[1];
Sa24aDataSum[2] += Sd24aTemp[2];
Sd24aSampleCnt++;
if(Sd24aSampleCnt >= Sd24aSelfCalCntMax)
{
CalZeroData[0] = Sa24aDataSum[0] / Sd24aSampleCnt; // 求平均
CalZeroData[1] = Sa24aDataSum[1] / Sd24aSampleCnt;
CalZeroData[2] = Sa24aDataSum[2] / Sd24aSampleCnt;
Sa24aDataSum[0] = 0; // 累加和清零
Sa24aDataSum[1] = 0;
Sa24aDataSum[2] = 0;
Sd24aSampleCnt = 0; // 采样计数清零
//if(a >= 0)
{
SD24INCTL0 = SD24A0_INCH | SD24A0_GAIN; // 切换采样通道
SD24INCTL1 = SD24A1_INCH | SD24A1_GAIN;
SD24INCTL2 = SD24A2_INCH | SD24A2_GAIN;
Sd24aFlag &= ~Sd24aSelfCal; // 清校准状态标志
Sd24aFlag |= Sd24aSelfCalFin; // 置校准完成标志
}
//a++;
}
}
else
{
Sa24aDataSum[0] += Sd24aTemp[0]; // 采样值累加
Sa24aDataSum[1] += Sd24aTemp[1];
Sa24aDataSum[2] += Sd24aTemp[2];
Sd24aSampleCnt++;
if(Sd24aSampleCnt >= Sd24aSelfCalCntMax)
{
ConvertData[0] = Sa24aDataSum[0] / Sd24aSampleCnt; // 求平均
ConvertData[1] = Sa24aDataSum[1] / Sd24aSampleCnt;
ConvertData[2] = Sa24aDataSum[2] / Sd24aSampleCnt;
Sa24aDataSum[0] = 0; // 累加和清零
Sa24aDataSum[1] = 0;
Sa24aDataSum[2] = 0;
Sd24aSampleCnt = 0; // 采样计数清零
ConvertData[0] -= CalZeroData[0] - 212; // 减去偏移值
ConvertData[1] -= CalZeroData[1] - 491;
ConvertData[2] -= CalZeroData[2] + 575; // 以下计算端口采样电压
ConvertVoltage[0] = 1250.0 * ConvertData[0] / 0xFFFFF / SD24A0_GAIN_VALUE;
ConvertVoltage[1] = 1250.0 * ConvertData[1] / 0xFFFFF / SD24A1_GAIN_VALUE;
ConvertVoltage[2] = 1250.0 * ConvertData[2] / 0xFFFFF / SD24A2_GAIN_VALUE;
}
}
}
}
/**
*
@brief SD24A 配置
* @param None
* @retval None
*/
void Sd24aInit(void)
{
SD24CTL = (SD24A_CLKSRC | SD24A_CLKDIV);
SD24CCTL0 = SD24A0_POLAR | SD24SNGL | SD24GRP | SD24A0_OSR | SD24LSBTOG;
SD24CCTL1 = SD24A1_POLAR | SD24SNGL | SD24GRP | SD24A1_OSR | SD24LSBTOG;
SD24CCTL2 = SD24A2_POLAR | SD24SNGL | SD24IE | SD24A2_OSR | SD24LSBTOG;
SD24INCTL0 = SD24A_INCH_PGA | SD24A0_GAIN;
SD24INCTL1 = SD24A_INCH_PGA | SD24A1_GAIN;
SD24INCTL2 = SD24A_INCH_PGA | SD24A2_GAIN;
}
/**
* @brief SD24A 中断
* @param None
* @retval None
*/
#pragma vector = SD24_VECTOR
__interrupt void SD24AISR(void)
{
switch(SD24IV)
{
// 数据溢出中断
case 2:
break;
// SD24_A0 中断
case 4:
break;
// SD24_A1 中断
case 6:
break;
// SD24_A2 中断
case 8:
Sd24aTemp[0] = SD24MEM0;
Sd24aTemp[1] = SD24MEM1;
Sd24aTemp[2] = SD24MEM2;
Sd24aTemp[0] = (Sd24aTemp[0] << 4) + (SD24MEM0 & 0xF);
Sd24aTemp[1] = (Sd24aTemp[1] << 4) + (SD24MEM1 & 0xF);
Sd24aTemp[2] = (Sd24aTemp[2] << 4) + (SD24MEM2 & 0xF);
break;
default:
break;
}
__bic_SR_register_on_exit(LPM0_bits);
}
这个只是个很简单的采样程序,全局变量总共用了不到70个字节,没有使用到局部变量,可能产生的局部变量只可能是MCU计算的时候用到的中间变量
一周热门 更多>