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