This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
[编辑]
与 PRU-ICSSM 主机中断直接连接到 AM335x 中的 ARM 中断控制器或通过 AM57x 中的交叉开关不同、PRU-ICSSG 主机中断通过电平或脉冲中断路由器路由到 MCU R5F、请参阅 TRM 图9-1。 SoC 中断架构
和图6-110。 PRU_ICSSG 集成:
因此、中断路由器需要通过 CSL 函数进行配置、如下所示:
CSL_RouterIntraCfg RouterCfg;
uint32_t pruIntRtrInIntNum、pruIntRtrOutIntNum;
/*初始化主 MCU 中断路由器配置结构*/
RouterIntraCfg.pRouterIntraRegs =(CSL_intr_router_cfgRegs *)(uintptr_t)(CSL_MAIN2MCU_LVL_INTR0_CFG_base);
RouterinCfg.pIntdRegs =(CSL_intr_router_intd_cfgRegs *)(uintptr_t)空;
RouterinCfg.numInputIntrs = 192;
RouterinCfg.numOutputIntrs = 64;
/*将 PRU int 路由器输出路由到 MAIN2MCU int 路由器输出、MAIN2MCU int 路由器输出 int 编号
*源自 MCU GIC 中断号。*/
/* 32:ICSSG_0_HOST_INT0 PRU_ICSSG0主机中断2、请参阅 TRM 9.4.10 MAIN2MCU_LVL_INTR0中断映射*
pruIntRtrInIntNum = 32;
pruIntRtrOutIntNum = CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_PEND 0 - CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;//286 -160、请参阅 cslr_intr_gic0.h 和 cslr_intr_mcu0.h
CSL_INROUTERCfgMux (&INROUTERCfg、pruIntRtrInIntNum、pruIntRtrOutIntNum);
并通过 OSAL 函数在 R5F 中注册中断:
hwip_handle hwiHandle =空;
OsalRegisterIntrParams_t interruptRegParams;
/*使用默认值初始化*/
OSAL_RegisterInterrupt_initParams (&interruptRegParams);
interrRegParams.corepacConfig.isrRoutine =(&PRU_hwiFxn);
interruptRegParams.corepacConfig.priority = 0x20U;
interruptRegParams.corepacConfig.name=NULL;
interruptRegParams.corepacConfig.corepacEventNum=CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;
interruptRegParams.corepacConfig.intVecNum=CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;/*主机中断矢量*/
/*寄存器中断*/
OsalRegisterInterrupt (&interruptRegParams、&(hwiHandle));
注意:如前一个帖子所述、PRSDK 中没有现有的独立 R5F/PRU 中断示例代码。 以上代码仅基于其他示例供参考。
此致、
Garrett
器件型号:AM6548
您好!
我尝试在 ARM 内核 R5F 和 PRU 之间进行交互。 我想从 R5F 向 PRU 发送一个"中断"。
我的问题是、我不知道/不了解如何使用 R5F 生成特定的系统事件。 我搜索了 CSL 封装、阅读了 AM6548的 TRM、信息量让我不知所措。
我想我的第一个问题是、我不知道术语"中断"和"系统事件"的确切定义。 两者有何区别?
第二个问题:是否需要启用 ICSSG 的 OCP 端口以在 ARM 和 PRU 之间发送中断?
图6-111. PRU_ICSSG 集成向我展示、PRU_ICSSG0_External Events [64...159]是"来自各种器件外设的系统事件"。 我能否使用 R5F 生成这样的系统事件?
我已经以这样的方式配置了 PRU_ICSSG 的 INTC、SysEvent 0映射到通道0、而通道0映射到主机0。 我还为 ICSSG 上的主机0启用了中断。 所以我“只”需要以某种方式生成 SysEvent 0....
提前非常感谢!
Thomas
Thomas、
TRM 第9.4.5节 PRU_ICSSG0中断映射列出了事件[64:159]到 PRU_ICSSG0外部中断输入的所有映射。 和9.4.3 MCU_R5_CORE0中断映射列出了事件到 MCU_R5_CORE0的映射。 您尝试从 R5F 生成哪个 PRU_ICSSG0_External 事件? 请注意 PRU_ICSSG 中断控制器(INTC):
–最多64个内部事件、由 PRU_ICSSG 内部的模块生成
–最多96个外部事件,由系统生成
关于主机和通道、请参阅 6.4.6.1 PRU_ICSSG 中断控制器功能说明
•主机中断0并行连接到 PRU0和 PRU1寄存器31 (R31)中的位30。
•主机中断1并行连接到 PRU0和 PRU1的寄存器31 (R31)中的位31。
•从 PRU_ICSSG 导出并映射到器件级中断 控制器的主机中断2至9。
"大多数系统事件直接路由到各种处理元素、但在某些情况下、将某个组的所有事件(例如 GPIO 事件)路由到每个处理元素是不切实际的。 为此、SoC 集成了多个中断路由器(INTRTR)实例。 每个中断路由器
通过使用 简单的组合逻辑(一组多路复用器)聚合多个系统事件并将每个事件路由到给定的处理元件。 事件选择通过 每个中断路由器内的相关寄存器进行控制。"、因此您不必启用 OCP 端口即可在 ARM 和 PRU 之间发送中断。
此致、
Garrett
您好、Garrett、
问题"您尝试从 R5F 生成哪个 PRU_ICSSG0_External Event?"
我没有想到特定事件、我只是想将系统事件发送到 PRU、该事件由 R5F 软件生成。
但是、同时我找到了函数"PRUICSS_pruSendEvent (pruHandle、ARM_PRU0_EVENT);"、该函数为我执行任务。 再次感谢 Garrett 的解释。
但返回到该线程的原点:创建从 PRU 到 R5F 的中断。
我在从 ICSSG0的 PRU0创建一个系统并将其发送到第一个 R5F 方面需要一些时间。
下面是我如何理解从 PRU0到 R5F 的中断链的工作原理:您能否检查我是否错过了那里的内容?
1.从 Pru0生成 INTC 系统事件
将0x20写入 R31将生成 PRU_ICSSG0内部中断16。 我认为这也称为 PRU_ICSSG 的主机中断2、在阅读第6.4.7.1章 PRU_ICSSG 中断控制器功能说明时、我不确定。
PRU_ICSSG0的主机2连接到 MAIN2MCU_LVL_INTRTR0。
因此、对于 MAIN2MCU_LVL_INTR0路由器的配置、输入中断号为32、如您在示例中所述。
MCU_R5_CORE0的中断编号162是来自 ICSSG0的主机中断2吗? 因此、我必须配置 MAIN2MCU_LVL_INTR0、以便输入中断号为32、输出中断号为162?
我到这里的路径/链是否正确?
我不理解您此行的示例代码:
pruIntRtrOutIntNum = CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_PEND 0 - CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_0;//286 -160、请参阅 cslr_intr_gic0.h 和 cslr_intr_mcu0.h
为什么从286中减去160?
希望您能给我一些提示
此致、
Thomas
您好、Garrett、
感谢您的澄清!
然而、当我生成 PRU_ICSSG0的主机中断2时、isrRoutine 不会被执行。 我仍在搜索原因。
只需清除第2点:
应该从286中减去162,还是只需使用 outputIntrNum of CSL_RouterCfgMux 的值162?
这来自我的代码:
int pruIntRtrInIntNum = 32; int pruIntRtrOutIntNum =/*CSL_GIC0_INTR_PRU_ICSSG0_BUS_PR1_HOST_INTR_pend_0 -*/ CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_2; CSL_RouterCfgMux (&trRouterMain2MCUCfg、pruIntRtrInIntNum、pruIntRtrOutIntNum);
尊敬的 Thomas:
感谢您的更新、很高兴知道您能够让这项工作正常! 该主题对其他客户也有很大帮助。
在输入和输出中断编号上、MAIN2MCU_LVL_INTR0_MUXCNTL_y 寄存器的描述似乎不太清楚。 如果查看 CSL_RouterCfgMux ()的实现:
/*配置多路复用器值*/
CSL_fins (regVal、INTR_ROUTER_CFG_MUXCNTL_ENABLE、inputIntentNum);
CSL_REG32_WR (&pCfg->pRouterIntraRegs->MUXCNTL[outputIntraNum],regVal);
使用以下配置从 CSL_MCU0_INTR_MAIN2MCU_LVL_INTR0_OUTL_2中减去160是有道理的:
RouterinCfg.numInputIntrs = 192;
RouterinCfg.numOutputIntrs = 64;
此致、
Garrett