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.

TM4C1294NCPDT外部中断总是进入FaultISR(void)函数

Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C1294XL

使用的Tiva C Series Connected LaunchPad Evaluation Board这个开发板,芯片型号就是TM4C1294NCPDT,根据这张图片

选择的PJ0当外部中断源,我调试的时候输出的结果每次输出都是:

in num is:0
hello world!

代码如下:

#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/systick.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "utils/uartstdio.h"
void main(void)
{
	//按键中断配置
	SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口
	GPIODirModeSet(GPIO_PORTJ_BASE,GPIO_PIN_0,GPIO_DIR_MODE_IN); ////设置为输入模式

	GPIOPadConfigSet(GPIO_PORTJ_BASE,GPIO_PIN_0,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD); /////进一步设置为 2mA推挽上拉
	GPIOIntRegister(GPIO_PORTJ_BASE,IntGPIOJtHandler());	//注册中断程序
	GPIOIntTypeSet(GPIO_PORTJ_BASE,GPIO_PIN_0,GPIO_RISING_EDGE);	//中断类型设置
	GPIOIntEnable(GPIO_PORTJ_BASE,GPIO_PIN_0);	//开启外部中断中断
	printf("hello world!\n");
	IntMasterEnable(); //开全局中断
	while(1)
	{
	};
}
void IntGPIOJtHandler(void)
{
	uint32_t int_num=100;
	int_num=GPIOIntStatus(GPIO_PORTJ_BASE,true);
	printf("in num is:%d\n",int_num);
	GPIOIntClear(GPIO_PORTJ_BASE,int_num);
	return ;
}
  • 返回的应该是这个GPIO_INT_PIN_0 ,你在.c的宏定义中找找,这个表示的是不是0呢?输出这个,说明中断配置是正确的。不过中断函数中加个return是不必要的吧。

  • SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口

    此函数后面加一个6cycle以上的延时。

  • 加了一个SysCtlDelay(10);以后可以进去中断函数了,但是有个问题,每次按键都没有反应,而是我摸一下板子后面他会一次进去好几次(手可能出汗了),不会是板子哪里没有焊接好吧,,或者需要软件消抖?

  • 谢谢,那个GPIO_PIN_0对应的是1,开始的那个0可能是PJ口设置的时候没有等待的问题,现在返回1是对的了,看楼上的图片。

    #define GPIO_PIN_0              0x00000001

  • 你以前也输出in num is:0这表明已经进去中断了吧。

  • 是进去那个中断函数了,但是肯定不是中断触发的,感觉莫名其妙的,因为我的printf(hello world)是在开中断以前的;

    差不多感觉问题已经解决了,我吧引脚接到其他地方的按键测试已经正常了,okay了,主要问题是需要在SysCtlPeripheralEnable()后面加延时,其实也可以加while等待 总之有两种方法:

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口
    //方法一
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOJ))
    {
    }
    //方法二
    //SysCtlDelay(10);
  • 但是那个输出0是在printf(hello world)以前进去的,我程序里面打开总中断是在输出这句话以后进行的;

    我把引脚从新接到其他地方的按键已经可以成功触发中断了,所以问题的答案主要是在SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);后面加上延时,查看到官方Tiva里的小灯闪烁程序(ti\TivaWare_C_Series-2.1.2.111\examples\boards\ek-tm4c1294xl\blinky)也可以使用while判断,所以总结解决方法有两个:

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口
    //方法一
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOJ))
    {
    }
    //方法二
    //SysCtlDelay(10);
  • 是不是哪里导致你按键抖动,配置是上升沿触发中断,而且你获得GPIO状态都是对的。

    如果按键识别建议需要添加完整的按键识别程序。

  • 今天用了最简单粗暴的方法,感觉还是按键哪里不对劲,结果不是随着我按下去弹起来变化

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口
    //方法一
    while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOJ))
    {
    }
    GPIODirModeSet(GPIO_PORTJ_BASE,GPIO_PIN_0|GPIO_PIN_1,GPIO_DIR_MODE_IN); //设置为输入模式
    GPIOPadConfigSet(GPIO_PORTJ_BASE,GPIO_PIN_0|GPIO_PIN_1,GPIO_STRENGTH_8MA,GPIO_PIN_TYPE_STD); //设置为 8mA推挽上拉
    while(1)
    {
    	SysCtlDelay(1000000);
    	printf("Answer:%x\n",GPIOPinRead(GPIO_PORTJ_BASE,GPIO_PIN_0|GPIO_PIN_1));
    }