读按键的值,可以通过函数GPIOPinRead来完成
如何实现中断呢?主要有以下几个步骤需要做
1. 先定义一个LED和一个KEY
#define LED GPIO_PIN_0
#define KEY GPIO_PIN_0
2. 在startup_rvmdk.S 文件中增加PORT_E的中断服务子程序
DCD IntDefaultHandler ; GPIO Port D
extern GPIO_Port_E_ISR ;函数声明
DCD GPIO_Port_E_ISR ; GPIO Port E
3. 编写中断服务子程序GPIO_Port_E_ISR ,这里是没按下一次按键,LED状态变换一次
void GPIO_Port_E_ISR(void)
{
long IntStatus;
IntStatus = GPIOPinIntStatus(GPIO_PORTE_BASE, true); /* 获取中断状态 */
GPIOPinIntClear(GPIO_PORTE_BASE, IntStatus); /* 清GPIO中断 */
if ( IntStatus & KEY ) { /* 判断按键是否按下 */
/* 使LED状态改变 */
GPIOPinWrite(GPIO_PORTF_BASE, LED, LED^GPIOPinRead(GPIO_PORTF_BASE,LED));
}
}
4. 还需要对KEY端口进行相关的设置
GPIODirModeSet(GPIO_PORTE_BASE, KEY, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTE_BASE,KEY,GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
GPIOIntTypeSet(GPIO_PORTE_BASE, KEY, GPIO_FALLING_EDGE); //设置中断类型,有好几种中断类型,具体可以查看手册,我这里用的是下降沿
GPIOPinIntEnable(GPIO_PORTE_BASE, KEY);
IntEnable(INT_GPIOE);//使能中断
通过以上的一些列设置,按键中断完成,可以看到效果是没按一次按键,LED状态发生变化
全部测试程序如下:
#include "inc/lm3s8962.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#define LED GPIO_PIN_0
#define KEY GPIO_PIN_0
void GPIO_Port_E_ISR(void)
{
long IntStatus;
IntStatus = GPIOPinIntStatus(GPIO_PORTE_BASE, true); /* 获取中断状态 */
GPIOPinIntClear(GPIO_PORTE_BASE, IntStatus); /* 清GPIO中断 */
if ( IntStatus & KEY ) { /* 判断按键是否按下 */
/* 使LED状态改变 */
GPIOPinWrite(GPIO_PORTF_BASE, LED, LED^GPIOPinRead(GPIO_PORTF_BASE,LED));
}
}
int main(void)
{
volatile unsigned long ulLoop;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); //up key
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTE_BASE, KEY, GPIO_DIR_MODE_IN);
GPIOPadConfigSet(GPIO_PORTE_BASE,KEY,GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);
GPIODirModeSet(GPIO_PORTF_BASE,LED,GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTF_BASE,LED,GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD);
GPIOIntTypeSet(GPIO_PORTE_BASE, KEY, GPIO_FALLING_EDGE);
GPIOPinIntEnable(GPIO_PORTE_BASE, KEY);
IntEnable(INT_GPIOE);
while(1) {
}
}