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.

[参考译文] PROCESSOR-SDK-J784S4:GPIO API 使用情况

Guru**** 2419530 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1477804/processor-sdk-j784s4-gpio-api-usage

部件号:PROCESSOR-SDK-J784S4


工具/软件:

大家好:

我正在尝试使用 TDA4 上的 GPIO API 来测试外部看门狗。
以下是我基于在论坛上其他主题中看到的代码的相关代码:

#define PADCONFIG_34      0x0011C088
#define WKUP_PADCONFIG_23 0x4301C05C
#define WKUP_PADCONFIG_41 0x4301C0A4

#define MCU_WDT_WDI_PIN   (38U)
#define MCU_WDT_WDO_PIN   (34U)

#define SYS_MCU_PWRDN_PIN (55U)


static void watchdog_isr(void)
{
    App_ConsolePrintf("Watchdog triggered!\n");

    // Make rising edge on SYS_MCU_PWRDN pin
    GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, SYS_MCU_PWRDN_PIN, GPIO_PIN_LOW);
    GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, SYS_MCU_PWRDN_PIN, GPIO_PIN_HIGH);
}

GPIO_PinConfig gpioPinConfigs[] = {
    GPIO_DEVICE_CONFIG(0, MCU_WDT_WDO_PIN) |
    GPIO_CFG_IN_INT_FALLING | GPIO_CFG_INPUT,

    GPIO_DEVICE_CONFIG(0, MCU_WDT_WDI_PIN) |
    GPIO_CFG_OUTPUT,

    GPIO_DEVICE_CONFIG(0, SYS_MCU_PWRDN_PIN) |
    GPIO_CFG_OUTPUT
};

GPIO_CallbackFxn callbacks[] = {
    watchdog_isr,
    NULL,
    NULL
};

GPIO_v0_Config GPIO_v0_config = {
    gpioPinConfigs,
    callbacks,
    sizeof(gpioPinConfigs) / sizeof(gpioPinConfigs[0]),
    sizeof(callbacks) / sizeof(callbacks[0]),
    ~0
};

void AppGPIOPadConfig()
{
    *(uint32_t*)PADCONFIG_34      = 0x00060007;
    *(uint32_t*)WKUP_PADCONFIG_23 = 0x00010007;
    *(uint32_t*)WKUP_PADCONFIG_41 = 0x00010007;
}


///////////////////////////////////////////////////////////

    GPIO_v0_HwAttrs gpio_cfg;
    GPIO_socGetInitCfg(0, &gpio_cfg);
    gpio_cfg.baseAddr = CSL_WKUP_GPIO0_BASE;
    (gpio_cfg.intCfg[0]).intcMuxNum = INVALID_INTC_MUX_NUM;
    (gpio_cfg.intCfg[0]).intcMuxInEvent = 0;
    (gpio_cfg.intCfg[0]).intcMuxOutEvent = 0;
    GPIO_socSetInitCfg(0, &gpio_cfg);

    GPIO_init();

    //GPIO_setCallback(0, watchdog_isr);
    GPIO_enableInt(0);

    AppGPIOPadConfig();

    GPIOSetDirMode_v0(CSL_WKUP_GPIO0_BASE, MCU_WDT_WDI_PIN, GPIO_DIRECTION_OUTPUT);
    GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, MCU_WDT_WDI_PIN, GPIO_PIN_HIGH);

    //GPIOSetDirMode_v0(CSL_WKUP_GPIO0_BASE, MCU_WDT_WDO_PIN, GPIO_DIRECTION_INPUT);

    GPIOSetDirMode_v0(CSL_WKUP_GPIO0_BASE, SYS_MCU_PWRDN_PIN, GPIO_DIRECTION_OUTPUT);

    // Attempt to activate callback manually
    GPIO_toggle(0);
    Osal_delay(20);
    GPIO_toggle(0);

    for (uint32_t i = 0; i < 20; i++)
    {
        App_ConsolePrintf("\nNotifying watchdog...\n");

        // Make a falling edge on WDI and assert it back
        GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, MCU_WDT_WDI_PIN, GPIO_PIN_LOW);
        GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, MCU_WDT_WDI_PIN, GPIO_PIN_HIGH);

        Osal_delay(1000);
    }

    App_ConsolePrintf("\nStopped notifications. Waiting for watchog to trigger.\n");

    GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, SYS_MCU_PWRDN_PIN, GPIO_PIN_LOW);
    Osal_delay(50);
    GPIOPinWrite_v0(CSL_WKUP_GPIO0_BASE, SYS_MCU_PWRDN_PIN, GPIO_PIN_HIGH);


