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.

[参考译文] AM2612:将 GPIO 中断路由到 PRU 内核

Guru**** 2986400 points

Other Parts Discussed in Thread: SYSCONFIG

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1659291/am2612-routing-gpio-interrupts-to-pru-core

器件型号: AM2612
主题: SysConfig 中讨论的其他器件

 

您好:
我正在使用以下环境:
  器件:AM261x LaunchPad
  SDK:motor_control_sdk_am261x_10_02_00_07
  IDE:CCS 12.8.1
 
我们旨在将 GPIO124 的中断分配给定制电路板上 ICSSG0-PRU1 的系统事件 62。
 
目前、如下图所示、R5F 应用充当中间体并向 ICSS0-PRU1 通知系统事件 62。
如果我们想直接从 GPIO124 通知 ICSSG-PRU1、而不使用 R5F 应用作为中间人、则需要进行哪些更改?

GPIO124 在 SysConfig 中定义如下:
  引脚方向:输入
  触发器类型:下降沿
  启用中断配置:关闭
  上拉/下拉:无上拉
  压摆率:低
  反转:关闭
  特性:同步

GPIO INT XBAR 配置如下:
  XBAR 输出:GPIO_MUX_124
  XBAR 实例:GPIO_INT_XBAR_VIM_MODULE0_0

在 R5F 应用中:
  HwiP_Params_init (&hwiPrms);
  hwiPrms.intNum   = 164;
  hwiPrms.callback  = irq164_handler;
  hwiPrms.args    = 0;
  hwiPrms.isPulse  = true;
  hwiPrms.isFIQ   = false;
  链路状态        = Hwip_construct (&gPruIcssHwiObject0、&hwiPrms);
  DebugP_assert (status == SystemP_Success);
  HwiP_enableInt (164);

  isrpinNum = 124;
  bankNum = GPIO_GET_BANK_INDEX (isrpinNum);
  gpioBaseAddr =(uint32_t) AddrTranslateP_getLocalAddr (CSL_GPIO0_U_BASE);
  GPIO_bankIntrEnable (gpioBaseAddr、bankNum);

