LM3S6911端口中斷框架例子

    LM3S6911一共有7組GPIO口,每個GPIO口均可以發起中斷。函數

#include "hw_memmap.h"
#include "hw_types.h"
#include "debug.h"
#include "gpio.h"
#include "sysctl.h"
#include "interrupt.h"
#include "qei.h"
#include "ssi.h"
#include "hw_ints.h"
#include "hw_nvic.h"
#include "hw_types.h"
#include "cpu.h"

#define LED0   GPIO_PIN_3    //PF 口 這個是網卡口的LED
#define LED1   GPIO_PIN_2
#define LED2   GPIO_PIN_6    //PD 口    這個是LED
#define LED3   GPIO_PIN_7

#define Beep   GPIO_PIN_0    //蜂鳴器

#define Key1   GPIO_PIN_0    //按鍵
#define Key2   GPIO_PIN_1

#ifdef DEBUG
void __error__(char *pcFilename, unsigned long ulLine)
{
}
#endif

void Delay(unsigned long ulLoop)
{
    unsigned long i;
    for(i = 0; i < ulLoop; i++)
    {
    }
}


void GPIOE_Handler (void)
{
    unsigned long i;

    if(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_0) == 0)     //在中斷中的時候  就能區分出來時那一位了  這樣讀寫一個口就OK了
    {
        for(i = 0; i < 5; i++)
        {
      
            GPIOPinWrite(GPIO_PORTD_BASE, LED3, LED3);  /*  點亮LED       */
            Delay(200000);
            GPIOPinWrite(GPIO_PORTD_BASE, LED3, ~LED3);  /*  點亮LED       */
            Delay(200000);
        }
    }
    else if(GPIOPinRead(GPIO_PORTE_BASE,GPIO_PIN_1) == 0)
    {
        for(i = 0; i < 10; i++)
        {
            GPIOPinWrite(GPIO_PORTD_BASE, LED3, LED3);  /*  點亮LED       */
            Delay(200000);
            GPIOPinWrite(GPIO_PORTD_BASE, LED3, ~LED3);  /*  點亮LED       */
            Delay(200000);
        }
    }

       GPIOPinWrite(GPIO_PORTF_BASE, LED1, LED1);
    

    GPIOPinIntClear(GPIO_PORTE_BASE, Key1);          /*  清除中斷標誌   */
    GPIOPinIntClear(GPIO_PORTE_BASE, Key2);          /*  清除中斷標誌   */
}

int main(void)
{
    volatile unsigned long ulLoop;

    //
    //  設置系統時鐘
    //
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);


    init_uart1();


    //
    //  配置LED驅動
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

    GPIOPadConfigSet(GPIO_PORTF_BASE, LED0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIODirModeSet(GPIO_PORTF_BASE, LED0, GPIO_DIR_MODE_OUT);

    GPIOPadConfigSet(GPIO_PORTF_BASE, LED1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIODirModeSet(GPIO_PORTF_BASE, LED1, GPIO_DIR_MODE_OUT);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    GPIOPadConfigSet(GPIO_PORTD_BASE, LED2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIODirModeSet(GPIO_PORTD_BASE, LED2, GPIO_DIR_MODE_OUT);

    GPIOPadConfigSet(GPIO_PORTD_BASE, LED3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIODirModeSet(GPIO_PORTD_BASE, LED3, GPIO_DIR_MODE_OUT);

    //    蜂鳴器
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
    GPIOPadConfigSet(GPIO_PORTB_BASE, Beep, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
    GPIODirModeSet(GPIO_PORTB_BASE, Beep, GPIO_DIR_MODE_OUT);

    //    按鍵
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
    GPIOPadConfigSet(GPIO_PORTE_BASE, Key1, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    GPIODirModeSet(GPIO_PORTE_BASE, Key1, GPIO_DIR_MODE_IN);

    GPIOPadConfigSet(GPIO_PORTE_BASE, Key2, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
    GPIODirModeSet(GPIO_PORTE_BASE, Key2, GPIO_DIR_MODE_IN);

    //設置程序是支持中斷的方式的
    IntRegister(20, GPIOE_Handler);      //20號中斷正好是PORTE口的中斷向量號  這個能夠在Startup.s中看到  而後綁定一箇中斷函數就能夠了
    IntEnable(20);

    IntMasterEnable();
    GPIOPinIntEnable(GPIO_PORTE_BASE, Key2);
    GPIOIntTypeSet(GPIO_PORTE_BASE, Key2, GPIO_FALLING_EDGE);

    GPIOPinIntEnable(GPIO_PORTE_BASE, Key1);
    GPIOIntTypeSet(GPIO_PORTE_BASE, Key1, GPIO_FALLING_EDGE);

    //這邊我只是須要將全部能開啓中斷的引腳全都綁定起來

    //
    // 無限循環
    //

    while(1)
    {
         GPIOPinWrite(GPIO_PORTD_BASE, LED2, LED2);
         
        Delay(200000);

        GPIOPinWrite(GPIO_PORTD_BASE, LED2, ~LED2);

        Delay(200000);

    }
}

 其實中斷的觸發只是須要綁定下就能夠了:oop

 //設置程序是支持中斷的方式的
    IntRegister(20, GPIOE_Handler);      //20號中斷正好是PORTE口的中斷向量號  這個能夠在Startup.s中看到  而後綁定一箇中斷函數就能夠了
    IntEnable(20);

    IntMasterEnable();
    GPIOPinIntEnable(GPIO_PORTE_BASE, Key2);
    GPIOIntTypeSet(GPIO_PORTE_BASE, Key2, GPIO_FALLING_EDGE);

    GPIOPinIntEnable(GPIO_PORTE_BASE, Key1);
    GPIOIntTypeSet(GPIO_PORTE_BASE, Key1, GPIO_FALLING_EDGE);

    //這邊我只是須要將全部能開啓中斷的引腳全都綁定起來

這就是綁定的過程  其中主要就是debug

  IntRegister(20, GPIOE_Handler);      //20號中斷正好是PORTE口的中斷向量號  這個能夠在Startup.s中看到  而後綁定一箇中斷函數就能夠了
  IntEnable(20);

先將中斷向量號 註冊一個相應函數, 這個函數名字能夠隨便寫的。而後使能這個中斷code

接下來就設置下中斷的觸發方式,就能成功觸發到中斷函數了。
ip

相關文章
相關標籤/搜索