问题是、即使使用 GPIO_TOGGLE 手动触发 WATCHDOG_ISR 回调、也永远不会调用该回调。
我还使用示波器查看了 SYS_MCU_PWRD 引脚、没有任何变化。
如有任何帮助、我们将不胜感激。

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

    您好、Milos、

    我想确认以下几点:

    • 我没有看到任何代码切换或写入 MCU_WDT_WDO PIN。 您在哪里执行这些操作来触发 ISR? 为 MCU_WDT_WDO PIN 设置 WATCHDOG_ISR。
    • 是否将 WKUP_GPIO0_34 或 GPIO0_34 用于 MCU_WDT_WDO PIN? 我看到您正在为 GPIO0_34 使用 PADCONFIG、但是、 您将基地址设置为 CSL_WKUP_GPIO0_BASE。

    谢谢、

    Neehar

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

    嗨、Neehar、

    切换 MCU_WDT_WDO _PIN 的代码位于线路 77-80 上:

        // Attempt to activate callback manually
        GPIO_toggle(0);
        Osal_delay(20);
        GPIO_toggle(0);


    感谢您指出这一差异、这确实是一个错误。 我的目标是 WKUP_GPIO0_34、因此我将代码更改为使用 WKUP_PADCONFIG_19 (0x4301C04C)。
    不幸的是、即使修复了该问题、也无法调用 IRQ 处理程序。

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

    您好、Milos、

    切换 MCU_WDT_WDO PIN 的代码位于第 77-80 行:

    感谢您指出这一点、我完全错过了。

    此外、在初始化中断配置时、您需要在您设置中断的引脚上执行此操作。

    例如:

    #define MCU_WDT_WDO_PIN   (34U)
    
    GPIO_socGetInitCfg(0, &gpio_cfg);
    gpio_cfg.baseAddr = CSL_WKUP_GPIO0_BASE;
    (gpio_cfg.intCfg[34]).intcMuxNum = INVALID_INTC_MUX_NUM;
    (gpio_cfg.intCfg[34]).intcMuxInEvent = 0;
    (gpio_cfg.intCfg[34]).intcMuxOutEvent = 0;
    GPIO_socSetInitCfg(0, &gpio_cfg);
    

    有关更多信息、请查看此常见问题解答和 RTOS PDK 中的 GPIO 示例。

    谢谢、

    Neehar

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

    谢谢 Neehar、

    我修复了 intCfg 结构中的索引、但没有任何可用。 我还查看了常见问题解答、看不到还有什么问题。
    但它肯定不仅与中断有关、因为正如我在初始消息中所写的那样、切换输出 GPIO 引脚似乎不起作用、因为我没有使用示波器观察到变化。 似乎缺少 GPIO API 的一些关键组件、但无法准确知道具体内容。

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

    您好、Milos、

    让我再深入研究一下、然后再联系您。

    谢谢、

    Neehar

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

    您好、Milos、

    您是否缺少我在下面概述的电路板初始化步骤?

    Board_initCfg boardCfg;
    
    boardCfg = BOARD_INIT_PINMUX_CONFIG |
        BOARD_INIT_MODULE_CLOCK |
        BOARD_INIT_UART_STDIO;
    Board_init(boardCfg);
    

    切换提供的所有引脚时遇到问题吗?

    此外、 如果在 gpioPinConfigs[]中设置方向、则不需要调用 GPIOSetDirMode_V0 ()。

    谢谢、

    Neehar

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

    嗨、Neehar、

    并在 Board_init 调用期间设置了这些标志。 同时、我尝试 在 TI Baremetal_Led 板上运行 GPIO_EVA_Test.App 示例应用程序、该应用程序可以正常运行。 然而、当我在不更改代码的情况下编译同一应用并在我们的定制电路板上运行该应用时、从未触发中断处理程序。
    有什么想法为什么会发生这种情况?

    此致、
    Milos

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

    您好、Milos、

    您能否确认 示例中使用的焊球未 在定制电路板设计或 其他应用中使用? 这些焊球对于 WKUP_GPIO0_6 专门为 L37 焊球、对于 GPIO0_11 则为 AL32 焊球。 WKUP 和主 GPIO 是否都无法切换?

    此外、您的应用中的任何其他 GPIO 是否存在问题?

    谢谢、

    Neehar

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

    嗨、Neehar、

    这两个引脚都用作我们定制电路板上的中断输入。  这些引脚上没有外部上拉/下拉电阻、它们直接与生成中断的组件连接。

    我更改了  GPIO_WKUP_Test.App 示例、以便检查 MAIN 域中中断的 while 循环到达 Baremetal_Led 域并被触发。 这与我们在 其他使用 GPIO 尝试中的经验相符:出于某种原因、我们可以在主域中使用 GPIO、但在 WKUP 中不使用 GPIO。

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

    您好、Milos、

    对于 WKUP GPIO、是否可以检查 INTSTAT 寄存器以查看是否触发了中断?

    对于 WKUP_GPIO0_38 和 WKUP_GPIO0_55、GPIO_INTSTAT 23 的寄存器地址均为 4211 005Ch。

    如果 WKUP GPIO 出现问题、则可能是由于中断路由所致。 第一步是查看是否触发了中断。 您在哪个内核上运行此应用程序? 可能没有从 WKUP_GPIOMUX_INTRTR 为此内核分配中断线路。 则必须在电路板配置中分配这些线路。

    谢谢、

    Neehar

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

    嗨、Neehar、

    调用 GPIO_troggle 并等待 5 秒后、我刚刚进行了检查、GPIO_INTSTAT 为零。
    我不怀疑中断布线(尽管我不是 100%确定)、因为 GPIO LED 示例显示 TI EVM 和定制电路板上的相同设置会产生不同的结果。 在这两种情况下、除了测试应用之外、没有其他东西在电路板上运行、并且两种情况下都在同一个内核上运行:MCU1_0。

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

    您好、Milos、

    我不怀疑中断路由(尽管我不确定)、因为 GPIO LED 示例显示 TI EVM 和自定义电路板上的相同设置会给出不同的结果

    是的、好的一点是、它可能不是中断路由、但我认为这不能完全排除。 您能否记录并查看 GPIO_socConfigIntrPath () 返回的内容?

    i 刚刚选中、调用 gpio_troggle 并等待 5 秒后 GPIO_INTSTATT23 为零。
    [/报价]

    这是一个很好的信息、让我更深入地看一下为什么不更新统计信息系统。

    谢谢、

    Neehar

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

    嗨、Neehar、

    我称之为 GPIO_socConfigIntrPath、如下所示:

        GPIO_v0_HwAttrs gpio_cfg;
        GPIO_socGetInitCfg(0, &gpio_cfg);
        gpio_cfg.baseAddr = CSL_WKUP_GPIO0_BASE;
        gpio_cfg.intCfg[34].intcMuxNum = INVALID_INTC_MUX_NUM;
        gpio_cfg.intCfg[34].intcMuxInEvent = 0;
        gpio_cfg.intCfg[34].intcMuxOutEvent = 0;
        GPIO_socSetInitCfg(0, &gpio_cfg);
    
        int32_t ret = GPIO_socConfigIntrPath(0, 34, &gpio_cfg, true);
        App_ConsolePrintf("GPIO_socConfigIntrPath returned: %d\n", ret);


    返回值为零。

    编辑:我尝试了使用 GPIO 设置/清除命令从 u-boot 切换这些引脚。 我在尝试将引脚电平设置为 1 时收到了警告、表示引脚电平为 0。 似乎对这些寄存器的写入以某种方式被锁定。 但我尝试以相同的方式设置 WKUP_GPIO0_4、这样有效! 之后我尝试从我的应用程序将引脚 4 设置为 1、这也有效。
    因此、阻止将状态更改为我需要的三个引脚、但对于其他引脚、则可以正常工作。

    编辑 2:我发现电路板上有问题 — 连接到 WKUP_GPIO0_34 的中断线路应在下降沿处于活动状态、并在下降沿上有一个上拉电阻。 当我使用示波器探头触摸它时、它会暂时将信号拉低、并激活中断处理程序。 因此这不是(完全)软件问题、但我仍然不知道中断处理程序为什么不会通过 GPIO_TOGGLE 调用触发。
    此外、控制输出引脚的问题完全在 TDA4 之外。 我在靠近引脚的位置进行测量、实际上它的行为像往常一样、但在电路板上的某个地方移除了一个电阻器、形成开路、这就是我之前在不同位置测量时没有注意到信号变化的原因。

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

    您好、Milos、

    抱歉、由于我的带宽非常低、此问题是否仍然存在?

    您是否能够解决您的硬件问题?

    谢谢、

    Neehar

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

    您好、Milos、

    接下来、该问题是否仍然存在?

    谢谢、

    Neehar

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

    嗨、Neehar、  

    我们可以关闭该问题。

    此致、

    Milena