本帖最后由 nemo1991 于 2015-3-31 18:13 编辑
学习笔记使用F28069为例,但是其具有通用意义,学习C2000系列均可参考该例子。
大家好,最近学习28069,进行adc内部温度传感器采集的实验。
在例程中,使用EOCx INT判断AD采样完成,代码如下:
- //Wait for end of conversion.
- while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0){} //Wait for ADCINT1
- AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //Clear ADCINT1
复制代码最初我理解的采样完成时:ADC采样结果已经被锁存到结果寄存器。
随后我查看了ADC的时序图,发现了一个问题:
ADC中断产生并非在结果被锁存之后,甚至超前很多。
具体来看:
其中ADCCTL1.INTPULSEPOS位控制中断发生的时间,寄存器说明如下:
可见,INT 脉冲发生的时间在结果被锁存之前!在early模式下,甚至提前了15个ADCCLK!
那么,为什么说此时的采样结果能正确读取呢?
真正的原因是,这里涉及到了流水线的知识。简单来说,我们执行的每一条指令,都包含了多个过程,例如取指令、译指令、读取地址、执行操作等多个步骤。
对于ADC中断的两种模式,其中最需要关注的是early模式下能否被正确读取,这里,我们可以参照一下F28069中CLA章节的指令说明。
说明如下:
1.首先看一下CLA的流水线构成。
再看一下,针对ADC early模式的读取过程:
可以看到,因为流水线的作用,最终的读取指令操作已经在ADC转化完成之后!在R2指令的I8时刻进行了结果的读取,而在I7阶段完成了结果的锁存,只能说非常契合!
当然,这是CLA的流水线,对于C28的流水线呢?
基本是一致的~
用到FPU是略有差异的,但是此处并没有用到。
以上是我个人的总结,我认为已经基本解决了问题。
我没有找到ti文档中直接描述这个问题的资料,如果大家有找到可以继续交流下!