打印
[嵌入式Linux]

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

[复制链接]
3386|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#  #有奖活动# #技术资源# #申请开发板#
本文档适用开发环境:
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

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


图 32


图 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

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


图 35

关键代码

ARM(Host)端关键代码

图 36 Qt程序框架

解析命令行参数,并显示Qt主窗口。


图 37 host/main.cpp

申请CMEM共享内存空间,并转换为实际物理地址。在共享内存空间中申请两个Buffer空间,分别用于存放AD信号时域数据和经FFT处理的频域数据。申请的两个Buffer空间的内存地址将会发送至DSP端,DSP端将一个通道的AD信号时域数据和经FFT处理的频域数据存放在Buffer空间。


图 38 host/app.c
发送App_CMD_SETUP消息类型至DSP端,该消息携带申请好的Buffer空间物理地址等信息,并等待DSP端返回消息。


图 39 host/app.c


图 40 host/app.c

发送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

发送App_CMD_SHUTDOWN信息类型至DSP端,通知DSP端结束程序的运行,并等待DSP端返回消息。


图 42 host/app.c

Qt App线程接收到DSP端的通知后,通过信号槽通知主线程绘制波形。


图 43 host/app_thread.cpp
分别绘制时域波形和频域波形。


图 44 host/plot.cpp

将时域和频域数据写入文件。


图 45 host/file.cpp

DSP(Slave)端关键代码

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


图 46 dsp1/Server.c

响应ARM端发送的App_CMD_SETUP消息类型,调用ad_init和ad_test_init初始化函数。


图 47 dsp1/Server.c

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


图 48 dsp1/ad_test.c


图 49 dsp1/ad_test.c

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


图 50 dsp1/ad_test.c

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


图 51 dsp1/ad_test.c

EDMA传输完成后,将进入EDMA中断服务函数。在中断服务函数中统计采样点个数,当采样点个数达到ADC_SAMPLING_FFT_NUM(512)个后,将置位信号量,通知任务进行数据处理。


图 52 dsp1/ad_test.c

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


图 54 dsp1/ad_test.c

补充说明程序默认使用GPTimer6定时器以固定时间间隔触发AD模块的采集信号,控制AD模块进行采集转换。如需更换为其他定时器,请按照如下方法进行修改。
① 修改dsp1/ad_test.c文件,唤醒指定定时器的时钟。


图 55

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


图 56

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


图 57

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


图 58


图 59

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




使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

317

主题

325

帖子

4

粉丝