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.
在学习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, 这又是什么意思呢。不应该是校准的数据么,怎么能是一个常数呢。文件上说这两个常数是占位符,这又该怎么理解呢。通过上面的内容是如何把各自不同的校准数据写到寄存器里的呢。
专家你好,在手册中,关于调用adc_cal提到两种方法,第一种方法中,第一步添加adc_cal.asm和第三步调用adc_cal()都可以理解,但是第二步不是很明白,可以解答一下吗?
Step 2. Add the .adc_cal section to your linker command file using the following:
MEMORY
{
PAGE 0 :
...
ADC_CAL : origin = 0x380080, length = 0x000009
...
}
SECTIONS
{
...
.adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
...
}