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.

[参考译文] TM4C129ENCPDT:未触发中断。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223568/tm4c129encpdt-interrupt-is-not-getting-fired

器件型号:TM4C129ENCPDT

您好!

有人能指出我在代码中错误的位置吗?  

我有两个针对中断进行配置的引脚。 端口 M 上的引脚会触发相应的内部处理程序、但是端口 N 上的引脚不会触发其内部处理程序。

以下是被触发的 PM3引脚的代码。

#define ADC_CTRL_PORT          GPIO_PORTM_BASE

void PM3_interrupt_enable(void)
{
    //Enable Interrupt on ADC_BUSY Pin
    IntMasterDisable();
    GPIOPinTypeGPIOInput(ADC_CTRL_PORT, ADC_BUSY);
    GPIOPadConfigSet(ADC_CTRL_PORT, ADC_BUSY, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); 
    GPIOIntDisable(ADC_CTRL_PORT, ADC_BUSY);    
    GPIOIntClear(ADC_CTRL_PORT, ADC_BUSY);      
    GPIOIntRegister(ADC_CTRL_PORT, PORTM_Common_IntHandler);
    GPIOIntTypeSet(ADC_CTRL_PORT, ADC_BUSY, GPIO_FALLING_EDGE);         
    GPIOIntEnable(ADC_CTRL_PORT, ADC_BUSY); 
    IntMasterEnable();

}

void PORTM_Common_IntHandler(void)
{
    // Clear the interrupt
    uint32_t status;
    SysCtlDelay(10);
    status = GPIOIntStatus(ADC_CTRL_PORT, true);
    if(status & ADC_BUSY)
    {
        //Do Something
    }

    GPIOIntClear(ADC_CTRL_PORT, status);

}

以下是未点亮的 PN0引脚的代码。

#define DCHRG_CMD_PORT          GPIO_PORTN_BASE

void Enable_DischargePulse_Interrupt(void)
{
    //Enable Discharge Pulse input pin interrupt on ADC_BUSY Pin
    IntMasterDisable();
    GPIOPinTypeGPIOInput(DCHRG_CMD_PORT, DCHRG_CMD_PIN);
    SysCtlDelay(40);
    GPIOPadConfigSet(DCHRG_CMD_PORT, DCHRG_CMD_PIN, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPD);  
    GPIOIntDisable(DCHRG_CMD_PORT, DCHRG_CMD_PIN);        
    GPIOIntClear(DCHRG_CMD_PORT, DCHRG_CMD_PIN);      
    GPIOIntRegister(DCHRG_CMD_PORT, PORTN_Common_IntHandler);
    GPIOIntTypeSet(DCHRG_CMD_PORT, DCHRG_CMD_PIN, GPIO_RISING_EDGE);            
    GPIOIntEnable(DCHRG_CMD_PORT, DCHRG_CMD_PIN);     
    IntMasterEnable();

}


void PORTN_Common_IntHandler(void)
{
    //Clear the interrupt
    uint32_t status;
    SysCtlDelay(10);
    status = GPIOIntStatus(DCHRG_CMD_PORT, true);
    if(status & DCHRG_CMD_PIN)
    {
    //Do Something

    }

    GPIOIntClear(DCHRG_CMD_PORT, status);


}

感谢您的时间和帮助。

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

    您好!

     我不能发现任何错误的你的代码为 portN 基于您的代码片段. 您已为 PN0配置了弱下拉(基于您的注释)和检测输入端的上升沿。 需要检查几个方面。

     - DCHRG_CMD_PIN 是否映射到 GPIO_PIN_0?

     -您是否在输入上创建了上升沿?

     -如果你在 PORTN_Common_IntHandler 上放置一个断点,处理器会在那里停止吗?

     -您可以尝试将  PORTN_Common_IntHandler 静态地插入启动文件中的向量表而不是使用 GPIOIntRegister ()吗?

     只是一个抬头,我将在假期从5/8-5/10。 我的回答将会延迟。  

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

    感谢您在周末的回复。

    是的、DCHRG_CMD_PIN 映射到正确的引脚和正确的端口。

    我将发送一个具有下降沿和上升沿的脉冲。 此外、我还尝试了下降以及上升沿、但没有运气。

    我在 PORTN_Common_IntHandler 上有断点 、处理器没有到达它。

    你能不能 用 GPIOIntRegister ()代替在 startup 文件的向量表中静态地插入 PORTN_Common_IntHandler 吗? 是的,我尝试了它没有运气。 但是、我不确定是否将其放置正确。 我所做的只是将默认 int 句柄替换为相应端口旁边的 PORTN_Common_IntHandler。 是否还有可能错过的其他步骤?

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

    您好!

     我想您的端口 N 缺少下面这一行 。请添加下面的行、然后重试。  

    IntEnable (INT_GPION);

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

    这不是和我在 代码的第2个片段的第14行有 GPIOIntEnable()一样吗? 请查看第二个代码片段第14行。

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

    您好!

     您可以在 LauchPad 上重复同样的问题吗?   

    您能不能尝试以静态 方式将 PORTN_Common_IntHandler 插入启动文件中的矢量表而不是使用 GPIOIntRegister (),它有什么不同? 是的,我尝试了它没有运气。 [/报价]

     GPIOIntEnable() 使能指定的 GPIO 中断源(例如  GPIO_INT_PIN_0)进行简要介绍。  当你静态插入中断矢量时,你还需要调用  IntEnable()以在处理器 NVIC 级别启用端口 N。  

    中断处理程序可以通过以下两种方式之一进行配置:在编译时以静态方式配置或在时以动态方式配置
    不太一样。 中断处理程序的静态配置是通过编辑中断处理程序来完成的
    启动代码中的 UCD PMBus 器件表。 当被静态配置时、中断必须被显式配置
    先在 NVIC 中通过 IntEnable ()启用,然后处理器再响应中断(此外
    外设本身内部所需的任何中断启用)。 静态配置中断表
    由于堆栈操作(写入 SRAM)可以、因此提供最快的中断响应时间
    可与中断处理程序表的获取(从闪存读取)以及并行执行
    中断处理程序本身的预取(假设它也在闪存中)。
    或者,可以在运行时使用 IntRegister ()(或者每个模拟输入)来配置中断
    单个驱动程序)。 当使用 IntRegister ()时,也必须像以前那样启用中断;当时
    在每个单独的驱动器中使用模拟,驱动器调用 IntEnable(),而不需要
    由应用程序调用。 中断的运行时配置会为增加较小的延迟
    中断响应时间、因为入栈操作(写入 SRAM)和中断处理程序
    表提取(从 SRAM 读取)必须按顺序执行。

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

    大家好、Sahil:

     您有任何更新吗?

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

    你好,对不起迟到了。 我将您的评论标记为解决方案。 它现在正在工作。 谢谢 Charles