关于MSP430堆栈的问题

2019-08-01 16:14发布

MSP430AFE253 程序运行一段时间后堆栈出错,错误信息如下:

QQ图片20140623182454.jpg

从图中可以看出,程序在运行了大约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);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。