关于GP_ADC 3.3Msps采样率

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
3个帖子/ 0个新
最后发表
bemoon
离线
最后看到:2年2个月前
加入:2017-07-19并表达
关于GP_ADC 3.3Msps采样率

根据数据表:
转换本身是快速的,大约需要一个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的顶级性能?

设备:
PM_Dialog
离线
最后看到:2天14小时前
工作人员
加入:2018-02-08 11:03
嗨bemoon,

嗨bemoon,

ADC由保持相位和采样相位组成。这意味着ADC应该等待信号源一段时间,以便进行正确的电压估计。转换阶段将花费1个时钟周期,但他的采样取决于你试图采样什么。您应该等待更多的1个时钟周期来进行采样。当你添加了4个NOP,你得到了正确的结果吗?在IDLE stste中,CPU什么也不做,只是等待。

谢谢,PM_Dialog

bemoon
离线
最后看到:2年2个月前
加入:2017-07-19并表达
嗨点,

嗨点,
谢谢你详细的回答。
我研究了几天的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才能得到正确结果的原因。
我不知道为什么代码标签不工作,表看起来不可读,所以我附加它。

附件: