ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
HG:
地址空间不同
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
cheng liu8:
回复 HG:
通过什么方法可以读取外设2对应地址的内容?
然后,又通过什么方法可以读取外设0对应地址的内容?
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
mangui zhang:
回复 cheng liu8:
最终都是用指针
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
10#:
回复 cheng liu8:
下次提问请说明清楚具体是哪颗芯片。我假设是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的结果,因为移位总比等待两个时钟周期划算。
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
cheng liu8:
回复 10#:
非常感谢你的细致回答
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
10#:
回复 cheng liu8:
如果回答和解决了你的问题,麻烦确认一下答案关闭本帖,谢谢!
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
user4603405:
回复 10#:
不明白答主最后一句话“因为移位总比等待俩个时钟周期划算”。映射到PF2的,需要右移吗?而且还需要俩个等待周期。而映射到PF0的,默认是右对齐,不需要右移,也不需要等待周期。
ADC模块中ADCRESULTn寄存器有两个地址,分别在外设0区域和外设2区域。对此说法感觉困惑。
问题是通过什么方法可以按需求读取外设0区域和外设2区域的内容。
K Mr:直接通过指针就能读取不同寄存器的值