如何用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回购几乎没有任何例子,似乎也没有一个能处理高速采样。这个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);
(。
另一种选择可能是检查是否有中断信号表明您的操作完成。但至少对于校准来说,最简单的事情是开始校准,只使用wait
或delay
函数,这只会浪费一点时间。
我个人会在系统启动时开始校准,然后做其他初始化工作。设置结束时可能会延迟几毫秒,以确保板上的所有组件都正确通电。在那之后,ADC应该已经完成了很长一段时间。
- 如何用RISC-V GD32VF103CBT6开发板卸载精确的ADC过采样
- 如何使用采样器立方体作为数组
- 多重采样背景不显示
- 如何从wav文件中获取采样率?
- 如何对0,1,..中的k个随机数进行采样..,n-1,而不缓存到数组
- 如何使用TouchGFX在LCD屏幕上显示ADC值
- 如何在直接 x12 上使用多重采样
- 为什么 clang++ 更喜欢 adcx 而不是 adc
- 为什么当我选择>250000个采样点时,程序不起作用?
- 点云下采样和使用 PCL 进行正态估计
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"
- 在glTexImage2D中,当我选择与在着色器中采样不同的内部格式时,情况如何?
- 在我的 nucleo-L432KC 上设置时钟,使用 DMA 进行 5 通道 ADC 转换
- 使用哪个 pcl 滤波器对点云进行下采样
- 使用膨胀卷积的语义分割中的上采样
- 为什么找不到这个统一采样器2D?
- 如何在保持最小距离的同时沿有限线随机采样
- 使用GlblitFrameBuffer进行多样采样,无法使用OpenGL ES 3.0
- STM32 NVIC ADC中断未触发
- 如何将多个立方体纹理传递到均匀的采样器中