打印
[ARM入门]

「案例分享」基于 AM57x+ Artix-7 FPGA开发板——PRU开发手册详解

[复制链接]
687|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创# #每日话题# #有奖活动# #技术资源# #申请开发板#
PRU-ICSS(可编程实时单元子系统和工业通信子系统,简称PRU)由双32位RISC核(PRU可编程实时单元)、共享数据和指令存储器、内部外围模块和中断控制器(INTC)组成。PRU可以通过L3_MAIN interconnect上的主端口访问设备上的所有资源,反之,外部主机处理器可以通过L3_MAIN slave端口访问PRU资源。


本指导文档适用开发环境:
Windows开发环境:Windows 7 64bit、Windows 10 64bit
CCS:CCS7.4.0
PRU编译器:ti-cgt-pru_2.3.3
PRU开发包:pru-icss-5.1.0

PRU详细说明可查阅产品资料“6-开发参考资料\数据手册\核心板元器件\CPU\”目录下《AM572x Sitara Processor Technical Reference Manual》手册的PRU章节。
创龙科技TL5728F-EVM是一款基于TI Sitara系列AM5728(双核ARM Cortex-A15 +浮点双核DSP C66x) + Xilinx Artix-7 FPGA处理器设计的高端异构多核评估板,由核心板与评估底板组成。AM5728与Artix-7在核心板内部通过GPMC、I2C通信总线连接,在评估底板通过PCIe通信总线连接核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。

评估板接口资源丰富,引出双路千兆网口、双路SFP光口、USB 3.0、CAN、RS485、SATA、HDMI、GPMC、FMC等接口,方便用户快速进行产品方案评估与技术预研。


图 1

通常ARM Cortex-A15核心运行Linux系统,ARM核心通过pruss和pru rproc驱动程序,将固件加载至PRU,并提供启动、停止等基本控制。通过驱动程序RPMsg(remote processor message)实现通信,它允许PRU和ARM核心互相传递消息。



图 2

驱动程序详细使用说明可参考:https://software-dl.ti.com/processor-sdk-linux/esd/docs/04_03_00_05/linux/Industrial_Protocols.html#linux-drivers。
本文档涉及的案例位于产品资料“4-软件资料\Demo\PRU-demos\”目录下。


表 1

案例
目录
目录说明
pru_rpmsg_led_flash
project
存放CCS工程。
image
存放应用程序镜像、动态设备树。
pru_rpmsg_pulse_motor
linux_demo
bin:存放可执行文件;
src:存放源码;
dts:
存放动态设备树文件及其镜像。

pru_demo
project:存放CCS工程;
bin:存放应用程序镜像。


pru_rpmsg_led_flash案例案例功能:ARM与PRU之间使用RPMsg实现数据交互,ARM通过RPMsg传输数据至PRU,PRU根据数据内容控制评估底板LED3。


案例测试将本案例image目录下的tl572x-pru-overlay.dtbo、pru_rpmsg_led_flash.out文件拷贝至评估板文件系统"/lib/firmware/"目录下。



图 3



执行如下命令,通过加载动态设备树将LED对应的IO模式配置为PRU专属IO。
Target# mkdir /configfs //如configfs文件夹已存在,请跳过此命令
Target# mount -t configfs configfs /configfs
Target# mkdir /configfs/device-tree/overlays/pru
Target# echo -n "tl572x-pru-overlay.dtbo" > /configfs/device-tree/overlays/pru/path



图 4



执行如下命令,进入"/lib/firmware/"目录,建立新的PRU固件链接。
Target# cd /lib/firmware/
Target# ln -s pru_rpmsg_led_flash.out am57xx-pru1_0-fw



图 5



执行如下命令,将PRU固件pru_rpmsg_led_flash.out加载至pru1_0核。
Target# echo 'start' > /sys/class/remoteproc/remoteproc4/state



图 6