在中断处理程序中:
  void irq164_handler (void *args)
  {
    uint32_t isrpinNum =(uint32_t) 参数;
    uint32_t bankNum = GPIO_GET_BANK_INDEX (isrpinNum);
    uint32_t intrStatus;
    uint32_t gpioBaseAddr;

    gpioBaseAddr =(uint32_t) AddrTranslateP_getLocalAddr (CSL_GPIO0_U_BASE);
    GPIO_bankIntrDisable (gpioBaseAddr、bankNum);

    /*获取和清除组中断状态*/
    IntrStatus = GPIO_getBankIntrStatus (gpioBaseAddr、bankNum);
    GPIO_clearBankIntrStatus (gpioBaseAddr、bankNum、IntrStatus);

    /*通知 PRU1 */
    PRUICSS_sendEvent (gPruIcs0Handle、ICSS_INTC_EVENT_62);
    PRUICSS_clearEvent (gPruIcs0Handle、ICSS_INTC_EVENT_62);

    /*启用中断*/
    GPIO_bankIntrEnable (gpioBaseAddr、bankNum);
  }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、您可以使用 PRU-ICSS XBAR 将 GPIO124 中断作为系统事件直接路由到 PRU-ICSS0 中断控制器、从而完全消除 R5F 中间点。

    您可以使用此示例作为参考: ePWM 保护 PRU 示例 — ICSS 连接

    架构概述

    AM261x PRU-ICSS0 具有 16 个外部中断输入(至)PRU_ICSSM0_INTR_IN_0  PRU_ICSSM0_INTR_IN_14、每个中断输入都由相应的 PRU-ICSS XBAR 输出 (至)馈送PRU-ICSS_XBAROUT_0  PRU-ICSS_XBAROUT_14 1.这些外部输入映射到 PRU-ICSS INTC 内的特定系统事件编号。

    必需的更改

    步骤 1:重新配置 XBAR 路由

    删除 路由到 GPIO_INT_XBAR_VIM_MODULE0_0 (以 R5F VIM 为目标)的当前 GPIO INT XBAR 配置。

    相反、请配置 PRU-ICSS XBAR 以路由 GPIO_MUX_124 到其中一个 PRU-ICSS XBAR 输出。 例如、将其路由到 PRU-ICSS_XBAROUT_0、后者将馈送 PRU_ICSSM0_INTR_IN_0。

    在 SysConfig 中、查找 PRU-ICSS XBAR (而不是 GPIO INT XBAR)并配置:

    • XBAR 输入: GPIO_MUX_124
    • XBAR 输出: PRU-ICSS_XBAROUT_0 (或任何可用的输出 0-14)

    步骤 2:将外部输入映射到 PRU-ICSS INTC 中的系统事件 62

    外部输入 PRU_ICSSM0_INTR_IN_0 到达 PRU-ICSS INTC 中的特定系统事件编号。 您需要验证 INTR_IN_0 TRM 的 PRU-ICSS 内部事件映射表中对应的系统事件编号、然后适当地映射它。

    如果外部输入与系统事件 62 不直接对应、则有两个选项:

    1. 重新映射 PRU 固件 以响应 INTR_IN_x 映射到的任何系统事件(而不是事件 62)
    2. 选择 相应的 INTR_IN 映射到系统事件 62 的 XBAR 输出

    步骤 3:配置 PRU-ICSS INTC

    在 R5F 初始化代码中、配置 INTC 以将系统事件映射到 PRU1 监测的通道和主机中断 1:

    /* Example INTC configuration */
    // 1. Map the system event (from INTR_IN) to a channel (e.g., channel 1)
    // 2. Map channel 1 to Host Interrupt 1 (which connects to R31 bit 31 on PRU1)
    // 3. Enable the system event
    // 4. Enable the host interrupt
    // 5. Enable global interrupts
    
    PRUICSS_intcInit(gPruIcss0Handle, &pruicssIntcInitData);

    PRU-ICSS INTC 编程模型需要 1:

    1. 设置极性/类型(高电平/脉冲)
    2. 通过映射事件→通道 ICSS_INTC_CH_MAP_REGi
    3. 通过映射通道→主机中断 ICSS_INTC_HINT_MAP_REG
    4. 清除并启用中断
    5. 全局启用中断

    步骤 4:删除 R5F 中断处理程序

    完全删除:

    •  HwiP_construct / HwiP_enableInt(164) 代码
    •  irq164_handler 函数
    • GPIO 组中断启用/禁用逻辑

    第 5 步:PRU1 固件

    您的 PRU1 固件通过 R31 寄存器位检测中断(位 30 表示主机中断 0、位 31 表示主机中断 1) 1.确保 PRU 固件轮询或等待与映射的主机中断相对应的正确 R31 位。

    汇总表

    元件 电流(R5F 中间) 新建(直接路由)
    xbar GPIO_INT_XBAR→VIM_MODULE0_0 PRU-ICSS XBAR→PRU-ICSS_XBAROUT_x
    R5F ISR irq164_handler + PRUICSS_sendEvent 已删除
    PRU-ICSS INTC 事件 62 由软件触发 由硬件通过 INTR_IN_x 触发的事件
    延迟 GPIO→R5F ISR→PRU 事件 GPIO→PRU 事件(仅限硬件)

    重要说明

    在 AM261x TRM 中验证(表 10-19) 1 每个 INTR_IN_x 映射到哪个内部系统事件编号。 如果没有直接映射到事件 62、请调整 PRU 固件以使用分配给所选 INTR_IN_x 输入的实际事件编号、或选择 INTR_IN 与事件 62 相对应的。


    1. AM261x 技术参考手册 — PRU-ICSS INTC 和中断映射
    2. MCU Plus SDK - PRUICSS 驱动程序 API 指南
    3. ePWM 保护 PRU 示例 — ICSS 连接
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    在您的指导下、我进行了以下修订、但我无法在 PRU1 R31 上检测到中断(位 30:主机中断 0)。
    可能会出现什么问题?

    1.删除了 GPIO INT XBAR。

    2.改为添加 ICSS XBAR。
      XBAR 输出:GPIO_MUX_124(“GPIO_INT_Xbar “)
      XBAR 实例:ICSS_XBAR_ICSS_MODULE_0

    GPIO_INT_XBAR
      XBAR 输出:GPIO_MUX_124
      XBAR 实例:GPIO_INT_XBAR_ICSS_XBAR_0

    3.从 R5F 应用程序中删除了以下处理:

    • 即  代码  HwiP_constructHwiP_enableInt(164)
    •   函数  irq164_handler
    • GPIO 组中断启用/禁用逻辑

    4.在 ICSSM0 INTC 内部信号映射中配置了以下内容:
      ICSSM 实例:ICSSM0
      INTC 模式:ICSSM0_MII_RT_EVENT_DISABLE
      INTC 事件信号:32:PRU_ICSSM0_PR1_SLV_IN_0
      INTC 通道:通道 2
      INTC 主机中断:主机中断 0
      系统事件极性:高电平
      系统事件类型:脉冲

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    对不起,这里的延迟,让我回到今天的 EOD。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您能否在不添加 GPIO 组中断启用/禁用逻辑的情况下分享以下寄存器的值:  



    我认为您需要保留与 GPIO 组中断使能相关的代码、您能不能在启用 GPIO 组中断后与我分享相同的寄存器值?

    您需要代码来清除 GPIO 中断、然后清除 PRU 本身中的 INTC 事件、我们可以在您看到在 RAW_STATUS 和 ENABLE_STATUS 寄存器中检测到事件后进行检查。  

    此致、
    Manoj。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    ​​这两种情况下的寄存器值如下所示。

    案例 1:不添加 GPIO 组中断启用/禁用逻辑
      ICSSM_PR1_ICSS_INTC_INTC_SLV_RAW_STATUS_REG1:0x00000000
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENA_STATUS_REG1:0x00000000
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENABLE_REG1:0x00000001
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENABLE_CLR_REG1:0x00000001

    案例 2:启用 GPIO 组中断后
      ICSSM_PR1_ICSS_INTC_INTC_SLV_RAW_STATUS_REG1:0x00000000
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENA_STATUS_REG1:0x00000000
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENABLE_REG1:0x00000001
      ICSSM_PR1_ICSS_INTC_INTC_SLV_ENABLE_CLR_REG1:0x00000001

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我可以看到在 ICSS INTC 时启用了 PRU_ICSSM0_PR1_SLV_IN_0 事件、但在原始状态或已启用状态下均未检测到该事件。

    您能否检查以下两个寄存器值以检查 XBAR 设置是否正确:-  

    GPIO_XBAR_OUT_0 应映射到输入 124 (GPIO_MUX_124):-(0x52E02004 +(124*4)),预期值: — 0x1007C
    PRU_ICSS_XBAR_OUT_0 (PR1_SLV_INTR_0) 应映射为输入 47 (GPIO_XBAR_OUT_0):- (0x52E03004 + 0*4),预期值: —  0x1002F

    如果您看到符合预期的值、则意味着我们需要检查中断是否从 GPIO 生成。

    此致、
    Manoj。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    我检查了​​GPIO_XBAR_INTR_MUXCNTL 和 ICSSM_XBAR_INTR_MUXCNTL 寄存器的值。
    结果如下:

     GPIO_XBAR_INTR_MUXCNTL:
      0x52E02004 +(0*4)= 0x0001007C
      0x52E02004 +(124*4)= 0x00000000

     ICSSM_XBAR_INTR_MUXCNTL:
      0x52E03004 +(0*4)= 0x00010000

    您的上一个答案显示 (0x52E02004 +(124*4))、但预期值实际存储在 (0x52E02004 +(0*4))。
    这是正确的吗?
    由于 GPIO_XBAR_INTR 寄存器区域为 256 字节、因此我认为 (0x52E02004 +(124*4)) 超出了有效范围。

    此外、我将 ICSSM_XBAR_INTR_MUXCNTL 的值设置为 0x1002F、但仍未检测到事件。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的上一个回答显示 (0x52E02004 +(124*4))、但预期值实际上存储在 (0x52E02004 +(0*4))。
    这是正确的吗?

    没错、由于我们将中断映射到 GPIO_XBAR_OUT_0、因此应该仅检查 0x52E02004 +(0*4)。

    您还可以对 R5F 启用 GPIO 中断并检查是否正在 ICSSM_PR1_ICSS_INTC_INTC_SLV_RAW_STATUS_REG1(预期值: — 0x1) 中检测到此事件。

    如果在 RAW_STATUS 中未检测到事件、我会尝试使用硬件。

    此致、
    Manoj。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    我按如下方式设置寄存器:

      GPIO_XBAR_INTR_MUXCNTL:0x52E02004 +(0*4)= 0x0001007C

      ICSSM_XBAR_INTR_MUXCNTL:0x52E03004 +(0*4)= 0x0001002F

    在 R5F`中启用 GPIO 中断后、`ICSSM_PR1_ICSS_INTC_INTC_SLV_RAW_STATUS_REG1`寄存器的值变为`0x1 μ s。
    但是、在 PRU 侧的 R31 寄存器的位 30 仍没有检测到中断。

    作为参考、在 SysConfig 中按如下方式配置 GPIO124:

      引脚方向:输入
      触发器类型:下降沿
      启用中断配置:开
      上拉/下拉:无上拉
      压摆率:低
      反转:关
      验证选择:同步
      GPIO 外设:GPIO124/A19

    同时、ICSSM0 INTC 内部信号映射配置如下:
    这是正确的吗?

      ICSSM 实例:ICSSM0
      INTC 模式:ICSSM0_MII_RT_EVENT_DISABLE
      INTC 事件信号:32:PRU_ICSSM0_PR1_SLV_IN_0
      INTC 通道:通道 0
      INTC 主机中断:主机中断 0
      系统事件极性:高
      系统事件类型:脉冲

    我担心、即使将 GPIO 配置为下降沿触发、PRU 侧的系统事件类型也设置为`μ s 脉冲`。

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Manoj。
    感谢您的支持。

    在 PRU 侧的 R31 寄存器的位 30 处未检测到中断、原因是 ICSSM_PR1_ICSS_INTC_INTC_SLV_STATUS_CLR_INDEX_REG 寄存器中未清除中断。
    这解决了问题。