TI中文支持网
TI专业的中文技术问题搜集分享网站

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

使用的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 ;
}
xyz549040622:

返回的应该是这个GPIO_INT_PIN_0 ,你在.c的宏定义中找找,这个表示的是不是0呢?输出这个,说明中断配置是正确的。不过中断函数中加个return是不必要的吧。

pengcheng wang3:

回复 Maka Luo:

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

pengcheng wang3:

回复 xyz549040622:

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

#define GPIO_PIN_0              0x00000001

xyz549040622:

回复 pengcheng wang3:

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

pengcheng wang3:

回复 xyz549040622:

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

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

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);//使能 GPIOJ 口
//方法一
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOJ))
{
}
//方法二
//SysCtlDelay(10);

pengcheng wang3:

回复 xyz549040622:

但是那个输出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);

Maka Luo:

回复 pengcheng wang3:

是不是哪里导致你按键抖动,配置是上升沿触发中断,而且你获得GPIO状态都是对的。

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

pengcheng wang3:

回复 Maka Luo:

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

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));
}

 

赞(0)
未经允许不得转载:TI中文支持网 » TM4C1294NCPDT外部中断总是进入FaultISR(void)函数
分享到: 更多 (0)