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);
先将中断向量号 注册一个相应函数, 这个函数名字可以随便写的。然后使能这个中断
接下来就设置下中断的触发方式,就能成功触发到中断函数了。