[英]how to offload precise ADC oversampling with RISC-V GD32VF103CBT6 Development Board
我希望使用RISC-V GD32VF103CBT6 开发板制作一个非常基本的音频效果设备。 我已经设法用另一个 MCU 进行了一些基于硬件中断的采样,但我对 RISC-V 板的文档有点困惑。 用户手册第 11 章。 我一点也不知道如何将那里的指令转换为实际的 C/C++ 代码。 可悲的是,他们的github repo几乎没有任何示例,而且似乎没有一个可以处理高速采样。 这个 github repo中还有一个数据表,但我也无法在其中找到任何具体的代码示例或揭示指令。
我想做的是:
第 11.4.1 节明确表示
在开始 A/D 转换之前应进行校准。 校准由软件通过设置位 CLB=1 来启动。 在整个校准序列期间,CLB 位保持为 1。 一旦校准完成,它就会被硬件清零。 内部模拟校准可以通过设置 ADC_CTL1 寄存器中的 RSTCLB 位来复位。
Calibration software procedure:
1) Ensure that ADCON=1.
2) Delay 14 ADCCLK to wait for ADC stability
3) Set RSTCLB (optional)
4) Set CLB=1.5.Wait until CLB=0.
问题 1:如何按照这些说明设置这些 memory 寄存器。 我需要一个代码示例,制造商没有提供。
问题 2:如何在 C/C++ 中delay 14 ADDCCLK
。 似乎循环将非常低效。 我应该打电话给sleep()
吗? 对 ADDCCLK 的任何解释也很有帮助。
这似乎也很重要,但我不知道它预示着什么:
时钟 controller 提供的 ADCCLK 时钟为同步 APB2 时钟。 RCU controller 具有用于 ADC 时钟的专用可编程预分频器。
我完全不确定,但我认为这是我想要的转换模式:
此模式可以在常规通道组上运行。 当 ADC_CTL1 寄存器中的 CTN 位置位时,将启用连续转换模式。 在此模式下,ADC 在 RSQ0[4:0] 中指定的通道上执行转换。 当 ADCON 设置为高电平时,一旦相应的软件触发或外部触发有效,ADC 就会对指定通道进行采样和转换。 转换数据将存储在 ADC_RDATA 寄存器中。
在常规通道上进行连续转换的软件程序。 为了摆脱检查,可以使用 DMA 来传输转换后的数据:
1.Set the CTN and DMA bit in the ADC_CTL1 register
2.Configure RSQ0 with the analog channel number
3.Configure ADC_SAMPTx register
4.Configure ETERC and ETSRC bits in the ADC_CTL1 register if in need
5.Prepare the DMA module to transfer data from the ADC_RDATA.
6.Set the SWRCST bit, or generate an external trigger for the regular group
ADCCLK
指 ADC 的输入时钟。 可以看看你的数据表。 大多数μC都有一个μC时钟架构的框图,通常有一个主系统时钟,然后不同的外设有一个可以编程的预分频器,它将系统时钟除以2的某个幂。
所以14 ADCCLK
周期意味着它不是 14 个 CPU 周期,而是 14 个 ADC-Input-Clock 边沿。 例如,如果 ADC 预分频器设置为 64,那么您必须等待 64*14 个 CPU 时钟周期。
如何等待:
大多数情况下(我不知道您的设备上是否存在这种情况)外围设备有一个忙标志,只要当前操作正在进行,就会设置该标志。 所以可能你可以轮询这个标志(例如while (ADC0_FLAGS & ADC_ISBUSY);
)。
另一种选择可能是检查是否存在表示操作完成的中断。 但至少对于校准来说,最简单的方法是开始校准,然后使用wait
或delay
function,这只会浪费一点时间。
我个人会在系统启动时开始校准,然后做其他初始化工作。 设置结束时可能会延迟几毫秒,以确保板上的所有组件都正确上电。 在那之后,ADC应该已经完成了很长时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.