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.

[参考译文] TM4C129DNCPDT:NMI 中断无法正常工作

Guru**** 2989100 points

Other Parts Discussed in Thread: TM4C129DNCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1654180/tm4c129dncpdt-nmi-intrupt-not-working-properly

器件型号: TM4C129DNCPDT

我尝试将 PD7 用作 TM4C129DNCPDT 上的 NMI 输入。

要求:

  • PD7 应为空闲低电平。
  • 当 PD7 从低电平转换为高电平(上升沿)时、MCU 应进入 NMI 处理程序。
  • 在 NMI 处理程序内部、我想执行一些应用程序代码、例如递增计数器并驱动输出引脚。

我遵循了此处讨论的 NMI 配置:

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1009876/sw-ek-tm4c1294xl-nmi

我的 PD7 初始化是:

HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;
HWREG(GPIO_PORTD_BASE + GPIO_O_CR) |= GPIO_PIN_7;

GPIOPinConfigure(GPIO_PD7_NMI);

GPIOPadConfigSet(GPIO_PORTD_BASE,
                 GPIO_PIN_7,
                 GPIO_STRENGTH_2MA,
                 GPIO_PIN_TYPE_STD_WPD);

GPIODirModeSet(GPIO_PORTD_BASE,
               GPIO_PIN_7,
               GPIO_DIR_MODE_HW);

我的 NMI 处理程序是:

static void nmiHandler(UArg arg)
{
    SysCtlNMIClear(SysCtlNMIStatus());

    SysCtlDelay(5);

    putsUserNull("\nNMI Detected");

    counnt++;

    GPIOPinWrite(GPIO_PORTM_BASE,
                 GPIO_PIN_3,
                 GPIO_PIN_3);
}

但是、当 PD7 从低电平转换为高电平时、从不会进入 NMI 处理程序。

我的问题是:

  1. TM4C1294 NMI 输入是支持上升沿检测、还是仅对电平敏感?
  2. 除了将 PD7 分配给以外 GPIO_PD7_NMI、是否还需要其他 NMI 配置?
  3. NMI 处理程序的寄存是否需要与正常中断不同、以不同的方式在向量表中注册?
  4. 是否 SysCtlNMIClear() 足够、或者是否有额外的必须清除的状态位?
  5. 弱下拉配置 (GPIO_PIN_TYPE_STD_WPD) 是否适用于空闲低 NMI 输入?

任何显示可正常进行 PD7 到 NMI 配置的示例都将不胜感激。

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

    您好:

    1.它只能确定引脚是否为高电平。 不过、您应该能够将其用于上升沿检测。

    您还需要使用提交控制寄存器来锁定 NMI 引脚

    3. NMI 只会生成不同类型的中断,而不需要配置其他中断。

    4.那应该是好的

    5.如果您使用的是内部下拉电阻器、它将是强下拉电阻器(20.5 欧姆)。

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

    您能否提供一个示例代码、用于说明 PD7 中 NMI 中断的初始化以及如何使用配置 NMI_Handler 函数  

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

    对于我们、我们配置了 NMI 中断。 我们将为引脚提供 5 秒的高电压电源 因此、NMI 处理程序函数连续触发并且一段时间后看门狗将复位 IC。 我们希望像中断处理程序这样的情况只能工作一次、并且需要跳出它。 我们使用清除中断  

    SysCtlNMIClear(SysCtlNMIStatus());
    
        SysCtlDelay(5); 。 但压缩器会不断跳转到 nmihandler 函数
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sarath、

    很抱歉耽误你的时间。 解决此问题的最佳方法是配置 NMI 处理程序、以在触发 NMI 后删除引脚配置。 为此、您可以读取 NMIC 寄存器 NMI 处理程序。

    尝试在 NMI 处理程序中执行以下代码:

     uint32_t nmiSource = HWREG(SYSCTL_NMIC);
        if (nmiSource & SYSCTL_NMIC_EXTERNAL)
        {
            // 2. Unlock the GPIO commit control for PD7
            HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;  // 0x4C4F434B
            HWREG(GPIO_PORTD_BASE + GPIO_O_CR)  |= 0x80;           // Enable commit for bit 7
    
            // 3. Disable the NMI alternate function on PD7 (revert to GPIO)
            HWREG(GPIO_PORTD_BASE + GPIO_O_AFSEL) &= ~0x80;
    
            // 4. Clear the PCTL field for PD7 (set mux to 0 = GPIO)
            HWREG(GPIO_PORTD_BASE + GPIO_O_PCTL) &= ~0xF0000000;
    
            // 5. Optionally disable digital enable to fully tri-state the pin
            // HWREG(GPIO_PORTD_BASE + GPIO_O_DEN) &= ~0x80;
    
            // 6. Re-lock the commit control
            HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = 0;
    
            // 7. Clear the NMI source
            SysCtlNMIClear(SYSCTL_NMI_EXTERNAL);
    
            // --- Handle your edge event here ---
        }