当前位置:网站首页>「案例分享」基于 AM57x+ Artix-7 FPGA开发板——PRU开发手册详解
「案例分享」基于 AM57x+ Artix-7 FPGA开发板——PRU开发手册详解
2022-06-11 18:16:00 【Tronlong创龙】
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:存放可执行文件; |
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/"目录下。

图 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
边栏推荐
- 最长严格递增子序列
- v-for中的key的作用和原理
- “LSTM之父”新作:一种新方法,迈向自我修正的神经网络
- Quanzhi technology T3 development board (4-core arm cortex-a7) - video development case
- 全志科技T3开发板(4核ARM Cortex-A7)——MQTT通信协议案例
- Ubuntu installs PSQL and runs related commands
- ubuntu 安装psql以及运行相关命令
- 合并多棵二叉搜索树
- [c language] compress strings and add markup characters
- HashSet集合
猜你喜欢

New work of "the father of LSTM": a new method towards self correcting neural network

SISO Decoder for SPC (补充章节1)

Niu Ke swipes the question -- converting a string to an integer

Ti am64x - the latest 16nm processing platform, designed for industrial gateways and industrial robots

* Jetpack 笔记 使用DataBinding

为何TI的GPMC并口,更常被用于连接FPGA、ADC?我给出3个理由

VIM common commands
![[C语言]限制查找次数,输出次数内查找到的最大值](/img/e6/cbb8dd54b49ade453251a70c8455e8.png)
[C语言]限制查找次数,输出次数内查找到的最大值

TR-069 protocol introduction

使用mysql判断日期是星期几
随机推荐
async导致函数结果出乎意料,改变原来代码的意图;await is only valid in async functions and the top level bodies of modules
力扣刷题——二叉树的层序遍历
LDAP 目录服务器的现代化应用
On the problem that the while loop condition in keil does not hold but cannot jump out
论工作流选型
[C语言]对一个数组的元素排序后平移元素
[C语言]用结构体把输入的指定分数范围内的学生输出
[golang] leetcode - 292 Nim games (Mathematics)
[c language] output students' names and scores in descending order of scores with structures
LDPC 7 - 解码简单例子
SISO Decoder for SPC (补充章节1)
Quanzhi Technology T3 Development Board (4 Core ARM Cortex - A7) - mqtt Communication Protocol case
力扣39题组合总和
TR-069 protocol introduction
非递归实现二叉树的前、中、后序遍历
力扣34在排序数组中查找元素的第一个和最后一个位置
金融银行_催收系统简介
高并发架构设计
IEDA 底层菜单菜单简介
Common operations of Visio