电子产业一站式赋能平台

PCB联盟网

搜索
查看: 2325|回复: 0
收起左侧

创龙OMAPL138 PRU开发例程

[复制链接]

678

主题

902

帖子

8293

积分

高级会员

Rank: 5Rank: 5

积分
8293
发表于 2020-7-14 11:19:21 | 显示全部楼层 |阅读模式
本帖最后由 peng85246 于 2020-7-14 14:24 编辑

Revision History
DraftDate
Revision No.
Description
2016/05/25
V1.1
1.模板更新。
2015/04/28
V1.0
1.初始版本。

1 环境搭建1.1安装
PRU的SDK源码ti-pru-sw-1.00.00-r0+svnr33.tar.bz2位于光盘资料tools目录下,将此文件解压到虚拟机任意路径下,解压后如下图所示:
​
图 1

1.2 编译pru-sdk包
执行以下命令进行编译:
Host# make CROSS_COMPILE=arm-none-linux-gnueabi- LINUXKERNEL_INSTALL_DIR=/home/tl/omapl138/linux-3.3
编译成功如下图所示:
​
图 2

参数解析:
CROSS_COMPILE交叉编译工具链;
LINUXKERNEL_INSTALL_DIR:内核安装路径;
请务必使用创龙提供的linux-3.3内核源码进行编译,编译前确保内核源码已正确编译过

1.3 安装pru-sdk包到文件系统中
执行以下命令进行编译:
Host# sudo make  DESTDIR=/home/tl/omapl138/rootfs install
安装完如下图所示:
​
图 3

参数解析:
DESTDIR:文件系统位置;

2  LED开发例程
本例程主要通过PRU控制开发板LED灯的闪烁。
2.1源码安装
源码路径位于光盘资料"demo/app/tl-pru-example/tl-pru-leds.tar.bz2",将源码解压到虚拟机任意路径下,如下图所示:
​
图 4

2.2 修改配置文件
修改Rules.make配置文件:
CCTOOLS?=arm-none-linux-gnueabi-gcc   //交叉编译工具链

# where the ti_pru_sw path
PRU_SW_DIR=/home/tl/pru/pru-sdk/ti-pru-sw-1.00.00-r0+svnr33   //PRU_SDK安装目录
LIBDIR_APP_LOADER?=$(PRU_SW_DIR)/app_loader/lib
INCDIR_APP_LOADER?=$(PRU_SW_DIR)/app_loader/include
UTILS_DIR=$(PRU_SW_DIR)/utils
如下图所示:
​
图 5

2.3 编译
执行以下命令进行编译:
Host# make
​
图 6

编译生成的可执行文件位于bin目录下,如下图所示:
​
图 7

2.4 运行程序
将bin目录中的tl-pru-leds和tl-pru-leds.bin目标文件拷贝到开发板上,并放于同一目录下。在此目录下执行以下命令:
Target# ./tl-pru-leds
如下图所示:
​
图 8

演示现象:
开发板LED会同时闪烁十次。

3 按键开发例程
本例程演示PRU通过按键对LED灯进行控制。
开发板LED编号和GPIO对应关系如下:

表 1
开发板型号
GPIO0[0]
GPIO0[5]
GPIO0[1]
GPIO0[2]
TL138/1808-EVM
D7
D6
D9
D10
TL138/1808-EasyEVM
D7
D6
D9
D10
TL138/1808-EthEVM
D7
D6
D9
D10
TL138/1808F-EasyEVM
\
GD1
GD2
GD3
TL138/1808F-EVM
\
D1
D2
D3

3.1 源码安装
源码路径位于光盘资料"demo/app/tl-pru-example/tl-pru-keys.tar.bz2",将源码解压到虚拟机任意路径下,如下图所示:
​
图 9

3.2 修改配置文件
修改Rules.make配置文件:
CCTOOLS?=arm-none-linux-gnueabi-gcc   //交叉编译工具链

