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.

LM4F120H5QR中断



    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中断了??

  • zheng zhao1

    你检查一下,是不是进入的fault中断,并不是进入的你GPIO的ISR

    感觉你的配置有问题

    你中断使能的是PIN3脚 输入配置的却是PIN2脚

    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_2);改成

    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE,GPIO_PIN_3);

  • 貌似不行啊...

    而且LM4F里面配置输入和配置中断并没有关系

  • 进入的中断是GPIO的ISR么

  • 进入的是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 void
    FaultISR(void)
    {
        //
        // Enter an infinite loop.
        //
        while(1)
        {
        }
    }

  • 尝试用这种顺序初始化一下中断呢

     ROM_IntMasterEnable();   

    IntEnable(INT_GPIOE);

    ROM_GPIOPinIntEnable(GPIO_PORTE_BASE,GPIO_PIN_3);
       

  • 不行诶.....还是执行到IntEnable(INT_GPIOE);这句话以后,直接跳进了FAULTISR了...

  • 我这边测试是可以的 并没有进入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

  • 我把代码全贴出来吧.....这次不进入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);的时候,就直接跳进中断处理函数了...

  • 调了一下午了,,,气死了,,,,,,,,,精简到这种程度也不行

    #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)里