下面的程序在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]