我希望用RISC-V GD32VF103CBT6开发委员会制作一个非常基本的音频效果设备。我设法用另一个单片机做了一些基于硬件中断的采样,但我对RISC-V板的文档感到有点困惑。用户手册第11章。我一点也不知道如何将那里的指令转换成实际的C/C++代码。可悲的是,他们的github回购几乎没有任何例子,似乎没有处理高速采样。这个github回购中也有一个数据表,但我也无法在其中找到任何具体的代码示例或显示说明。
我想做的是:
第11.4.1节明确规定
在开始A/D转换之前,应该进行校准。校准是由软件启动的,通过设置位CLB=1,在所有校准序列中,定位位保持在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:如何将这些内存寄存器设置为指示的这些指令。我需要一个代码示例,而制造商没有提供任何代码示例。
delay 14 ADDCCLK 问题2:如何在C/C++中实现?似乎一个循环会非常低效。我该打电话给sleep()吗?对ADDCCLK的任何解释也有帮助。
这似乎也很重要,但我不知道它预示着什么:
时钟控制器提供的ADCCLK时钟是同步APB2时钟。RCU控制器具有用于ADC时钟的专用可编程预分频器。
我一点也不确定,但我认为这是我想要的转换模式:
连续转换模式
此模式可在常规信道组上运行。在设置ADC_CTL1寄存器中的CTN位时,将启用连续转换模式。在这种模式下,ADC对RSQ04: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发布于 2020-07-15 13:00:43
ADCCLK指模数转换器的输入时钟。可以看看你的数据表。大多数C都有C时钟结构的框图,通常有一个主系统时钟,然后不同的外围设备有一个预分频器,您可以编程,并将系统时钟除以一定的2次方。
因此,14 ADCCLK周期意味着它不是14个CPU周期,而是14个ADC输入时钟边缘.例如,如果ADC预分频器设置为64,则必须等待64*14 CPU时钟周期。
如何等待:
大多数情况下(我不知道设备上是否存在这样的东西)外围设备有一个繁忙的标志,只要当前的操作正在进行,就会设置它。因此,您可以轮询此标志(例如,while (ADC0_FLAGS & ADC_ISBUSY); )。
另一种选择可能是检查是否有一个中断指示您的操作完成。但是至少对于校准来说,最简单的事情就是开始校准,只使用一个wait或delay函数,这只会浪费一点时间。
我个人会在系统启动时开始校准,然后再做其他初始化工作。安装结束时可能会延迟几毫秒,以确保板上的所有组件都能正确启动。在此之后,ADC应该已经完成了很长时间。
https://stackoverflow.com/questions/62798494
复制相似问题