ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0|GPIO_PIN_1);
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_2);
ROM_GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_3,GPIO_RISING_EDGE);
ROM_GPIOPinIntEnable(GPIO_PORTE_BASE,GPIO_PIN_3);
IntEnable(INT_GPIOE);
ROM_IntMasterEnable();
为什么执行到 IntEnable(INT_GPIOE);的时候,就进入FaultISR中断了??
Wellin Zhang:
zheng zhao1
你检查一下,是不是进入的fault中断,并不是进入的你GPIO的ISR
感觉你的配置有问题
你中断使能的是PIN3脚 输入配置的却是PIN2脚
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_2);改成
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_3);
Zheng Zhao1:
回复 Wellin Zhang:
貌似不行啊…
而且LM4F里面配置输入和配置中断并没有关系
Wellin Zhang:
回复 Zheng Zhao1:
进入的中断是GPIO的ISR么
Zheng Zhao1:
回复 Wellin Zhang:
进入的是FaultISR()…
// This is the code that gets called when the processor receives a fault// interrupt. This simply enters an infinite loop, preserving the system state// for examination by a debugger.////*****************************************************************************static voidFaultISR(void){ // // Enter an infinite loop. // while(1) { }}
Wellin Zhang:
尝试用这种顺序初始化一下中断呢
ROM_IntMasterEnable();
IntEnable(INT_GPIOE);
ROM_GPIOPinIntEnable(GPIO_PORTE_BASE,GPIO_PIN_3);
Zheng Zhao1:
回复 Wellin Zhang:
不行诶…..还是执行到IntEnable(INT_GPIOE);这句话以后,直接跳进了FAULTISR了…
Wellin Zhang:
我这边测试是可以的 并没有进入faultISR中断
下面是我的测试代码
int main(void){
SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0|GPIO_PIN_1); GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_2);
GPIOIntTypeSet(GPIO_PORTE_BASE,GPIO_PIN_3,GPIO_RISING_EDGE); GPIOPinIntEnable(GPIO_PORTE_BASE,GPIO_PIN_3); IntEnable(INT_GPIOE); IntMasterEnable();
while(1) { }}
你可以单步跟踪一下,看是从哪句跳进faultISR
Zheng Zhao1:
回复 Wellin Zhang:
我把代码全贴出来吧…..这次不进入FAULT了,,,但是还没出发就进入中断了…
Startup文件
CC_Rx_Interrupt, // GPIO Port F
// External declarations for the interrupt handlers used by the application.////*****************************************************************************extern void CC_Rx_Interrupt(void);
void CC_Rx_Interrupt(void){ GPIOPinIntClear(GPIO_PORTF_BASE,GPIO_PIN_3); while(1);}
main文件
int main(){ ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI3); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinConfigure(GPIO_PA2_SSI0CLK); GPIOPinConfigure(GPIO_PA3_SSI0FSS); GPIOPinConfigure(GPIO_PA4_SSI0RX); GPIOPinConfigure(GPIO_PA5_SSI0TX); GPIOPinConfigure(GPIO_PD0_SSI3CLK); GPIOPinConfigure(GPIO_PD1_SSI3FSS); GPIOPinConfigure(GPIO_PD2_SSI3RX); GPIOPinConfigure(GPIO_PD3_SSI3TX); GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2); GPIOPinTypeSSI(GPIO_PORTD_BASE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 |GPIO_PIN_3); GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0|GPIO_PIN_1); GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GDO0|GDO01); GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4); SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 5000000, 8); SSIConfigSetExpClk(SSI3_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER, 5000000, 8); SSIEnable(SSI0_BASE); SSIEnable(SSI3_BASE); GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE); GPIOPinIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4); IntEnable(INT_GPIOF); IntMasterEnable();
用的是LAUNCHPAD上的PF4口,就是一个左下角那个按钮做中断…
执行到 IntEnable(INT_GPIOF);的时候,就直接跳进中断处理函数了…
Zheng Zhao1:
回复 Wellin Zhang:
调了一下午了,,,气死了,,,,,,,,,精简到这种程度也不行
#include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_ints.h" #include "inc/hw_sysctl.h" #include "driverlib/sysctl.h" #include "driverlib/debug.h" #include "driverlib/gpio.c" #include "driverlib/pin_map.h" #include "driverlib/rom.h" #include "driverlib/interrupt.h" void gpiof(void) //中断处理 { GPIOPinIntClear(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2,0xff); //亮 SysCtlDelay(16881720); GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2,0); //灭 } int main() { ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1|GPIO_PIN_2); GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4); //貌似以前测试的时候,设不设置成输入不影响中断的检测 IntEnable(INT_GPIOF); GPIOPinIntEnable(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4); //两个按钮,上电是高,按下是低. GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_0|GPIO_PIN_4,GPIO_FALLING_EDGE); IntMasterEnable(); while(1); } startup里面也声明好了: extern void gpiof(void); gpiof, // GPIO Port F
怎么按按钮就是不进中断啊!!!!一直在while(1)里