# where the ti_pru_sw path
PRU_SW_DIR=/home/tl/pru/pru-sdk/ti-pru-sw-1.00.00-r0+svnr33   //PRU_SDK安装目录
LIBDIR_APP_LOADER?=$(PRU_SW_DIR)/app_loader/lib
INCDIR_APP_LOADER?=$(PRU_SW_DIR)/app_loader/include
UTILS_DIR=$(PRU_SW_DIR)/utils
如下图所示:
​
图 10

3.3编译
执行以下命令进行编译:
Host# make
​
图 11

编译生成的可执行文件位于当前bin目录下,如下图所示:
​
图 12

3.4运行程序
将bin目录中的tl-pru-keys和tl-pru-keys.bin目标文件拷贝到开发板上,并放于同一目录下。在此目录下执行以下命令:
Target# ./tl-pru-keys
如下图所示:
​
图 13

演示现象:
以TL138-EVM为例,开发板LED D6被点亮,按下按键SW5时LED D9会被点亮,按下按键SW6时,LED D10会被点亮,大约历时10s,测试程序执行完毕,LED D6熄灭,程序退出。

[url=]4 程序代码分析[/url]
以LED例程为例:
Linux端代码分析
程序设计流程如下:
  • 初始化pru模块
  • 打开pru中断
  • 下载程序到pru中
  • 等待程序执行完毕,pru会发送一个中断给arm
  • 关闭pru并退出
Linux端代码主要位于tl-pru-leds.c文件内,代码如下图所示:
​
图 14

PRU端代码分析
PRU端代码主要位于tl-pru-leds.p文件内,主要以汇编为主。主函数程序工作流程如下:
  • Pinmux配置
  • Gpio Direct配置
  • Gpio Data输出1,LED ON
  • 延时
  • Gpio Data输出0,LED OFF

/*程序入口地址,汇编程序需要注明入口地址*/
.origin 0            //表示PRU从程序的0开始的位置开始取指
.entrypoint START //告诉编译器,程序入口地址是从label:START开始
/*宏定义*/
#define LOOP_TIMES 10 // define the LED flash times

// Refer to this mapping in the file - \prussdrv\include\pruss_intc_mapping.h
#define PRU0_ARM_INTERRUPT 34

#define GPIO_BASE 0x01E26000 // the base address of GPIO registers
#define GPIO01_DIRECT 0x10 // the offset address of DIR01 register
#define GPIO0_SETDATAOUT 0x18 // the offset address of SET_DATA01  registers
#define GPIO0_CLEARDATAOUT 0x1C // the offset address of CLR_DATA01 registers

#define SYSCFG_BASE 0x01c14000
#define PINMUX1_OFFSET 0x124

// PINMUX_GPIO0_0  PINMUX_GPIO0_1  PINMUX_GPIO0_2  PINMUX_GPIO0_5
#define PINMUX1_GPIO_LED_MASS (0xf << 28 | 0xf << 24 | 0xf << 20 | 0xf << 8)
#define PINMUX1_GPIO_LED (0x8 << 28 | 0x8 << 24 | 0x8 << 20 | 0x8 << 8)

/*START标号开始了PRU程序,类似C程序从main函数开始*/
START:

// setup pinmux gpio led
MOV r3, SYSCFG_BASE + PINMUX1_OFFSET
LBBO r2, r3, 0, 4

MOV r4, PINMUX1_GPIO_LED_MASS
NOT r4, r4
AND r2, r2, r4

MOV r4, PINMUX1_GPIO_LED
OR r2, r2, r4
SBBO r2, r3, 0, 4

/*函数的定义*/
// Delay 200ms funcation
DELAY_400MS:
MOV r0, 45600000 // delay: 400ms
LOOP_DELAY: // PRU CORE CLK: 228MHz, cycle:8.77ns
SUB r0, r0, 1 // 1 CPI
QBNE LOOP_DELAY, r0, 0 // 1 CPI
RET

/*函数的调用*/
CALL DELAY_400MS // Call to delay some time
/*发送中断信号给ARM*/
// Send notification to Host for program completion
MOV r31.b0, #PRU0_ARM_INTERRUPT
/*关闭PRU*/
// Halt the processor
HALT

附录

图15



嵌入式DSP、ARM、FPGA多核技术开发,学习资料下载:http://site.tronlong.com/pfdownload
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表