基于DMA的ADC波形显示(AN9238)#
例程相关文件夹:an9238_wave
Vivado工程在vivado.zip压缩包中:an9238_wave
在SDK裸机例程里我们用DMA将ADC模块AN9238的数据采集到ddr中然后显示出波形,在上面的例程用我们也学习了DMA的读写测试,我们再这个读写测试的基础上写了一个ADC驱动,所以请大家在学习本章内容时请熟练掌握前面的例程。
例程资料中给出了vivado工程,petalinux工程,以及波形显示app。
ADC驱动#
ADC驱动是内核drivers/dma/xilinx目录中的axi_adc_dma.c,驱动编写时参考了同目录下的axidmatest.c文件和Xilinx官方例程“xapp1183”。
内核驱动配置#
内核驱动中涉及到drm显示的部分请参考第八章HDMI显示的内核配置,可以在HDMI显示的工程基础上添加下列配置,也可以用BSP包重新生成工程。
和前面的例程一样要配置一些外设显示的驱动,这里不再复述,主要是要额外配置ADC的驱动,在Device Drivers > DMA Engine support > Xilinx DMA Engines选项中选择<*> ALINX ADC DMA Test client for AXI DMA
设备树配置#
这里是修改了驱动的匹配选项,compatible = “alinx,axi-adc-dma”;用于匹配驱动程序。详细设备树可以参考例程petalinux工程目录下project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件
设备树修改技巧,先编译一次,然后到components/plnx_workspace/device-tree/device-tree-generation目录下找到pl.dtsi这里包含了所有PL端外设的设备树信息,最好不要直接修改这个文件,plnx_arm-system.dts是最后生成的文件,也是非常重要的信息,开发者可以自己好好研究一下这些文件。
应用程序#
应用程序采用Vitis编写,Vitis建立Linux应用程序的方法在前面的教程中讲到。
程序没有使用QT,而是直接绘制framebuffer,frame_buffer.c文件为Linux的fb操作。
adc_capture.c为波形采集模块,主要是打开ADC驱动
波形绘制函数完全来自裸机SDK
运行结果#
资料包中给出了编译好的程序在sd_boot目录,所有文件复制到sd卡根目录运行即可。
给AN9238第一通道输入峰峰值为5V,频率1Mhz的正弦波,波形显示如下。
AX7021硬件连接图(J15扩展口)
AX7020/AX7010硬件连接图(J11扩展口)
常见问题#
内核崩溃#
启动过程中有一定几率内核崩溃,原因未知,需要重启开发板