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.

[参考译文] TDA4VM:在 C66和 R5F 中配置中断(裸机、无驱动程序)

Guru**** 2398695 points
Other Parts Discussed in Thread: TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1470905/tda4vm-configuring-interrupt-in-c66-and-r5f-baremetal-no-drivers

器件型号:TDA4VM

工具与软件:

您好!

我正在使用 TDA4VM、需要配置中断、以便 C66x 无需使用 TI 驱动程序即可通知 R5F、完全采用裸机形式。 我已经检查了 TRM、并确定我需要配置中断控制器和中断路由器(INTRTR)来实现这一点。

但是、我仍然不完全了解寄存器的工作方式或设置它们的正确顺序。 我想知道是否有任何建议 常见问题解答、示例或其他文档 可帮助我更好地理解该流程。

我非常感谢您的任何指导!

此致、
Heverton

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

    嗨、Heverton:

    有关详细信息、请参阅以下常见问题解答:

    请随时跟进更多问题

    谢谢!

    Neehar

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

    Neehar、您好!

    首先、感谢您提供这些链接! 他们在了解如何处理中断方面非常有帮助。

    我尝试在不使用 OSAL 的情况下配置中断、但即使我按与 OSAL 相同的顺序写入 VIM 寄存器、也没有按预期更新寄存器。

    下面是我的当前测试代码:

    #include <stdint.h>
    
    #define R5FSS_VIM_BASE        0x0FF80000 // VIM's base address
    #define INTR_NUM              0x1        // Interrupt number - group 1
    
    // VIM's registers
    #define VIM_RAW            (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x400 + (0x1 * 0x20))))
    #define VIM_STS            (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x404 + (0x1 * 0x20))))
    #define VIM_INTR_EN_SET    (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x408 + (0x1 * 0x20))))
    #define VIM_INTR_EN_CLR    (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x40C + (0x1 * 0x20))))
    #define VIM_INTTYPE        (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x41C + (0x1 * 0x20))))
    #define VIM_PRI_INT        (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x1000 + (0x1 * 0x4))))
    #define VIM_VEC_INT        (*((volatile uint32_t *)(R5FSS_VIM_BASE + 0x2000 + (0x1 * 0x4))))
    
    int myISR (void){
        // Just a test function
    }
    
    int main(void){
        uint32_t bit = INTR_NUM;
    
        // Disable the interrupt
        VIM_INTR_EN_CLR = (1 << bit);
    
        // Set the interrupt type (0 = level, 1 = pulse)
        VIM_INTTYPE |= (1 << bit);  // Pulse-triggered
    
        // Set priority (0x0 - 0xF)
        VIM_PRI_INT = 0x0;
    
        // Assign the ISR address
        VIM_VEC_INT = (uint32_t) myISR;
    
        // Enable the interrupt
        VIM_INTR_EN_SET = (1 << bit);
    
        return 0;
    }
    


    运行此代码后、我检查 CCS 中的 VIM 寄存器、但它们的值未按预期改变。 即使是诸如启用/禁用中断之类的基本更改也不会反映在寄存器中。

    有什么我可能遗漏的东西吗? 是否还需要执行其他步骤来正确写入这些寄存器?

    谢谢!
    Heverton

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

    嗨、Heverton:

    您在哪个内核上运行此测试应用代码?

    从0x0FF80000开始的寄存器空间是私有存储器映射寄存器空间。 该区域只能由 R5F 内核访问、任何其他主器件都无法访问。

    谢谢!

    Neehar

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

    Neehar、您好!

    很抱歉忘记提及它。 我在 R5F 内核(主域中为 R5_0_0)上运行这个程序!

    谢谢!
    Heverton

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

    嗨、Heverton:

    感谢您提供这些信息。

    您在使用 CSL_vimCfgIntr ()等 CSL API 操作寄存器时是否遇到任何问题?

    此外、您是否能够准确读取基本寄存器值、例如 R5FSS_VIM_PID 或 R5FSS_VIM_INFO?

    谢谢!

    Neehar

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

    Neehar、您好!

    我没有测试使用 CSL API 像CSL_vimCfgIntr(),但我能够读取基本的寄存器,如R5FSS_VIM_PIDR5FSS_VIM_INFO,没有任何问题。

    我注意到的一点是:我通过观察 CCS 中的寄存器来检查写入是否生效。 最初、更新不符合预期。 然而、当我删除公式(例如0x1 * 0x20)并且只使用具有直接偏移量的基地址时、寄存器开始在 CCS 中正确更新。

    这是否意味着具有计算偏移量的寄存器未在 CCS 中正确映射?

    谢谢!
    Heverton

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

    嗨、Heverton:

    我不希望 CCS 中的寄存器地址不正确、但我会仔细检查。

    [报价 userid="619458" url="~/support/processors-group/processors/f/processors-forum/1470905/tda4vm-configuring-interrupt-in-c66-and-r5f-baremetal-no-drivers/5655397 #5655397"]然而、当我删除公式(例如0x1 * 0x20)并且只使用具有直接偏移的基地址时、寄存器开始在 CCS 中正确更新。[/QUOT]

    即使在删除要计算的公式之后、它是否完全是相同的基址?

    谢谢!

    Neehar

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

    Neehar、您好!

    很抱歉响应出现延迟。

    是的、它是完全相同的基地址、即使在删除计算公式后也是如此。

    谢谢!
    Heverton

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

    嗨、Heverton:

    由于美国假期、回复将会延迟、我会尽快回复。 感谢您的耐心等待!

    谢谢!

    Neehar

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

    Neehar、您好!

    感谢您的更新、没问题!

    在此期间、我有一个简短的问题:

    配置 VIM 之后、是否是通过外部源(例如 GPIO 或其他处理器)触发中断(并进入 ISR)的唯一方法? 或者、是否可以手动设置其中一个 VIM 寄存器中的值、以测试它是否正常工作?

    另外、我还在努力充分了解中断系统是如何在 TDA4VM 上工作的。 根据我到目前为止收集到的信息、似乎遵循以下流程:

    中断源 (例如 GPIO、其他处理器)-->  中断路由器 (特定于每条路由、例如 GPIO 到 R5F)-->  中断控制器 (例如、R5F 上的 VIM)-->  处理器处理中断

    这些组件中的每一个都有其各自负责处理中断的寄存器。 例如:

    • GPIO 寄存器-->
    • 中断路由器寄存器-->
    • 中断控制器寄存器(例如、VIM)-->
    • 处理器寄存器(处理中断)

    我是否理解正确、或者过程是否不同?

    谢谢!
    Heverton

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

    嗨、Heverton:

    很抱歉耽误时间、明天我就能解决问题并提供回复。

    谢谢!

    Neehar

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

    嗨、Heverton:

    或者是否有办法在其中一个 VIM 寄存器中手动设置一个值来测试它是否正常工作?

    您要测试什么? 您是否尝试在 R5F CPU 端进行测试?

    您的中断流程主要是正确的、请查看此文档以了解更多信息: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/10_01_00_04/exports/docs/pdk_jacinto_10_01_00_25/docs/trainings/J7_Interrupt_Architecture。pdf

    需要注意的一点是、 如果在 MCU R5F 内核或主域 R5F 内核上生成中断、这可能会略有变化。

    此外、需要了解的是有多个独立的中断路由器、例如有一个 GPIOMUX_INTRTR0和 R5FSS0_INTRTR0 。

    例如、如果将中断路由到 MCU R5F 内核、GPIOMUX_INTRTR0将经过 MAIN2MCU_PLS_INTRTR0、然后到达 MCU_R5FSS0 。 它不会通过  R5FSS0_INTR0。

    所有中断在到达 R5F CPU 前通过 VIM、而 R5F CPU 全部是 R5子中断或 R5SS 的一部分。  

    谢谢!

    Neehar

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

    Neehar、您好!

    感谢您提供相关文档! 这真的帮我弄清楚了很多事情。

    但是、我仍然对中断路由器(IRS)的工作原理感到有点困惑、特别是在其寄存器方面。 由于有多个中断路由器、它们每个都有单独的寄存器、还是它们之间存在共享配置?

    为了澄清我现在要做的事情:我正在从连接到 WKUP_GPIO0_4的按钮生成中断、并想将该中断路由到主域中的 R5F。 根据您提供的文档、我的理解是中断流程应该:

    WKUP_GPIO0_4 -->中断路由器-->[从 MCU 域到主域]--> R5F (VIM)

    是这样吗?

    我可以确认按钮能够正确生成中断、但我不确定如何正确配置中断路由器以传递中断。 现在、中断路由器是最让我困惑的部分、尤其是就其接收和转发中断的方式而言。

    我使用按钮进行此测试的目的只是为了更好地了解中断在 TDA4VM 上的工作方式。 我的目标是完全掌握中断路由过程、然后再将其应用到更复杂的情况。

    非常感谢有关这方面的任何指导!

    谢谢!
    Heverton

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

    嗨、Heverton:

    由于有多个中断路由器、它们是否每个都有单独的寄存器、或者它们之间是否有共享配置?

    是的、所有中断路由器都有专门控制该中断路由器的单独寄存器。 它们仅有的寄存器是用于启用或禁用该线路的 PID 和 MUXCNTL 寄存器。

    对于将 WKUP_GPIO0_4路由到主域 R5F、流程如下:

    WKUP_GPIO0_4 -> WKUP_GPIOMUX_INTRTR -> R5FSS0/1_INTRTR0 -> R5FSS0/1 (VIM -> R5F 内核)

    上面的每个段都有自己的配置寄存器。

    例如、若要将 WKUP_GPIOMUX_INTRTR 路由到  R5FSS0/1_INTRTR0、请查看下面 TRM 中的中断路由器集成:

    您必须设置 WKUP_GPIOMUX_INTRTR0_MUXCNTL_n 寄存器才能实现路由。 具体而言、您将选择路由器到 R5FSS0/1_INTRTR0的输出线路之一、例如 WKUP_GPIOMUX_INTR0_OUTP_[31:16](对于 n)。在 WKUP_GPIOMUX_INTR0_MUXCNTL_n 中、您将把位[6:0]设置为外设中断。

    在这种情况下、假设您要设置分组中断、您可以将 WKUP_GPIOMUX_INTR0_MUXCNTL_16 [6:0]设置为103、即 WKUP_GPIO0_GPIO_BANK_0。

    您是否在使用 TI 提供的驱动程序(例如 Sciclient)? 所有这些都可以在驱动程序内进行处理。

    谢谢!

    Neehar

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

    Neehar、您好!

    我找到了一些有趣的东西。 最新版本的 spruil1c 似乎缺少某些与中断路由器相关的寄存器、例如 GPIOMUX_INTRTR0_INTR_ROUTER_CFG 和 WKUP_GPIOMUX_INTRTR0_CFG 等。 我在以下 TI 论坛帖子中找到了此问题、您还确认缺少 GPIOMUX_INTRTR0_INTR_ROUTER_CFG: e2e.ti.com/.../tda4vm-gpiomux_intrtr0_muxcntl-vanished-from-spruil1b-9-9-9-2-2-to-spruil1c-intended-or-mistake

    这就是让我感到困惑的地方。 我是否可以使用替代文档或较旧版本来查找这些缺失的寄存器?

    您是否在使用 TI 提供的驱动程序(如 Sciclient)? 所有这些都在驱动程序中处理。

    关于这一点、PDK 中的驱动程序是否可以在裸机环境(没有操作系统)中使用? 如果是、是否有任何论坛文章、常见问题解答或文档介绍了如何在 Code Composer Studio (CCS)内的自定义项目中正确使用这些驱动程序?

    我曾尝试使用某些驱动程序、但未能使它们正常工作、因此我想我缺少了一些重要的设置步骤。 我特别需要将它们集成到 CCS 中、这是我的主要开发环境。

    再次感谢您的帮助!

    此致、
    Heverton

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

    嗨、Heverton:

    让我和同事确认一下、了解一下如何查看这些缺失的寄存器。

    谢谢!

    Neehar

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

    Neehar、您好!

    是否有任何相关的更新?

    谢谢!  

    Heverton  

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

    嗨、Heverton:

    我仍在努力寻找访问这些寄存器的最佳方法。 同时、请告诉我下面有关基地址计算的屏幕截图是否有用:

    关于这一点、PDK 中的驱动程序能否在裸机环境(无操作系统)中使用? 如果是、是否有任何论坛文章、常见问题解答或文档介绍了如何在 Code Composer Studio (CCS)内的自定义项目中正确使用这些驱动程序?[/QUOT]

    您是否在裸机设置(GPIO_LED_Test)中运行了 Baremetal_Led LED 闪烁示例? 如果您在 CCS 中运行此文件 并可以单步执行 、那么您可以 看到如何在裸机环境中使用驱动程序。 此外、该示例还设置 GPIOMUX 和 WKUP_GPIOMUX 路由、因为它可以演示 任何内核的中断。

    谢谢!

    Neehar

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

    Neehar、您好!

    谢谢您的屏幕截图! 它们在阐明 WKUP_GPIOMUX 和 GPIOMUX 中断路由器的基址方面非常有用。

    我还有一些关于寄存器字段的其他问题:

    • 对于所有中断路由器、INT_ENABLE 位是否始终位于位16、或者其位置是否因路由器而异?
    • MUX_CONTROL 位是否始终位于寄存器的下部(例如 WKUP_GPIOMUX 中的0-8位)、或者这种布局是否因路由器而异?

    此外、我正在尝试确定 R5FSS0_INTRTR0的基址。 我在 MAIN 域存储器映射中发现0x0000A60000对应于 R5FSS0_INTROUTER0_INTR_ROUTER_CFG。 这是 R5FSS0_INTRTR0的正确基地址吗?

    再次感谢您的帮助!

    此致、
    Heverton

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

    嗨、Heverton:

    对于所有中断路由器、INT_ENABLE 位是否始终为第16位、或者其位置是否因路由器而异?

    正确、所有中断路由器都是相同的。

    MUX_CONTROL 位是否始终位于寄存器的下半部分(例如、WKUP_GPIOMUX 中的0-8位)、或者该布局是否因路由器而异?

    是的、多路复用器控制始终是低位、但是位数将取决于中断路由器的输出线数。

    由于 WKUP_GPIOMUX_INTRTR0有32条输出线(如上面的屏幕截图中 n = 0至1Fh 所示)、多路复用器控制由  WKUP_GPIOMUX_INTRTR0[0:6]表示。

    由于 GPIOMUX_INTRTR0有64条输出线路(如上面的屏幕截图中 n = 0至3Fh 所示)、多路复用器控制由 GPIOMUX_INTRTR0[0:8]描述。

    这是 R5FSS0_INTRTRTR0的正确基地址吗?

    是的、这是正确的地址。

    我认为中断路由器寄存器是唯一缺少的寄存器。 我将在下面添加屏幕截图、如果您有任何其他需要、请告诉我:

    谢谢!

    Neehar

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

    Neehar、您好!

    感谢您之前关于中断路由器寄存器的帮助。 我已成功映射所需的地址和配置。

    不过、我遇到了尝试向寄存器写入值的问题、但在中进行检查后这些值看起来没有变化 "Memory Browser" Code Composer Studio . 这些值保持在0x0、就像忽略写入一样。

    为了测试此行为、我尝试直接写入寄存器、但值不会更新:

    volatile uint32_t *test_register = (uint32_t *)(WKUP_GPIOMUX_INTRTR0_BASE + 0x8);
    *test_register = 10;
    


    此外、我使用以下函数来配置中断路由:

    void configure_interrupt_routing(){
        // Disable the interrupt before configuration (bit 16 = 0)
        *wkup_gpiomux_intrtr0_outp_16 &= ~(1 << 16);
        *r5fss0_intrtr0_outl_0 &= ~(1 << 16);
        
        // Route WKUP_GPIO0_4 to WKUP_GPIOMUX_INTRTR0_OUTP_16
        *wkup_gpiomux_intrtr0_outp_16 = 4;
        
        // Route WKUP_GPIOMUX_INTRTR0_OUTP_16 (input 159 of R5FSS0_INTRTR0) to R5FSS0_INTRTR0_OUTL_0
        *r5fss0_intrtr0_outl_0 = 159;
        
        // Re-enable the interrupt (bit 16 = 1)
        *wkup_gpiomux_intrtr0_outp_16 |= (1 << 16);
        *r5fss0_intrtr0_outl_0 |= (1 << 16);
    }

    是否有任何特定的保护机制可以阻止对这些寄存器进行写入?
    修改任何区域之前是否需要解锁它们?

    我感谢有关这一问题的任何指导。

    谢谢!
    Heverton

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

    嗨、Heverton:

    是否有任何特定的保护机制可能阻止对这些寄存器进行写入?
    修改任何区域之前、我是否需要解锁它们?

    我需要仔细检查是否出现这种情况。

    同时、您是否运行了 GPIO Led Blink 示例?  GPIO_socConfigIntrPath() API 设置中断路径和中断路由器。 这将是一个很好的开发指南。

    谢谢!

    Neehar

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

    Neehar、您好!

    我看了一下 GPIO Led Blink 示例、它为我澄清了有关中断路径和路由器配置的许多方面、感谢您给我指点!

    但是、我仍然面临无法写入中断路由器寄存器的问题。 即使在分析示例之后、我也不确定是否还需要额外的步骤来实现对这些寄存器的写入。

    如果您发现有关可能的保护或解锁机制的任何信息、请告诉我。

    再次感谢您的支持!

    此致、
    Heverton

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

    Neehar、您好!

    我终于找到了这个问题! 事实证明、中断路由器寄存器受防火墙保护、只有 MCU1_0有权写入这些寄存器。 我最初是尝试在主域中通过 R5F 对其进行配置、这就是忽略写入的原因。 当我在 MCU1_0上运行相同的代码时、一切都运行良好。

    我真的很感谢你的帮助,澄清我的疑问,这是一个巨大的帮助! 再次感谢您的支持!

    此致、
    Heverton