如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样

how to offload precise ADC oversampling with RISC-V GD32VF103CBT6 Development Board

本文关键字:ADC 采样 卸载 RISC-V 何用 GD32VF103CBT6 开发      更新时间:2023-10-16

我希望使用RISC-V GD32VF103CBT6开发板开发一个非常基本的音频效果设备。我已经设法用另一个MCU进行了一些基于硬件中断的采样,但我对RISC-V板的文档有点困惑。用户手册第11章。我根本不知道如何将那里的指令转化为实际的C/C++代码。遗憾的是,他们的github回购几乎没有任何例子,似乎也没有一个能处理高速采样。这个github repo中还有一个数据表,但我也没能在其中找到任何具体的代码示例或说明。

我想做的是:

  • 执行用户手册中描述的校准,必须在采样操作之前进行
  • 使用其过采样能力从外部引脚收集音频信号电压的12位音频样本,以高采样率将多个12位样本相加为单个16位样本。最终,我希望以48khz-96khz的16位采样音频
  • 我需要帮助指示MCU使用其内置的硬件功能来收集这些样本
  • 我想不断地采样,尽可能多地卸载到内置的硬件功能中,这样我就可以留下足够的处理开销来做一些信号处理,以获得简单的效果

第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:如何按照这些指示设置这些内存寄存器。我需要一个代码示例,但制造商没有提供。

问题2:如何在C/C++中使用delay 14 ADDCCLK。看起来循环会非常低效。我应该打sleep()吗?对ADDCCLK的任何解释也很有帮助。

这似乎也很重要,但我不知道它预示着什么:

时钟控制器提供的ADCCLK时钟是同步APB2时钟。RCU控制器具有用于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的幂。

所以CCD_ 4周期意味着其不是14个CPU周期而是14个ADC输入时钟沿。例如,如果ADC预分频器设置为64,则必须等待64*14个CPU时钟周期。

如何等待:
大多数情况下(我不知道您的设备上是否存在这种情况(,只要当前操作正在进行,外围设备就会设置繁忙标志。因此,您可以轮询此标志(例如,像while (ADC0_FLAGS & ADC_ISBUSY);(。

另一种选择可能是检查是否有中断信号表明您的操作完成。但至少对于校准来说,最简单的事情是开始校准,只使用waitdelay函数,这只会浪费一点时间。

我个人会在系统启动时开始校准,然后做其他初始化工作。设置结束时可能会延迟几毫秒,以确保板上的所有组件都正确通电。在那之后,ADC应该已经完成了很长一段时间。