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.
单独用timer0能够进入中断,在中断中我设置了一个IO口,每1s钟闪烁一次用于测试是否进入中断。
但是在主函数中加入InitADC函数之后,就无法进入timer0的TINT0中断。注释掉之后,就可以正常进入TINT0中断。
InitADC函数来自官方代码,在f2802x_adc.c中。
无法进入TINT0中断,就无法触发ADC的SOC。所有片内外设时钟都开了。
下面粘上主函数的程序:
调试了一下,发现是InitAdc()函数里面的DELAY_US(ADC_usDELAY)这个微秒延时的问题。
追踪一下得到这个带参数的宏
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
而DSP28x_usDelay定义在f2802x_usdelay.asm里:
.def _DSP28x_usDelay
.sect "ramfuncs"
.global __DSP28x_usDelay
_DSP28x_usDelay:
SUB ACC,#1
BF _DSP28x_usDelay,GEQ ;; Loop if ACC >= 0
LRETR
我上网查了一下,这个函数需要在RAM里运行?这怎么搞?
我在主函数里加了:
#ifdef _FLASH
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
#endif
也不管用啊!而且我追踪不到memcpy这个函数的原型,官方库里也没有这个memcpy函数
嗯 谢谢 这个微秒延时的问题是解决了
是这样用:
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
InitAdc();
AdcOffsetSelfCal();
但是又有新问题出现了
这个ADCOffsetSelfCal()函数里面有一句
AdcConvMean = AdcConversion();
然后这个AdcConversion()里面有一句:
//Wait for ADCINT2 to trigger, then add ADCRESULT8-15 registers to sum
while (AdcRegs.ADCINTFLG.bit.ADCINT2 == 0){}
然后程序就卡死在这个while语句里了,导致不能完成失调校准,请问是怎么回事呢?