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