请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:BEAGLEBK
工具/软件:TI C/C++编译器
大家好、我正在尝试使用 PRU 实验室了解 PRU。 我能够让第一个实验轻松工作、但对于第二个实验、中断似乎不工作。 我已经测试了连接到 PRU1的 LED 和独立连接到 PRU0的开关、它们工作正常。 只是中断部分不起作用。
以下是我的代码:
// button_pru0.c
/* 开关连接到高电平有效的 P9.27 (pru0_R31_5) *使用事件16发送中断到 PRU1 */ #include #include #include #include "resource_table_empty.h" #define PRU0 易失性寄存器 uint32_t __R30; 易失性寄存器 uint32_t __R31; // * PRU0至 PRU1中断 * PRU 内核可以使用事件16-31手动生成中断 *但是这些中断映射到 R31寄存器中的位[3:0] *此外, 我们必须触发位5以选通中断 */ #define PRU0_PRU1_EVT (16) #define PRU0_PRU1_TRIGGER (__R31 =(PRU0_PRU1_EVT - 16)|(1 <<5)// 开关掩码 #define SW1 (1<5) // *配置 =(void 0x0000c =任何待处理事件/清除) //将事件16映射到通道1 //通道映射寄存器(CMRm)为每个系统事件定义通道 //每个事件有一个寄存器,因此64个事件有16 CMR //对于事件16,我们将使用 CMR4 CT_INTC.CMR4_bit.CH_MAP_16=1; //将通道1映射到主机1 //主机映射寄存器(HMRm)为每个主机事件定义通道 //每个4个通道一个寄存器,因此10个通道的3个 HMR //主机1连接到 R31位31 (对于 PRU0和 PRU1 CT_INTC.HMR0_bit.HINT_MAP_1 = 1); // 4.4.2.3.2 TRM 中的中断启用 //确保事件16被清除 //服务事件后,必须清除事件状态 //通过将 N 写入系统事件状态索引清除寄存器(SICR) CT_INTC.SICR = 16可以清除事件 N; //启用事件16 //必须启用需要传播到主机的系统事件 //可以通过在系统事件启用索引集寄存器(EISR) CT_INTC.EISR = 16中写入 N 来启用事件 N; //启用主机中断1 //通过向 HIISR 寄存器 CT_INTC.HIISR |=(1 << 0)写入 N 来完成; //全局启用主机中断 //将全局启用寄存器(GER)中的 EN 位(位0)设置为1 CT_INTC.GER = 1; } void main (void) { //将 GPI/O 配置为模式0 (直接输入) //位1-0 // 00 -直接输入模式 // 01 - 16位并行捕捉模式 // 10 - 28位移位模式 // 11 - MI_RT 模式 CT_CFG.G0 = 0x0000; //清除所有16个输出引脚 __R30和= 0xFFFFFF0000; //配置中断 configIntc(); while (1) { //等待 SW1被按下(高电平有效) if ((_R31和 SW1)=SW1) { //等待500ms 以进行去抖 __DELAY_CYLES (100000000); //中断 PRU1_PRU1_TRIGGER ; } }}
// led_pru1.c
//
* led 连接到 P8.44 (pru1_r30_3)
*/
#include
#include
#include
#include "resource_table_empty.h"
易失性寄存器 uint32_t __R30;
易失性寄存器 uint32_t __R31;
#define PRU1
//主机1映射到 R31的位31
#define host1_mask(1<<31)
#define PRU0_PRU1_EVT(16)
#define PRU1_LED(toggle_LED)= 0x30_gpio_mask ^(<gpio_3_)= 0x30)<gpio_gpio_gp1
(= 0xgpio_gp1)<gpio_gp1 (=
//清除所有输出引脚
__R30 && 0xFFFFFF0000;
while (1)
{
//等待主机1被检测
到(__R31 & host1_mask)
{
toggle_LED;
//清除中断事件
CT_INTC.SICR = 16;
//延迟以确保事件在 INTC
__DELAY_CYCLES (5)中清除;}超周期数}
/ //* AM335x_PRU.cmd */ /*版权所有(c) 2015 Texas Instruments Incorporated */ * */ /*说明:此文件是可用于*/ /*的链接器命令文件 链接使用 C 编译器构建的 PRU 程序和 */ * 生成的.out 文件。 */ ********* / -CR/*使用 C 约定的链接*/ /*指定系统内存映射*/ 内存 { 页0: PRU_IMEM:org = 0x00000000 len = 0x00002000 // 8kB PRU0指令 RAM * 第1页: /* RAM */ PRU_DMEM_0_1:org = 0x00000000 len = 0x00002000 CREGISTER=24 /* 8KB PRU 数据 RAM 0_1 */ PRU_DMEM_1_0:org = 0x00002000 len = 0x00002000CREGISTER=25 /* 8KB PRU 数据 RAM 0_0 :org = 0x00002000 len = 0x00002000 CREGISTER=25 /* PRU RAM_0:1:* PRU RAM_EAREM_0:1:* PREM_REM_0org = 0x00010000 len = 0x00003000 CREGISTER=28 // 12KB 共享 RAM */ DDR:org = 0x80000000 len = 0x00000100CREGISTER=31 L3OCMC:org = 0x40000000 len = 0x00010000CREGISTER=30 //外围设备*/ PRU_CFG:org = 0x00026000 CREGISTER=0x44CREGISTER=4 PRU_ECAP:org = 0x000300ETER=0x000ECCEP=0x000EEGISE=0x000CL000 ORG = 0x00020000 len = 0x00001504CREGISTER=0 PRU_UART:ORG = 0x00028000 len = 0x00000038CREGISTER=7 DCAN0:ORG = 0x481CC000 len = 0x000001E8CREGISTER=14 DCAN1:ORG = 0x481D0000 len = 0x000001E8 DMTR=0x400CREGISTER = 0x40015 :CREGCREMP=14 DCAN1 = 0x4000 DMTRENO org = 0x48300000 len = 0x000002C4CREGISTER=18 PWMSS1:org = 0x48302000 len = 0x000002C4CREGISTER=19 PWMSS2:org = 0x48304000 len = 0x000002C4CREGISD8=20 GEMAC:org = 0x4A100000 len = 0x128C CREGISTER=0x00002C=0x00002 :ORG CREGISC=0x00002 org = 0x4819C000 len = 0x000000D8CREGISTER=17 MBX0:org = 0x480C8000 len = 0x00000140CREGISTER=22 McASP0_DMA:org = 0x46000000 len = 0x00000100CREGISORG=8 MCSPI0:org = 0x48030000 len = 0x000001CRETER=0x48000001 CREMCISPI0 :0:org=0x480ECC0001A4 = 0x000001 CREMC0001 = 0x00001 org = 0x48060000 len = 0x00000300CREGISTER=5 SPINLOCK:org = 0x480CA000 len = 0x00000880CREGISTER=23 TPCC:org = 0x49000000 len = 0x00001098CREGISORG=29 UART1:org = 0x48022000 len = 0x000088CREGISTER=11 UART12:0x488 CREGISTER=12:ORGISTER=0x488 org = 0x48318000 len = 0x00000100CREGISTER=10 RSVD13:org = 0x48310000 len = 0x00000100CREGISTER=13 RSVD21:org = 0x00032400 len = 0x00000100CREGISTER=21 RSVD27: org = 0x00032000 len = 0x00000100CREGISTER=27 } //指定段分配到内存中*/ 段{ //强制_c_int00到 PRU IRAM 的开头。 在加载 ELF 文件时不需要、但在加载二进制文件时很有用*。 text:_c_int00*> 0x0、page 0 .text> PRU_IMEM、page 0 .stack> PRU_DMEM_0_1、page 1 .bss> PRU_DMEM_0_1、page 1 .CIO> PRU_DMEM_1、page 1 .1_1、PRU_1数据交换> PRU_1、.CIO 1 第1页 .sysmem> PRU_DMEM_0_1、第1页 .cinit> PRU_DMEM_0_1、第1页 .rodata> PRU_DMEM_0_1、第1页 .rofardata> PRU_DMEM_0_1、第1页 .farbss> PRU_DMEM_0_1、 第1页 DMU_1页.fardata > PRU_1页、PRU_DMEM_1页.fardata 1页> PRU_1页.farem_1页、PRU_1页.farem_1页、PRU_DMEM_1页、PRU_DMEM_1页.
/* 版权所有(C) 2015德州仪器(TI)公司- http://www.ti.com/ * * *只要 满足以下条件*、就允许以源代码和二进制形式重新分发和使用*进行修改或不进行修改: * ***源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 * 发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者 *按原样"提供、 且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权 *所有者或贡献者都不对任何直接、间接、偶然、 *特殊、模范、 或相应的损害(包括但不 限于*采购替代产品或服务;丧失使用、 *数据或利润; 或业务中断)、但出于 任何*责任理论、无论是合同、严格责任还是侵权 行为*(包括疏忽或其他原因)、即使 被告知可能会造成此类损坏、也是出于此类责任理论。 // /* === resource_table_empty.h =========== * *定义所有 PRU 内核的资源表条目。 这 将*整合到相应的基本映像中、 并由主机端的 remoteproc *用于分配/保留资源。 注意 Remoteproc *驱动程序要求使用资源表构建所有 PRU 固件。 * *此文件包含空的资源表。 它可以用作 :* * 1) 1)模板、或 * 2) 2)按原样、如果 PRU 应用程序不需要配置 PRU_INTC * 或与 rpmsg 驱动程序交互 * / #ifndef _RSC_Table_PRU_H_ #define _RSC_Table_PRU_H_ #include #include struct my_resource_table{ struct resource_table base; uint32_t offset[1];//实际定义中应匹配'num'* }; #pragma DATA_SECTION (PRU_remoteproc_ResourceTable、".resource_table") #pragma retain (PRU_remoteproc_ResourceTable) struct my_resource_table PRU_remoteproc_ResourceTable ={ 1、//我们是实现此*/ 0的第一个版本,*必须 保留表中的条目数*、 * 0、* 0、** 0、**** 0、*** 0、*** 0、****/**** 0、* 0 ****
所有内容均已正确编译。 我还注意到、如果我不包括资源表、因为在实验中、PRU 单元不会重新启动。
如果您发现问题、请告诉我