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.

[参考译文] TMS320C6455:关于多个事件

Guru**** 2563550 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/626305/tms320c6455-regarding-multiple-events

器件型号:TMS320C6455

您好,

在我们的设计中,我们使用的是6455 DSP。 当我们启用 多个中断时,只有最新启用的中断工作,并且它正在覆盖第一个中断。


但是、当我看到我的事件设置寄存器(相应的事件已设置)时、即使 INTMUX 寄存器也会显示与该 VectId 挂钩的事件。

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

    您是否使用 Processor SDK 源代码、这是裸机示例还是其他软件?

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

    您好!

    我使用 CSL 调用来启用事件并连接我的 ISR

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

    Surabhi、

    这里没有足够的信息来猜测您在代码中所做的事情、无论对还是错。

    [引用 user="SURABHI Rakesh"]当我们启用 多个中断时,只有启用的最新中断有效,且它正在覆盖第一个中断。

    这不清楚。 当您启用中断时、如何覆盖另一个中断? 您是否意味着在启用第二个中断时会覆盖第一个 ISR?

    还是意味着第一个中断不再启用? 如果是这种情况、那么您使用的命令可能会向使能寄存器写入完整值、而不是执行读-修改-写操作。

    中断路径中有许多寄存器、因此请具体说明您使用的寄存器和命令。

    [引用 USER="SURABHI Rakesh"]但当我看到我的事件集寄存器(相应的事件已设置)时,即使 INTMUX 寄存器也会显示与此 VectId 挂钩的事件。[/quot]

    您正在讨论什么事件集寄存器?

    我的回忆是、INTMUX 仅显示中断映射是什么。 不指示任何状态。

    如果您要在此板上开发新项目、则必须从我们的工作示例之一开始、最好先在 EVM/DSK 上进行、这样您就可以了解硬件和软件问题之间的差异。 为什么要使用类似这样的旧器件启动新项目? 或者、这是一个旧板、在这种情况下、您应该有一些自己的内部工作示例。

    C6455是一款功能非常强大的定点 DSP。 但它的内部功能非常复杂、包括中断。 因此、您必须从一个工作示例开始、然后仔细阅读文档以了解其工作原理。

    此致、
    RandyP

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

    在我的应用程序中、我配置了两个 GPIOas 中断(GPIO3和 GPIO5)、这两个中断都不是在同一实例中发生。稍后、使用单独的 CSL 调用、我为事件54 (GPIO3事件)配置了 vectid12、为事件56 (GPIO5事件)配置了 vectid 9、并连接了相应的 ISR (在 ISR 中、我将更新两个单独的存储器位置、这两个位置没有 CPU 检测到相应中断的次数)。

    我们已经看到了这一点
    配置文件的位置
    GPIO5_interrupt ();
    GPIO3_INTERRUPT ();
    DSP 仅接收 GPIO3中断

    2. 配置文件时、请执行以下操作
    GPIO3_INTERRUPT ();
    GPIO5_interrupt ();
    DSP 仅接收 GPIO5中断

    根据 TI (spru871k)(第7.5.1.1节)提供的文档、EFR 显示发生的事件。在我的应用中、EFR 显示两个事件都发生了

    但我放置在 ISR 中的指令不起作用(通过查看存储器位置)

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

    Rakesh、

    [引用 user="vaishnavi gujjula]我们已经注意到了这一点
    配置文件的位置
    GPIO5_interrupt ();
    GPIO3_INTERRUPT ();
    DSP[/报价]仅接收 GPIO3中断

    很明显、您的团队在编写代码和使用 DSP 方面的技能很好。 我们需要术语尽可能精确、以便交换导致您问题的技术细节。

    "配置文件"通常是指扩展名为.cfg 或类似内容的文件、并且 O/S 在编译时使用该文件来配置程序的各个部分。 您是否在此应用中使用 DSP/BIOS、SYS/BIOS 或 TI-RTOS 等 O/S?

    现在、我假设您所说的"配置文件"是 C 源文件中的一组 C 函数、例如 main.c、并且您正在使用此命令序列来配置中断(以及其他操作)。 如果是这种情况、函数 GPIO3_interrupt ()和 GPIO5_interrupt ()来自哪里? 我不会将这些识别为 TI CSL 命令。 如果这些是您编写的函数、那么根据您的观察结果、这些函数被错误写入似乎是合乎逻辑的。 您是否同意我的解释?

    [引用 user="vaishnavi gujula"]根据 TI 提供的文档(spru871k)(第7.5.1.1节)、EFR 显示发生的事件。在我的应用程序中、EFR 显示两个事件都发生了[/引用]

    在 SPRU871的副本中、第7.5.1.1节介绍了 EVTFLAGn 寄存器。 EFR 是异常标志寄存器、在其他地方进行了说明。 EFR 不应是中断配置的一部分。 EVTFLAGn 寄存器可用于查看是否发生了中断事件、但它们不会直接参与您尝试工作的中断路径。 EVTFLAGn 仅在使用事件组合器生成 EVT[3:0]时使用;您使用的是两个 GPIOn 中断到 DSP INT15-4的直接映射。

    请找到一个 CSL 示例项目或将向您展示如何设置中断的源文件。 从一个工作示例开始、然后对其进行修改以实现所需的确切功能要容易得多、而不是编写自己的代码并尝试对其进行调试-尤其是远程调试。

    此致、
    RandyP

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Randy、
    是的、配置的含义是一组将 GPIO 配置为中断的 C 代码。下面也是如此

    使用以下代码、我们将面临这些问题、
    请发送多个中断的 CSL 示例链接。

    即使在 ISR 中清除相应事件后、也会遇到上述相同的问题。
    我们只讨论 EventFlag 寄存器。

    void GPIO3_interrupt (void)

    CSL_Statusintstat_sp;
    CSL_GpioPinConfig config_sp;
    CSL_Statusstatus_sp;
    CSL_GpioContextpContext_sp;
    CSL_GpioObjgpioObj_sp;
    CSL_GpioHwSetup hwSetup_sp;
    CSL_IntcGlobalEnableState state_sp;
    cSL_IntcParamvectId_sp;


    /*初始化 INTC */
    context_sp.numEvtEntry = 1;
    context_sp.eventhandlerRecord = record_sp;

    intStat_sp = CSL_intcInit (&context_sp);
    if (intStat_sp!= CSL_Sok){
    printf ("intr:初始化错误。\n");
    demFae++;
    返回;


    /*启用 NMI */
    intStat_sp = CSL_intcGlobalNmiEnable();
    if (intStat_sp!= CSL_Sok){
    printf ("intr:启用 NMI 时出错。\n");
    demFae++;
    返回;


    /*启用所有中断*/
    intStat_sp = CSL_intcGlobalEnable (&state_sp);
    if (intStat_sp!= CSL_Sok){
    printf ("intr:启用中断时出错。\n");
    demFae++;
    返回;


    /*打开中断模块*/
    vectId_sp = CSL_INTC_VECTID_12;

    gpioIntcHandle_sp = CSL_intcOpen (&gpioIntcObj_sp、CSL_INTC_EventID_GPIOT3、
    vectId_sp、&intStat_sp);
    if ((gpioIntcHandle_sp = NULL)||(intStat_sp!= CSL_Sok)){
    printf ("intr:打开实例时出错。\n");
    demFae++;
    返回;


    /*将 ISR 绑定到中断*/
    ISR_GPIO_sp.handler =(CSL_IntcEventHandler)&ISR_GPIO3;
    ISR_GPIO_sp.arg = gpioIntcHandle_sp;
    CSL_intcPlugEventHandler (gpioIntcHandle_sp、&ISR_GPIO_sp);

    /*事件启用*/
    CSL_intcHwControl (gpioIntcHandle_sp、CSL_INTC_CMD_EVTENABLE、NULL);
    if (intStat_sp!= CSL_Sok){
    printf ("intr:启用事件时出错。\n");
    demFae++;
    返回;


    /*初始化 GPIO CSL 模块*/
    status_sp = CSL_gpioInit(&pContext_sp);
    if (status_sp!= CSL_Sok){
    printf ("GPIO:初始化错误。\n");
    demFae++;
    返回;


    /*打开 CSL 模块*/
    hGpio_sp = CSL_gpioOpen (&gpioObj_sp、CSL_GPIO、NULL、&STATUS_sp);
    if ((hGpio_sp =NULL)||(status_sp!= CSL_Sok)){
    printf ("GPIO:打开实例时出错。\n");
    demFae++;
    返回;


    /*设置硬件参数*/
    hwSetup_sp.extendSetup = NULL;

    /*设置通用 IO */
    status_sp = CSL_gpioHwSetup (hGpio_sp、&hwSetup_sp);


    /*将引脚3配置为 rcv 上升沿上的中断
    *
    CONFIG_sp.pinNum = CSL_GPIO_PIN3;
    CONFIG_sp.TRIGGER = CSL_GPIO_TRIG_RISING _EDGE;
    CONFIG_sp.DIRECTION = CSL_GPIO_DIR_INPUT;

    /*启用组中断*/
    STATUS_sp = CSL_gpioHwControl (hGpio_sp、CSL_GPIO_CMD_Bank_INT_ENABLE、NULL);
    if (status_sp!= CSL_Sok){
    printf ("GPIO:用于启用组中断的命令... 失败。\n");
    demFae++;


    /*配置 GPIO 引脚3 */
    STATUS_sp = CSL_gpioHwControl (hGpio_sp、CSL_GPIO_CMD_CONFIG_BIT、&CONFIG_sp);
    if (status_sp!= CSL_Sok){
    printf ("GPIO:GPIO 引脚配置错误。\n");(EVTFLAG2)
    demFae++;
    返回;




    void GPIO5_interrupt (void)

    CSL_StatusintStat_s_rc;
    CSL_GpioPinConfigCONFIG_SP_RC;
    CSL_StatusSTATUS_sp_RC;
    CSL_GpioContextpContext_sp_rc;
    CSL_GpioObjgpioObj_sp_RC;
    CSL_GpioHwSetup hwSetup_sp_rc;
    CSL_IntcGlobalEnableState state_sp_RC;
    CSL_IntcParamvectId_sp_RC;


    /*初始化 INTC */
    context_sp_rc.numEvtEntry = 1;
    context_sp_rc.eventhandlerRecord =记录;

    intStat_sp_RC = CSL_intcInit (&context_sp_RC);
    if (intStat_sp_RC!= CSL_Sok){
    printf ("intr:初始化错误。\n");
    demFae++;
    返回;(EVTFLAG2)


    /*启用 NMI */
    intStat_sp_RC = CSL_intcGlobalNmiEnable();
    if (intStat_sp_RC!= CSL_Sok){
    printf ("intr:启用 NMI 时出错。\n");
    demFae++;
    返回;


    /*启用所有中断*/
    intStat_sp_RC = CSL_intcGlobalEnable (&state_sp_RC);
    if (intStat_sp_RC!= CSL_Sok){
    printf ("INTR:启用中断时出错。\n");(EVTFLAG2)
    demFae++;
    返回;


    /*打开中断模块*/
    vectId_sp_RC = CSL_INTC_VECTID_9;

    gpioIntcHandle_sp_RC = CSL_intcOpen (&gpioIntcObj_sp_RC、CSL_INTC_EventID_GPINT5、
    &vectId_sp_RC、&intStat_s_RC);
    if ((gpioIntcHandle_sp_RC = NULL)||(intStat_sp_RC!= CSL_Sok)){
    printf ("intr:打开实例时出错。\n");
    demFae++;
    返回;(EVTFLAG2)


    /*将 ISR 绑定到中断*/
    ISR_GPIO_sp_RC.handler =(CSL_IntcEventHandler)&ISR_GPIO5;
    ISR_GPIO_sp_rc.arg = gpioIntcHandle_sp_RC;
    CSL_intcPlugEventHandler (gpioIntcHandle_sp_RC、&ISR_GPIO_sp_RC);

    /*事件启用*/
    CSL_intcHwControl (gpioIntcHandle_sp_RC、CSL_INTC_CMD_EVTENABLE、NULL);
    if (intStat_sp_RC!= CSL_Sok){
    printf ("intr:启用事件时出错。\n");
    demFae++;
    返回;


    /*初始化 GPIO CSL 模块*/(EVTFLAG2)
    STATUS_sp_RC = CSL_gpioInit (&pContext_sp_RC);
    if (status_sp_RC!= CSL_Sok){
    printf ("GPIO:初始化错误。\n");
    demFae++;
    返回;


    /*打开 CSL 模块*/
    hGpio_sp_RC = CSL_gpioOpen (&gpioObj_sp_RC、CSL_GPIO、NULL、&STATUS_sp_RC);
    if ((hGpio_sp_RC == NULL)||(status_sp_RC!= CSL_Sok)){
    printf ("GPIO:打开实例时出错。\n");
    demFae++;
    返回;(EVTFLAG2)


    /*设置硬件参数*/
    hwSetup_sp_rc.extendSetup = NULL;

    /*设置通用 IO */
    STATUS_sp_RC = CSL_gpioHwSetup (hGpio_sp_RC、&hwSetup_sp_RC);


    /*配置引脚5以在 RISP_booted=1;Sing Edge、和上生成中断
    *将其配置为输出,然后将数据设置为高电平(低电平->高电平)。
    *设置触发器:
    *
    CONFIG_sp_rc.pinNum = CSL_GPIO_PIN5;
    CONFIG_sp_rc.trigger = CSL_GPIO_TRIG_RISING _EDGE;
    CONFIG_sp_RC.DIRECTION = CSL_GPIO_DIR_INPUT;

    /*启用组中断*/
    STATUS_sp_RC = CSL_gpioHwControl (hGpio_sp_RC、CSL_GPIO_CMD_Bank_INT_ENABLE、NULL);
    if (status_sp_RC!= CSL_Sok){(EVTFLAG2)
    printf ("GPIO:用于启用组中断的命令... 失败。\n");
    demFae++;


    /*配置 GPIO 引脚5 */
    STATUS_sp_RC = CSL_gpioHwControl (hGpio_sp_RC、CSL_GPIO_CMD_CONFIG_BIT、&CONFIG_sp_RC);
    if (status_sp_RC!= CSL_Sok){
    printf ("GPIO:GPIO 引脚配置错误。\n");
    demFae++;
    返回;






    void ISR_GPIO5 (void *arg)

    A++;


    void ISR_GPIO3 (void *arg)

    B++;



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

    Rakesh、

    [引用 user="vaishnavi gujjula"]您能否发送多个中断的 CSL 示例链接。

    我的 CSL 安装自2006年、因此文件夹结构可能已更改为您安装的文件夹结构。 特别是、我的安装中的 INTC CSL 与其他 CSL 代码分开、甚至是单独的库。 但所有功能都可能相同。

    您可以查看一些名为"example"的文件夹、以找到一个令人满意的文件夹。 我甚至有一些名为 intc_example.c N=1-6的文件。 但是、我找到适合我需要的任何文件的最佳方法和方法是使用一个良好的桌面搜索工具并搜索 CSL_intcInit。

    尝试将两个 GPIO_interrupt()函数组合成一个函数并删除重复的代码。

    一般而言、您不想调用 CSL_ 多次初始化。 对于某些模块、这不是问题、但对于其他模块、这是一项要求。 您可以搜索该模块的 Init 源代码以查看其功能、如果它不仅仅返回成功值、则不要多次调用它。

    此致、
    RandyP

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Randy、
    通过将所有这些都放置在一个函数中,现在我能够接收所有中断

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

    干得不错。 请单击相应帖子上的"已回答"按钮以关闭此主题并帮助将来的读者。

    此致、
    RandyP