AM57x 多核SoC开发板——GPMC的多通道AD采集综合案例手册(下)

2022-05-11 14:44:48 浏览数 (1)

本文档适用开发环境:

Windows开发环境:Windows 7 64bit、Windows 10 64bit

Linux Processor SDK:ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05

RTOS Processor SDK:ti-processor-sdk-rtos-am57xx-evm-04.03.00.05

CCS:CCS7.4

本案例主要是通过GPMC接口采集AD7606或ADS8568模块输入的AD信号,由DSP端对AD信号进行FFT处理,并由ARM端对AD信号进行Qt波形绘制、数据保存等,其中使用到的测试板卡为创龙科技的TL570x-EVM工业开发板。

创龙科技TL570x-EVM是一款基于TI Sitara系列AM5708 ARM Cortex-A15 浮点DSP C66x处理器设计的异构多核SoC评估板,由核心板和评估底板组成。典型应用在运动控制、工业PC、机器视觉、智能电力、视频监测等领域。

核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。开发板接口资源丰富,引出双路PRU百兆网口、千兆网口、USB 3.0、CAMERA、GPMC、HDMI、PCIe等接口,方便用户快速进行产品方案评估与技术预研。

接下来给大家分享案例编译和ARM(Host)端、DSP(Slave)端)的关键代码部分,

案例编译

请按照IPC异构多核开发手册搭好建基于Linux的IPC开发环境,并使能环境变量,然后按照如下方法编译案例。

将案例目录拷贝到Ubuntu,并将lib目录下的QWT库文件压缩包libqwt-6.1.3.tar.gz解压到lib目录下。

图 31图 31

进入src目录并打开products.mak文件,根据实际情况配置libqwt-6.1.3的目录路径。

Host# vim products.mak

图 32图 32
图 33图 33

修改完毕后保存退出,执行如下命令加载Linux Processor SDK环境变量,编译程序并安装程序镜像文件。

Host# source /home/tronlong/ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05/linux-devkit/environment-setup

Host# make -j 8 && make install

图 34图 34

命令执行完毕后,将在“install/tl-gpmc-ad-fft/debug/”目录下生成ARM端和DSP端可执行文件,分别为app_host和server_dsp1.xe66。

图 35图 35

关键代码

ARM(Host)端关键代码

图 36 Qt程序框架图 36 Qt程序框架
  1. 解析命令行参数,并显示Qt主窗口。
图 37 host/main.cpp图 37 host/main.cpp
  1. 申请CMEM共享内存空间,并转换为实际物理地址。在共享内存空间中申请两个Buffer空间,分别用于存放AD信号时域数据和经FFT处理的频域数据。申请的两个Buffer空间的内存地址将会发送至DSP端,DSP端将一个通道的AD信号时域数据和经FFT处理的频域数据存放在Buffer空间。
图 38 host/app.c图 38 host/app.c
  1. 发送App_CMD_SETUP消息类型至DSP端,该消息携带申请好的Buffer空间物理地址等信息,并等待DSP端返回消息。
图 39 host/app.c图 39 host/app.c
图 40 host/app.c图 40 host/app.c
  1. 发送App_CMD_TEST消息类型至DSP端,该消息主要通知DSP端进行AD信号采集。DSP端每次采集512个点,并保存AD信号时域数据和经FFT处理的频域数据。该消息还携带loop_times参数,已设置为8。DSP端每循环8次,即采集并处理8x512=4096个点后返回消息至ARM端。

当运行“./app_host 0x01000000 6 10000 /home/root 7606”命令时,程序循环次数设置为10000,则总采样点个数为:4096*10000=40960000。

图 41 host/app.c图 41 host/app.c
  1. 发送App_CMD_SHUTDOWN信息类型至DSP端,通知DSP端结束程序的运行,并等待DSP端返回消息。
图 42 host/app.c图 42 host/app.c
  1. Qt App线程接收到DSP端的通知后,通过信号槽通知主线程绘制波形。
