本帖最后由 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
|