执行如下命令,通过"/dev/rpmsg_pru30"节点发送数据信息至PRU,实现控制评估底板LED的亮灭。
Target# echo on > /dev/rpmsg_pru30 //点亮LED
Target# echo off > /dev/rpmsg_pru30 //熄灭LED


图 7



执行如下命令,可停止运行PRU固件。
Target# echo 'stop' > /sys/class/remoteproc/remoteproc4/state


图 8



案例编译动态设备树编译将本案例image目录下的tl572x-pru-overlay.dts文件,拷贝至Ubuntu内核源码的"arch/arm/boot/dts/"目录下。


图 9



在内核源码所在目录下,执行如下命令编译动态设备树。
Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tl572x-pru-overlay.dtbo



图 10




图 11



将编译生成的动态设备树tl572x-pru-overlay.dtbo,拷贝至评估板文件系统"/lib/firmware/"目录下即可。


PRU案例编译

打开CCS7.4.0,点击"Project -> Import CCS Projects…",导入CCS工程。



图 12



在弹出的界面中点击"Browse…",选择非中文路径下的案例project目录,然后点击Finish。



图 13



请将“4-软件资料\Demo\PRU-demos\pru-icss-5.1.0.zip”压缩包解至CCS7.4.0安装目录,右击工程后点击Properties选项,重新指定PRU案例的头文件和库文件路径。
备注:pru-icss-5.1.0.zip压缩包源自Processor-SDK安装包"ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05\example-applications\pru-icss-5.1.0\"文件夹。



图 14



进入工程属性设置界面后依次点击"Resource -> Linked Resources",选中"PRU_DEMO_DIR"后点击"Edit…"。



图 15



在弹出的界面中点击"Folder…",选择pru-icss-5.1.0所在路径,然后点击OK。



图 16



点击OK完成配置,右击工程选择"Build Project"或"Rebuild Project"即可进行工程编译。

图 17



关键代码允许PRU访问OCP主端口,以便PRU可读取外部存储器;清除PRU系统事件状态。



图 18



初始化RPMsg,并创建ARM和PRU的RPMsg通道



图 19



等待ARM通过RPMsg发送数据,并根据数据内容控制LED亮灭。通过PRU的__R30寄存器控制LED。



图 20



pru_rpmsg_pulse_motor案例案例功能:PRU根据ARM传输的数据内容,控制电机驱动器的PUL和DIR管脚来调整电机的转速和转动方向。ARM通过监听按键事件,然后通过RPMsg传输频率数据至PRU,从而控制电机的转动速度。
程序流程框图如下:



图 21



案例测试本案例使用锐特技术的42步进电机(型号为42CM04)和驱动器(型号为DM320C),按照下图将评估板与电机进行连接。
表 2 评估板J3接口与电机接口引脚对应关系


评估底J3接口
电机驱动器接口
GPMC_A10(PIN 5)
DIR+
GPMC_A11(PIN 6)
PUL+
GND(PIN 44)
PUL-
GND(PIN 17)
DIR-


图 22 评估板J3接口原理图




图 23



将电机驱动器拨码开关(SW1~SW6)拨至010000,即电流设置为1.7A,细分设置为6400脉冲/转。



图 24



将案例"linux_demo\dts\image\"目录下的动态设备树文件和"pru_demo\bin\"目录下的.out文件拷贝至评估板文件系统"/lib/firmware/"目录下。



图 25



执行如下命令,通过加载动态设备树将评估板J3接口的上的GPMC_A10和GPMC_A11对应的IO模式修改为GPIO模式。
Target# mkdir /configfs //如configfs文件夹已存在,请跳过此命令
Target# mount -t configfs configfs /configfs
Target# mkdir /configfs/device-tree/overlays/pru
Target# echo -n "tl572x-pru-overlay.dtbo" > /configfs/device-tree/overlays/pru/path



图 26



执行如下命令,进入"/lib/firmware/"目录,将原有的PRU固件链接删除,并建立新的PRU固件链接。
Target# cd /lib/firmware/
Target# rm am57xx-pru1_0-fw //如测试过其它案例,请执行此命令,否则请忽略
Target# ln -s pru_rpmsg_pulse_motor.out am57xx-pru1_0-fw



