根据数据表:
转换本身是快速的,大约需要一个16mhz的时钟周期,尽管数据处理将需要几个额外的时钟周期,这取决于软件代码风格。最快的代码可以在4个16mhz的时钟周期内处理数据,导致最高的采样率为16mhz /5 = 3.3 Msample/s。”
注册int i, j, k;
k = GP_ADC_RESULT_REG;
j = 0 x4c03;
我= GP_ADC_CTRL_REG;
*(volatile uint16*)(i) = j;
__nop ();
__nop ();
__nop ();
__nop ();
K = *(volatile uint16*)(K);
我使用上面的代码得到最简单的ASM代码,也许最快的代码。
但是我必须在写入GP_ADC_CTRL_REG后等待4个NOP以获得正确的ADC_RESULT。
有人能告诉我当cpu被闲置4个HCLK周期时发生了什么?
还有,什么样的代码风格可以超越内部ADC的顶级性能?
设备:
嗨bemoon,
ADC由保持相位和采样相位组成。这意味着ADC应该等待信号源一段时间,以便进行正确的电压估计。转换阶段将花费1个时钟周期,但他的采样取决于你试图采样什么。您应该等待更多的1个时钟周期来进行采样。当你添加了4个NOP,你得到了正确的结果吗?在IDLE stste中,CPU什么也不做,只是等待。
谢谢,PM_Dialog
嗨点,
谢谢你详细的回答。
我研究了几天的AMBA Bus系统,并得到了一个推测。
根据数据表,Cortex M核心作为master与AHB总线相连,ADC作为外设与APB总线相连,APB总线通过APB Bridge与核心进行通信。因此,当我们使用LDRH或STRH指令读或写ADC控制/结果寄存器时,核心必须执行AHB总线协议定时,并间接使APB桥也工作。整个序列是这样的(步骤由HCLK同步):
STRH:
1.核心集hadr和HWRITE。APB Bridge处于IDLE状态。
2.核心集HWDATA。APB网桥进入WRITE WAIT状态。
3.核心等。APB桥接转到写状态。
4.核心等。APB网桥转到WRITE ENABLE状态
LDRH:
1.核心设置hadr,重置HWRITE。APB Bridge处于IDLE状态。
2.核心等。APB网桥变为READ状态。
3.核心等。APB网桥转读使能状态。
我把所有相应的项目放在一个表中:
HCLK = 16兆赫;一个周期= 62.5ns。
说明:STRH NOP NOP NOP LDRH ... ... ...
AHB总线状态:ADDR数据等待等待等待ADDR数据等待等待
APB网桥状态:IDLE W_WAIT WRITE W_ENABLE IDLE IDLE READ R_ENABLE IDLE
Gp_adc_ctrl_reg: 4c01 4c01 4c01 4c01 4c03 4c03 4c11 4c11 4c11
ADC状态:跟踪跟踪跟踪跟踪转换(65ns)跟踪跟踪跟踪跟踪
我想这就是我们需要4个NOP才能得到正确结果的原因。
我不知道为什么代码标签不工作,表看起来不可读,所以我附加它。