繁体   English   中英

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

[英]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中还有一个数据表,但我也无法在其中找到任何具体的代码示例或揭示指令。

我想做的是:

  • 执行用户手册中描述的校准,该校准必须先于采样操作。
  • 使用其过采样功能从外部引脚收集音频信号电压的 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:如何按照这些说明设置这些 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); )。

另一种选择可能是检查是否存在表示操作完成的中断。 但至少对于校准来说,最简单的方法是开始校准,然后使用waitdelay function,这只会浪费一点时间。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM