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.

ADC_cal() 的具体过程是怎么样的。

在学习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, 这又是什么意思呢。不应该是校准的数据么,怎么能是一个常数呢。文件上说这两个常数是占位符,这又该怎么理解呢。通过上面的内容是如何把各自不同的校准数据写到寄存器里的呢。

  •  描述基本是正确的,这个函数是已经固化在ROM中的,上电会自动调用的。

    在汇编中.def 就是定义声明了一个函数,在C语言中就可以调用了。

    0xAAAA和0xBBBB是一个例子,可以根据板上的干扰情况,自行修改校正。

    具体说明在F2833x的ADC章节有详细描述。

  • 专家你好,在手册中,关于调用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
    ...
    }

  • 这是CMD文件啊, 把ADC函数等相关数据映射存储用的