This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5438A 程序跑飞问题



程序再运行一段时间后会异常跑飞,通过在线调试,发向程序再disassembly里一直是在0xA000000    jim   0xA000000,出现问题的操作是:
LED_Ctrl(CTRL_24V,ON);

Get_M26_Volt();

LED_Ctrl(CTRL_24V,OFF);

当只有Get_M26_Volt();时不跑飞,当只有LED_Ctrl时也不回跑飞,但是当同时执行时就会跑飞

另外补充一点,中断使可以正常进入的(定时器中断和IO中断) 

  • 楼主你好,能贴出这两个函数的具体代码吗?

  • void Get_M26_Volt(void)
    {
      u8 i=0;
      u32 average;
      u16 AD_value[8][5];    //AD_value[N][M]    N:通道   M:次数
      
      ADC12CTL0|=ADC12ENC;   //ADC12使能
      Delay_ms(1000);
      //AD采集       采集5次,求平均值
      for(i=0;i<5;i++)
      {
        ADC12CTL0 |= ADC12SC;  //启动转换
        while (!(ADC12IFG & BIT7));
        
        AD_value[0][i] = ADC12MEM0;
        AD_value[1][i] = ADC12MEM1;
        AD_value[2][i] = ADC12MEM2;
        AD_value[3][i] = ADC12MEM3;
        AD_value[4][i] = ADC12MEM4;
        AD_value[5][i] = ADC12MEM5;
        AD_value[6][i] = ADC12MEM6;
        AD_value[7][i] = ADC12MEM7;
      }
      ADC12CTL0 &= ~ADC12ENC;   //ADC12失能
        
      for(i=0;i<8;i++)
      {
        //计算平均值
        average= (AD_value[i][0]+AD_value[i][1]+AD_value[i][2]+AD_value[i][3]+AD_value[i][4])/5;
        gParam.run_Param.analog[i] = (u16)((average*VREF)/4095);
      }
    }
    void LED_Ctrl(unsigned char name,unsigned char on_off)
    {
      /************判断输入参数有效性************************/
      if(name > 2)
      {
        return;
      }
      if(on_off!=0 && on_off!=1)
      {
        return;
      }
      
      if(on_off == 0)
      {
        switch (name)
        {
          case 0:
            P9OUT &= ~BIT2;
            break;
          case 1:
            P6OUT &= ~BIT3;
            break;
          case 2:
            P4OUT &= ~BIT3;
            break;
          default:
            break;
        }
      }
      else
      {
        switch (name)
        {
          case 0:
            P9OUT |= BIT2;
            break;
          case 1:
            P6OUT |= BIT3;
            break;
          case 2:
            P4OUT |= BIT3;
            break;
          default:
            break;
        }
      }
    }

    以上是这两个函数的代码
    下面是ADC初始化的代码

    void ADC_Init(void)
    {
        ADC12CTL0&=~ADC12ENC;         //ADC12设置为初始状态,只有ENC为0时才能修改器参数
        REFCTL0 &= ~REFMSTR;                      // Reset REFMSTR to hand over control to 
        ADC12CTL0 |= ADC12ON + ADC12MSC + ADC12SHT0_2 + ADC12SHT1_2;     //内置ADC打开    选择多路采样模式    ADC采样保持时间
        ADC12CTL0 |= ADC12REFON+ADC12REF2_5V;    //内置参考电压开,内置参考电压2.5V  
        ADC12CTL1 = ADC12SHP+ADC12SSEL_3+ADC12CONSEQ_1;     //取样信号来源,AD采样时钟   序列通道单次转换模式
        
        ADC12MCTL0 = ADC12SREF_1+ADC12INCH_7;   //内置参考负电压,AD通道选择
        ADC12MCTL1 = ADC12SREF_1+ADC12INCH_6;   //内置参考负电压,AD通道选择
        ADC12MCTL2 = ADC12SREF_1+ADC12INCH_5;   //内置参考负电压,AD通道选择
        ADC12MCTL3 = ADC12SREF_1+ADC12INCH_4;   //内置参考负电压,AD通道选择
        ADC12MCTL4 = ADC12SREF_1+ADC12INCH_15;   //内置参考负电压,AD通道选择
        ADC12MCTL5 = ADC12SREF_1+ADC12INCH_14;   //内置参考负电压,AD通道选择
        ADC12MCTL6 = ADC12SREF_1+ADC12INCH_13;   //内置参考负电压,AD通道选择
        ADC12MCTL7 = ADC12SREF_1+ADC12INCH_12+ADC12EOS;   //内置参考负电压,AD通道选择    序列结束
    }