图 27



执行如下命令,将PRU固件pru_rpmsg_pulse_motor.out加载至pru1_0核。
Target# echo 'start' > /sys/class/remoteproc/remoteproc4/state



图 28



基于命令行控制电机通过"/dev/rpmsg_pru30"节点向PRU发送字符,PRU根据数据内容控制电机驱动器的PUL和DIR管脚来选择电机的转速和转动方向。电机默认脉冲频率为0Hz,细分设置为6400脉冲/转,即默认转速为0r/s。可通过RPMsg设置脉冲频率,如设置脉冲频率为32KHz,即转速 = 32KHz / 6400 = 5r/s。
设置电机顺时针正向转动
Target# echo FWD > /dev/rpmsg_pru30 //电机顺时针正向转动
Target# echo 32000 > /dev/rpmsg_pru30 //3200为脉冲频率



图 29



设置电机逆时针反向转动
Target# echo REV > /dev/rpmsg_pru30 //电机逆时针反向转动
Target# echo 'stop' > /sys/class/remoteproc/remoteproc4/state //停止运行PRU固件,电机停止


图 30



基于应用程序控制电机将案例"linux_demo\bin\"目录下的pru_rpmsg_pulse_motor可执行文件拷贝至评估板文件系统,评估板上电启动,加载动态设备树和PRU固件。



图 31



执行如下命令,运行pru_rpmsg_pulse_motor测试程序。
Target# ./pru_rpmsg_pulse_motor -d /dev/rpmsg_pru30



图 32



程序启动后,按下评估板的USER0(KEY3)用户按键控制电机开始转动。
案例所使用电机支持6档调速,从电机运转开始,每按下一次按键,档位加1,电机转动速度变快;当转速达到6档后,每按下一次按键,档位减1,电机转动速度变慢。当减到0挡后,再加档,以此循环。


案例编译

动态设备树编译

将案例"linux_demo\dts\src\"目录下的tl572x-pru-overlay.dts文件拷贝至Ubuntu内核源码的"arch/arm/boot/dts/"目录下。



图 33



在内核源码所在目录下,执行如下命令编译动态设备树。
Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tl572x-pru-overlay.dtbo



图 34




图 35



将编译生成的动态设备树tl572x-pru-overlay.dtbo,拷贝至评估板文件系统"/lib/firmware/"目录下即可。
linux_demo编译将本案例linux_demo目录下的源码src拷贝至Ubuntu工作目录下,执行如下命令进行编译。
Host# source /home/tronlong/ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05/linux-devkit/environment-setup
Host# make



图 36



PRU案例编译打开CCS7.4.0,点击"Project -> Import CCS Projects…",导入CCS工程。



图 37



在弹出的界面中点击Browse,选择非中文路径下的案例project目录,然后点击Finish。



图 38



进入工程属性设置界面后依次点击"Resource -> Linked Resources",选中PRU_DEMO_DIR后点击"Edit…"。



图 39



在弹出的界面中点击"Folder…",选择pru-icss-5.1.0所在路径,然后点击OK。



图 40



点击OK完成配置,右击工程选择"Build Project"或"Rebuild Project"即可进行工程编译。



图 41



关键代码

PRU案例代码

允许PRU访问OCP主端口,以便PRU可读取外部存储器;清除PRU系统事件状态。



图 42



初始化RPMsg,并创建ARM和PRU的RPMsg通道。



图 43



PUL管脚输入所设置的脉冲频率的脉冲。



图 44



等待ARM通过RPMsg发送数据,PRU根据数据内容控制电机驱动器的PUL和DIR管脚来调整电机的转速和转动方向。



图 45



Linux案例代码打开key和rpmsg_pru设备节点。



图 46



监听按键事件。



图 47



控制电机转动速度。



图 48





使用特权

评论回复

相关帖子

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

本版积分规则

315

主题

323

帖子

4

粉丝