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);

    }
}

 其实中断的触发只是需要绑定下就可以了:

 //设置程序是支持中断的方式的
    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);

先将中断向量号 注册一个相应函数, 这个函数名字可以随便写的。然后使能这个中断

接下来就设置下中断的触发方式,就能成功触发到中断函数了。

转载于:https://my.oschina.net/u/1271540/blog/494353

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值