#申请原创# #每日话题# #有奖活动# #技术资源# #申请开发板#
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
|