TI AM57x+ Artix-7 FPGA——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-ICSS(可编程实时单元子系统和工业通信子系统,简称PRU)由双32位RISC核(PRU可编程实时单元)、共享数据和指令存储器、内部外围模块和中断控制器(INTC)组成。PRU可以通过L3_MAIN interconnect上的主端口访问设备上的所有资源,反之,外部主机处理器可以通过L3_MAIN slave端口访问PRU资源。
PRU详细说明可查阅产品资料“6-开发参考资料\数据手册\核心板元器件\CPU\”目录下《AM572x Sitara Processor Technical Reference Manual》手册的PRU章节。
本文测试板卡为TI Sitara系列AM5728(双核ARM Cortex-A15 +浮点双核DSP C66x) + Xilinx Artix-7 FPGA处理器设计的高端异构多核开发板(型号:TL5728F-EVM)。
通常ARM Cortex-A15核心运行Linux系统,ARM核心通过pruss和pru rproc驱动程序,将固件加载至PRU,并提供启动、停止等基本控制。通过驱动程序RPMsg(remote processor message)实现通信,它允许PRU和ARM核心互相传递消息。
驱动程序详细使用说明可参考: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:存放可执行文件; |
pru_demo |
project:存放CCS工程; |
pru_rpmsg_led_flash案例
案例功能:ARM与PRU之间使用RPMsg实现数据交互,ARM通过RPMsg传输数据至PRU,PRU根据数据内容控制评估底板LED3。
案例测试
将本案例image目录下的tl572x-pru-overlay.dtbo、pru_rpmsg_led_flash.out文件拷贝至评估板文件系统"/lib/firmware/"目录下。
执行如下命令,通过加载动态设备树将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
执行如下命令,进入"/lib/firmware/"目录,建立新的PRU固件链接。
Target# cd /lib/firmware/
Target# ln -s pru_rpmsg_led_flash.out am57xx-pru1_0-fw
执行如下命令,将PRU固件pru_rpmsg_led_flash.out加载至pru1_0核。
Target# echo 'start' > /sys/class/remoteproc/remoteproc4/state
执行如下命令,通过"/dev/rpmsg_pru30"节点发送数据信息至PRU,实现控制评估底板LED的亮灭。
Target# echo on > /dev/rpmsg_pru30 //点亮LED
Target# echo off > /dev/rpmsg_pru30 //熄灭LED
执行如下命令,可停止运行PRU固件。
Target# echo 'stop' > /sys/class/remoteproc/remoteproc4/state
案例编译
动态设备树编译
将本案例image目录下的tl572x-pru-overlay.dts文件,拷贝至Ubuntu内核源码的"arch/arm/boot/dts/"目录下。
在内核源码所在目录下,执行如下命令编译动态设备树。
Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tl572x-pru-overlay.dtbo
将编译生成的动态设备树tl572x-pru-overlay.dtbo,拷贝至评估板文件系统"/lib/firmware/"目录下即可。
PRU案例编译
打开CCS7.4.0,点击"Project -> Import CCS Projects…",导入CCS工程。
在弹出的界面中点击"Browse…",选择非中文路径下的案例project目录,然后点击Finish。
请将“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\"文件夹。
进入工程属性设置界面后依次点击"Resource -> Linked Resources",选中"PRU_DEMO_DIR"后点击"Edit…"。
在弹出的界面中点击"Folder…",选择pru-icss-5.1.0所在路径,然后点击OK。
点击OK完成配置,右击工程选择"Build Project"或"Rebuild Project"即可进行工程编译。
关键代码
允许PRU访问OCP主端口,以便PRU可读取外部存储器;清除PRU系统事件状态。
初始化RPMsg,并创建ARM和PRU的RPMsg通道。
等待ARM通过RPMsg发送数据,并根据数据内容控制LED亮灭。通过PRU的__R30寄存器控制LED。
pru_rpmsg_pulse_motor案例
案例功能:PRU根据ARM传输的数据内容,控制电机驱动器的PUL和DIR管脚来调整电机的转速和转动方向。ARM通过监听按键事件,然后通过RPMsg传输频率数据至PRU,从而控制电机的转动速度。
程序流程框图如下:
案例测试
本案例使用锐特技术的42步进电机(型号为42CM04)和驱动器(型号为DM320C),按照下图将评估板与电机进行连接。
表 2 评估板J3接口与电机接口引脚对应关系
评估底J3接口 |
电机驱动器接口 |
GPMC_A10(PIN 5) |
DIR+ |
GPMC_A11(PIN 6) |
PUL+ |
GND(PIN 44) |
PUL- |
GND(PIN 17) |
DIR- |
将电机驱动器拨码开关(SW1~SW6)拨至010000,即电流设置为1.7A,细分设置为6400脉冲/转。
将案例"linux_demo\dts\image\"目录下的动态设备树文件和"pru_demo\bin\"目录下的.out文件拷贝至评估板文件系统"/lib/firmware/"目录下。
执行如下命令,通过加载动态设备树将评估板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
执行如下命令,进入"/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
执行如下命令,将PRU固件pru_rpmsg_pulse_motor.out加载至pru1_0核。
Target# echo 'start' > /sys/class/remoteproc/remoteproc4/state
基于命令行控制电机
通过"/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为脉冲频率
设置电机逆时针反向转动
Target# echo REV > /dev/rpmsg_pru30 //电机逆时针反向转动
Target# echo 'stop' > /sys/class/remoteproc/remoteproc4/state //停止运行PRU固件,电机停止
基于应用程序控制电机
将案例"linux_demo\bin\"目录下的pru_rpmsg_pulse_motor可执行文件拷贝至评估板文件系统,评估板上电启动,加载动态设备树和PRU固件。
执行如下命令,运行pru_rpmsg_pulse_motor测试程序。
Target# ./pru_rpmsg_pulse_motor -d /dev/rpmsg_pru30
程序启动后,按下评估板的USER0(KEY3)用户按键控制电机开始转动。
案例所使用电机支持6档调速,从电机运转开始,每按下一次按键,档位加1,电机转动速度变快;当转速达到6档后,每按下一次按键,档位减1,电机转动速度变慢。当减到0挡后,再加档,以此循环。
案例编译
动态设备树编译
将案例"linux_demo\dts\src\"目录下的tl572x-pru-overlay.dts文件拷贝至Ubuntu内核源码的"arch/arm/boot/dts/"目录下。
在内核源码所在目录下,执行如下命令编译动态设备树。
Host# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- tl572x-pru-overlay.dtbo
将编译生成的动态设备树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
PRU案例编译
打开CCS7.4.0,点击"Project -> Import CCS Projects…",导入CCS工程。
在弹出的界面中点击Browse,选择非中文路径下的案例project目录,然后点击Finish。
进入工程属性设置界面后依次点击"Resource -> Linked Resources",选中PRU_DEMO_DIR后点击"Edit…"。
在弹出的界面中点击"Folder…",选择pru-icss-5.1.0所在路径,然后点击OK。
点击OK完成配置,右击工程选择"Build Project"或"Rebuild Project"即可进行工程编译。
关键代码
PRU案例代码
允许PRU访问OCP主端口,以便PRU可读取外部存储器;清除PRU系统事件状态。
初始化RPMsg,并创建ARM和PRU的RPMsg通道。
PUL管脚输入所设置的脉冲频率的脉冲。
等待ARM通过RPMsg发送数据,PRU根据数据内容控制电机驱动器的PUL和DIR管脚来调整电机的转速和转动方向。
Linux案例代码
打开key和rpmsg_pru设备节点。
监听按键事件。
控制电机转动速度。
- 点赞
- 收藏
- 关注作者
评论(0)