ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
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模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
下次提问请说明清楚具体是哪颗芯片。我假设是F28335:
在它的ADC Reference Guide (SPRU812)手册里,2.8 ADC Conversion Result Buffer Registers (ADCRESULTn)寄存器的描述下方有以下说明:
The ADCRESULTn registers are left justified when read from Peripheral Frame 2 (0x7108-0x7117) with two wait states and right justified when read from Peripheral Frame 0 (0x0B00-0x0B0F) with zero wait states.
简单来说,这两个不同地址的结果存在两点不同:存放在PF2地址的ADC结果是左对齐的,同时需要两个等待周期才能得到,而存放在PF0地址的ADC结果是右对齐的,读取等待周期为0,相当于是从RAM上直接获取。
至于读取方法,实际上的过程你只需要在应用程序中使用结果即可,默认是的PF2。
以下是整个过程的联系,你需要查看ADC结果寄存器在DSP2833x_Adc.h和.cmd文件中是如何定义的,以PF2为例:
DSP2833x_Adc.h:
extern volatile struct ADC_REGS AdcRegs;
ADC_REGS结构体是包含ADCRESULTn的;
DSP2833x_Headers_nonBIOS.cmd:
AdcRegsFile : > ADC, PAGE = 1
ADC : origin = 0x007100, length = 0x000020 /* ADC registers */
AdcRegsFile在DSP2833x_GlobalVariableDefs.c文件中跟AdcRegs有关联,最后"ADC"的实际地址被分配到了0x007100长度为0x20的区间,也就是PF2(0x7108-0x7117)。
#pragma DATA_SECTION(AdcRegs,"AdcRegsFile");
volatile struct ADC_REGS AdcRegs;
此时在应用程序中就只需要像例程adc_soc中的源文件Example_2833xAdcSoc.c一样进行如下操作:
Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4;
移4位的原因是如上所说,16位的左对齐需要得到最终的12位结果。
同理,对于PF0,TI也定义了一个ADC_RESULT_MIRROR_REGS AdcMirror,只是PF0的访问结果不需要进行移位。
实际应用中,用户只需要包含这些文件,直接使用即可。考虑到访问速度,建议都是操作PF2的结果,因为移位总比等待两个时钟周期划算。