图 43 host/app_thread.cpp图 43 host/app_thread.cpp
  1. 分别绘制时域波形和频域波形。
图 44 host/plot.cpp图 44 host/plot.cpp
  1. 将时域和频域数据写入文件。
图 45 host/file.cpp图 45 host/file.cpp

DSP(Slave)端关键代码

  1. 监听slaveQue消息队列,等待ARM端发送消息。

根据消息携带的“msg->cmd”参数来判断不同的消息类型,从而进入相应的处理函数。处理结束后,返回消息至ARM端。

图 46 dsp1/Server.c图 46 dsp1/Server.c
  1. 响应ARM端发送的App_CMD_SETUP消息类型,调用ad_init和ad_test_init初始化函数。
图 47 dsp1/Server.c图 47 dsp1/Server.c

ad_init()主要实现Timer、GPIO、GPMC等和AD芯片硬件相关的程序初始化。

图 48 dsp1/ad_test.c图 48 dsp1/ad_test.c
图 49 dsp1/ad_test.c图 49 dsp1/ad_test.c

ad_test_init()主要用于程序运行环境的准备,如信号量、内存申请、EDMA3初始化、FFT初始化等。

图 50 dsp1/ad_test.c图 50 dsp1/ad_test.c
  1. 程序通过EDMA GPIO event方式采集AD信号。

定时器创建后,将以固定的时间间隔进入定时器中断服务函数。在中断服务函数中通过CONVST引脚触发AD信号采集来控制采样频率。每次采集转换完成后,AD芯片的Busy引脚将触发GPIO2的下降沿中断,从而触发EDMA传输。

图 51 dsp1/ad_test.c图 51 dsp1/ad_test.c
  1. EDMA传输完成后,将进入EDMA中断服务函数。在中断服务函数中统计采样点个数,当采样点个数达到ADC_SAMPLING_FFT_NUM(512)个后,将置位信号量,通知任务进行数据处理。
图 52 dsp1/ad_test.c图 52 dsp1/ad_test.c
  1. DSP端响应ARM端发送的App_CMD_SETUP消息类型,调用ad_test()进行数据处理。
  • 使能定时器,使定时器按固定周期触发AD信号采集。 阻塞等待信号量置位,信号量置位后,对数据进行保存、FFT运算等操作。

备注:测试采集周期为6us,采集满ADC_SAMPLING_FFT_NUM(512)个点后置位信号量,通知任务进行数据处理,所以设置Semaphore_pend超时时间为10ms,若用户设置采集周期过长,如60us,则采集满512个点需60 * 512 = 30.72ms,则需要对应增加下图Semaphore_pend超时时间。

图 53 dsp1/ad_test.c图 53 dsp1/ad_test.c
图 54 dsp1/ad_test.c图 54 dsp1/ad_test.c

补充说明

  1. 程序默认使用GPTimer6定时器以固定时间间隔触发AD模块的采集信号,控制AD模块进行采集转换。如需更换为其他定时器,请按照如下方法进行修改。

① 修改dsp1/ad_test.c文件,唤醒指定定时器的时钟。

图 55图 55

② 修改dsp1/Dsp1.cfg文件,timerSetting[5]代表为timer6,可修改为用户指定定时器。8代表绑定定时器中断至CPU Int8,该编号一般无需改动。

图 56图 56

③ 修改dsp1/ad_test.c文件,下图中的Timer_create()的参数5可修改为用户指定的定时器。

图 57图 57
  1. 程序使用DSP端初始化GPMC总线,并设置GPMC时序。可查看dsp1/ad_test.c中的gpmc_init()的GPMC配置方式与时序参数。
图 58图 58
图 59图 59

好了,本期的案例分享就到这里了,想要查看关于TL570x-EVM开发板(异构多核SoC)的规格书,详细参数资料更多内容,欢迎评论区留言。

0 人点赞