标签:
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); } }
其实中断的触发只是需要绑定下就可以了:
//设置程序是支持中断的方式的 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); //这边我只是需要将所有能开启中断的引脚全都绑定起来
这就是绑定的过程 其中主要就是
IntRegister(20, GPIOE_Handler); //20号中断正好是PORTE口的中断向量号 这个可以在Startup.s中看到 然后绑定一个中断函数就可以了 IntEnable(20);
先将中断向量号 注册一个相应函数, 这个函数名字可以随便写的。然后使能这个中断
接下来就设置下中断的触发方式,就能成功触发到中断函数了。
标签:
原文地址:http://my.oschina.net/u/1271540/blog/494353