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.

在ccs下编译lm4f120h5qr时不能正确进入中断服务函数。



在ccs下编译lm4f120h5qr时不能正确进入中断服务函数,想要用PF0中断,初始化如下

void
KEY_Init(void)
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);           
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_RISING_EDGE);    
    GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_0);                  
    IntEnable(INT_GPIOF);                                          
    IntMasterEnable();
}

编写的中断服务函数如下:

void
IntGPIOf(void)
{
    unsigned long status;
    status = GPIOPinIntStatus(GPIO_PORTF_BASE, true);
    GPIOPinIntClear(GPIO_PORTF_BASE, status);
    if(status & GPIO_PIN_0)
    {

     if(RED_luminance<=6000)
      {
         RED_luminance=RED_luminance+500;
         RGB_Set(R,RED_luminance);
      }
     else
     {
         RED_luminance=0;
         RGB_Set(R,RED_luminance);
     }

    }
}

是中断服务函数的名称有问题吗?应该怎么命名?非常感谢专家能够帮助解答!

  • 你好,

        你的函数命名应该没有问题,问题应该出在你的初始化上面:

    1、楼主是希望用PF0做中断,所以把GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0);  改为GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0);  讲PF0配置为输入而不是输出;

    2、对于LM4F120来说,PF0脚默认是NMI,所以需要解锁,使其恢复到普通GPIO,具体的配置代码楼主可以参考下面的:

    void
    KEY_Init(void)
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIO_PORTF_LOCK_R = 0x4C4F434B;//unlock the GPIOCR register
    GPIO_PORTF_CR_R |= 0x01;//unlock the PF0
    GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_0);
    GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_0);
    GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_RISING_EDGE);

    IntEnable(INT_GPIOF);
    IntMasterEnable();
    }

  • 非常感谢,已经把output改成了input,关于nmi问题还得感谢。

  • 在startup_CCS.C中我的修改如下:

    //
    //*****************************************************************************
    void ResetISR(void);
    static void NmiSR(void);
    static void FaultISR(void);
    static void IntDefaultHandler(void);

    void GPIO_PORT_F_ISR(void);//

    。。。。。。。

    IntDefaultHandler, // FLASH Control
    GPIO_PORT_F_ISR, // GPIO Port F

    IntDefaultHandler, // GPIO Port G

    但是还是进不了中断函数

    void GPIO_PORT_F_ISR(void)

    整个代码如下:


    #include "inc/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"

    #include "driverlib/sysctl.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/gpio.h"

    void enable_led_port()
    {
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,GPIO_PIN_1);
    }

    void enable_key_port()
    {

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPadConfigSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);
    //GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,GPIO_PIN_4);
    GPIODirModeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN);
    }

    /*
    void register_key_isr()
    {
    // IntRegister(INT_GPIOF,GPIO_PORT_F_ISR);
    //GPIOPortIntRegister(GPIO_PORTF_BASE,GPIO_PORT_F_ISR);
    }
    */

    void enable_key_interrupt()
    {
    GPIOIntTypeSet(GPIO_PORTF_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE);

    GPIOPinIntEnable(GPIO_PORTF_BASE,GPIO_PIN_4);
    IntEnable(INT_GPIOF);
    IntMasterEnable();

    }


    void main()
    {
    //// 40 MHz system clock
    SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

    enable_led_port();
    enable_key_port();
    //register_key_isr();
    enable_key_interrupt();


    while(1);
    }


    void GPIO_PORT_F_ISR(void)
    {

    unsigned char ucVal;
    unsigned long ulStatus;
    ulStatus = GPIOPinIntStatus(GPIO_PORTB_BASE, true); // 读取中断状态
    GPIOPinIntClear(GPIO_PORTB_BASE, ulStatus); // 清除中断状态,重要
    if (ulStatus & GPIO_PIN_4) // 如果KEY的中断状态有效
    {
    ucVal = GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_1); // 翻转LED
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, ~ucVal);
    SysCtlDelay(100000); // 延时约10ms,消除按键抖动
    while (GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_4) == 0x00); // 等待KEY抬起
    SysCtlDelay(100000); // 延时约10ms,消除松键抖动
    }

    }

  • 楼主可以参考一下下面的代码:

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); 

    ROM_GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4);
    ROM_GPIOPinIntEnable(GPIO_PORTF_BASE, GPIO_PIN_4);
    ROM_GPIOIntTypeSet(GPIO_PORTF_BASE, GPIO_PIN_4, GPIO_FALLING_EDGE);
    ROM_IntEnable(INT_GPIOF);

     ROM_IntMasterEnable();