[求助] IAR中跑的好好的,换到MDK中就会莫名其妙的进Fault中断,请各位帮忙看看!

cjqhyy   2012-6-17 14:00 楼主

下面的程序在IAR中用的好好的,但是自己有点吹毛求疵了,还是习惯用MDK,所以就转到MDK下用,程序什么的都不变,只是把对应的driverlab.a文件换成了对应的driverlib.lib文件,build没有问题,下载进去也没问题,前面的串口输出也没问题,但程序一跑到函数adcSample()中的while (!ADC_EndFlag); 这句话时就进中断了。。。搞不明白。。

 

另一个奇怪的现象就是,我用仿真器在while (!ADC_EndFlag);设置断点, 然后进行单步调试,一直点都不会进中断  但是一旦点全速运行就会进fault中断,按理说应该在断点处停下来啊。。!!!

 

 

求帮助,下面是程序相关代码,“!!!***!!!”是我注明出问题的地方。

 

 

//  主函数(程序入口)
int main(void)
{
    unsigned long ulVal;
    char cBuf[100];

    jtagWait();                                           //  防止JTAG失效,重要!
    clockInit();                                           //  时钟初始化:PLL,20MHz
    uartInit();                                             //  UART初始化
    adcInit();                                             //  ADC初始化


    for (;;)
    {
        ulVal = adcSample();                      //  ADC采样    !!!!!!!!!进Fault中断的地方!!!!!!!!
        ulVal = (ulVal * 3000) / 1024;         //  转换成电压值
        sprintf(cBuf, "%ld\r\n", ulVal);         //  输出格式化
        uartPuts(cBuf);                               //  通过UART显示结果
        SysCtlDelay((1000/fre)*(TheSysClock / 3000));           //  延时约1500ms
    }
}

 

 

 

//  ADC采样
unsigned long adcSample(void)
{
    unsigned long ulValue;

    ADCProcessorTrigger(ADC_BASE, 0);                       //  处理器触发采样序列
    while (!ADC_EndFlag);                                   //  等待采样结束                      !!!!进fault中断的地方!!!!!
    ADC_EndFlag = false;                                    //  清除ADC采样结束标志
    ADCSequDataGet(ADC_BASE, 0, &ulValue);                  //  读取ADC转换结果

    return(ulValue);
}

 

 

while (!ADC_EndFlag);

ADC_EndFlag = false;

这两句话句话对应的汇编为:

    39:     while (!ADC_EndFlag);                                   //  等待采样结束
0x000003D2 BF00      NOP     
0x000003D4 4854      LDR      r0,[pc,#336]  ; @0x00000528
0x000003D6 7800      LDRB     r0,[r0,#0x00]
0x000003D8 2800      CMP      r0,#0x00
0x000003DA D0FB      BEQ      0x000003D4                             !!!在这里单步调试不会进fault,但是如果全速运行就直接跳到fault中断里面去了!!!
    40:     ADC_EndFlag = false;                                    //  清除ADC采样结束标志     !!!程序永远执行不到这里!!!! 
0x000003DC 2000      MOVS     r0,#0x00
0x000003DE 4952      LDR      r1,[pc,#328]  ; @0x00000528
0x000003E0 7008      STRB     r0,[r1,#0x00]

回复评论 (2)

启动文件里的中断向量地址修改了么?
点赞  2012-6-17 19:28

回复 沙发 shower.xu 的帖子

正如你所说,是我自己粗心大意,只改了一半。
IMPORT        ADC_Sequence_0_ISR
DCD            ADC_Sequence_0_ISR           ; ADC Sequence 0
写了第一句,第二句忘了写了。。~~

谢谢啊
点赞  2012-6-17 19:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复