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 引脚 (PD7 - TM4C129DNCPDT) 是否可用作具有下降沿的正常 GPIO 输入中断引脚?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1658516/tm4c129dncpdt-does-nmi-pin-pd7---tm4c129dncpdt-can-act-as-normal-gpio-input-interrupt-pin-with-falling-edge

器件型号: TM4C129DNCPDT

您好、

我有关于 NMI 引脚的问题。

可以配置 NMI 引脚并将其用作正常的 GPIO 输入引脚吗? 如果有、是否可以将其配置为生成下降沿中断?

目前、我有:

  • 已解锁 NMI 引脚。
  • 将其配置为输入。
  • 配置了下降沿检测中断。

但是、当我对其进行测试时、中断仅在上升沿触发、而不在下降沿触发。

NMI 引脚上是否有任何阻止下降沿中断的限制、或者是否需要额外的配置步骤? 引脚为 PD7。    

void initAcDetGPIOINTPin (void)
{
  HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
  HWREG (GPIO_PORTD_BASE + GPIO_O_CR)|= AC_DET_NMI_PIN;
  HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= 0;

  // GPIO 输入
  MAP_GPIOPinTypeGPIOInput (AC_DET_NMI_PORT、AC_DET_NMI_PIN);
  GPIOIntTypeSet (AC_DET_NMI_PORT、AC_DET_NMI_PIN、GPIO_FALLING_EDGE);

  GPIOIntEnable (GPIO_PORTD_BASE、AC_DET_NMI_PIN);

    返回;
}            在 cfg 文件中 var nmiParams = new Hwi.Params();
nmiParams.instance.name =“AC_DET_Hwi“;
nmiParams.priority = 0;
program.global.AC_DET_Hwi = Hwi.create (19、“&acPowerFailure_HWISR“、nmiParams);     我正在使用处理程序函数 acPowerFailure_HWISR

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

    您好:
    是的、PD7 可在解锁并提交引脚后用作正常 GPIO 输入。 一旦将 PD7 配置为 GPIO、它就可以生成下降沿 GPIO 中断。 GPIO 硬件限制没有会阻止 PD7 上的下降沿检测。  此外、在配置边沿检测时应屏蔽中断、然后任何挂起的中断都应在启用前被清除。 ISR 还应清除 GPIO 中断源。


    建议的顺序为:
    void initAcDetGPIOINTPin (void)
    {
    /*配置期间屏蔽中断*/
    GPIOIntDisable (GPIO_PORTD_BASE、GPIO_PIN_7);

    /*解锁并提交 PD7/NMI */
    HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= GPIO_LOCK_KEY;
    HWREG (GPIO_PORTD_BASE + GPIO_O_CR)|= GPIO_PIN_7;
    HWREG (GPIO_PORTD_BASE + GPIO_O_LOCK)= 0;

    /*确保 PD7 是 GPIO、而不是 NMI 备用功能*/
    HWREG (GPIO_PORTD_BASE + GPIO_O_AFSEL) 且=~GPIO_PIN_7;
    HWREG (GPIO_PORTD_BASE + GPIO_O_PCTL) 且=~GPIO_PCTL_PD7_M;
    HWREG (GPIO_PORTD_BASE + GPIO_O_AMSEL) 且=~GPIO_PIN_7;

    /*配置为 GPIO 输入*/
    GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);

    /*可选:如果外部源为开漏/低电平有效、则启用上拉*/
    /* GPIOPadConfigSet (GPIO_PORTD_BASE、GPIO_PIN_7、
    GPIO_strength_2mA、GPIO_PIN_TYPE_STD_WPU);*/

    /*配置下降沿中断*/
    GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_FALLING_EDGE);

    /*在取消屏蔽之前清除任何过时的挂起中断*/
    GPIOIntClear (GPIO_PORTD_BASE、GPIO_PIN_7);

    /*为 PD7 启用 GPIO 中断*/
    GPIOIntEnable (GPIO_PORTD_BASE、GPIO_PIN_7);
    }
    在 ISR 中:
    void acPowerFailure_HWISR (void)
    {
    uint32_t status = GPIOIntStatus (GPIO_PORTD_BASE、TRUE);

    GPIOIntClear (GPIO_PORTD_BASE、STATUS);

    IF (STATUS 和 GPIO_PIN_7)
    {
    /*在此处处理 PD7 下降沿事件*/
    }
    }
    Hwi.create (19、“&acPowerFailure_HWISR“、nmiParams);配置与 GPIO 端口 D 中断矢量一致。 因此、问题很可能是 PD7 仍被配置为 NMI 备选功能、挂起的中断未被清除、或者引脚在焊盘上没有有效的高电平到低电平转换。 作为快速调试检查、读回 GPIOAFSEL、GPIOPCTL、GPIOIS、GPIOIBE 初始化后用于 PD7 的 GPIOIEV、GPIORIS 和 GPIOMIS。

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

    我已经尝试过上述代码。 但是、该引脚在两种电平转换中都会触发、尤其是在上升沿。  我已经尝试了这一行也 GPIOIntTypeSet (GPIO_PORTD_BASE、GPIO_PIN_7、GPIO_FALLING_EDGE );. 在所有情况下、都会在上升沿触发中断

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

    您好 Sarath、  

    感谢您分享此信息。 由于中断仍在触发、这意味着端口 D 矢量正在工作、这不是 NMI 问题、因为它的中断矢量是矢量 2。 因此,现在,保留您的代码,我希望您首先确认您的宏 , AC_DET_NMI_PIN, 被定义为位掩码 GPIO_PIN_7 (即) 0x80,而不是文字引脚编号 7。 AC_DET_NMI_PORT 也是如此、确认其等于 GPIO_PORTD_BASE。  

    如果这不起作用、我们需要确保寄存器的输入包含正确的值。 因此、将其放在 init...() 函数后、然后读取调试器中的值:  

    volatile uint32_t dbg_pinmask = AC_DET_NMI_PIN;//需要 0x80
    Volatile uint32_t dbg_afsel = HWREG (GPIO_PORTD_BASE + GPIO_O_AFSEL);// bit7 应为 0
    Volatile uint32_t dbg_pctl = HWREG (GPIO_PORTD_BASE + GPIO_O_PCTL);//[31:28]应为 0
    Volatile uint32_t dbg_DEN = HWREG (GPIO_PORTD_BASE + GPIO_O_DEN);// bit7 = 1
    Volatile uint32_t dbg_dir = HWREG (GPIO_PORTD_BASE + GPIO_O_DIR);// bit7 = 0(输入)
    Volatile uint32_t dbg_is = HWREG (GPIO_PORTD_BASE + GPIO_O_IS);// bit7 = 0(边缘)
    Volatile uint32_t dbg_ibe = HWREG (GPIO_PORTD_BASE + GPIO_O_IBE);//位 7 = 0(单边沿)
    Volatile uint32_t dbg_iEV = HWREG (GPIO_PORTD_BASE + GPIO_O_IEV);//位 7 = 0(下降)
    Volatile uint32_t dbg_im = HWREG (GPIO_PORTD_BASE + GPIO_O_IM);// bit7 = 1(未屏蔽)

    在 ISR 中、我们来捕获哪个引脚在清除之前实际上被触发。 因此、在 ISR 中添加以下内容:  

    void acPowerFailure_HWISR (void)
    {
    uint32_t status = HWREG (GPIO_PORTD_BASE + GPIO_O_MIS);//哪个端口 D 位?
    /*将“状态“记录到循环缓冲区以供检查*/
    GPIOIntClear (GPIO_PORTD_BASE、STATUS);
    }

    上述内容可帮助我们确认所有软件配置/固件部分均按预期设置。 此外、请确保您没有运行另一个可能会更改寄存器值的例程。  

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

    您好 Sarath、  

    希望您度过美好的一天。 不过、对我先前的要求有何回应? 如果您还有其他问题或疑虑、请告知我。