在学习28335的示例程序,对于ADC校准有一块有些不大懂的地方。
根据我的理解28335如果是正常启动的话,ADC_cal()这个校准函数在上电引导程序内就被自动调用了。用户不需要干预。而在调试模式下这一过程可能被绕过,
所以需要用户自行调用,以校准ADC的转换结果。文档上提供的两种方法1、汇编法 2、指针函数法。第2种比较好理解,就是定义一个指向校准函数的指针,然后打开ADC时钟,运行校准函数就行。我对第一种方法的运行过程还不太理解,在此有以下问题:
1、我上边的描述正确么?如不正确请指正。
2、如果我不使用ADC 或采用方法2 校准,是不是就不用在工程里链接ADC_cal.asm文件了呢。
3、我无法找到ADC_cal()函数的实例化位置,只在DSP2833x_GlobalPrototypes.h处找到了函数的一个声明 extern void ADC_cal (void); 请问编译器是如何将ADC_cal()函数同ADC_cal.asm中的校准程序链接的。难到是这一句 .def _ADC_cal 这里的书写和函数并不一致啊,怎么通过的呢。同样的问题还出现在 DSP28x_usDelay 这个延时函数上,我也只到到了一句 .def _DSP28x_usDelay 。这是怎么会事呢?
4、ADC_cal.asm中的内容:
_ADC_cal
MOVW DP, #ADCREFSEL_LOC >> 6
MOV @28, #0xAAAA
MOV @29, #0xBBBB
LRETR
这里为什么向ADCREFSEL 写0xAAAA ,向ADCOFFTRIM 写 0xBBBB, 这又是什么意思呢。不应该是校准的数据么,怎么能是一个常数呢。文件上说这两个常数是占位符,这又该怎么理解呢。通过上面的内容是如何把各自不同的校准数据写到寄存器里的呢。