arm处理器中断设置

来源:互联网 发布:java逆波兰表达式 编辑:程序博客网 时间:2024/05/16 08:09

中断初始化
1.设置引脚为中断模式(如设置按键1对应的eint8,应设置GPGCON[1:0]=10
2.设置中断触发方式(如eint8禁止滤波,应设置EXTINT1[3:0]=0000)
3.清除相应的中断标志位(往rEINTPEND相应位写1,即rEINTPEND |= (1<<8)
4.设置EINTMASK相应位,使能中断
5.将中断处理函数首地址赋给中断入口地址(如rISR_EINT8_23 = (U32)key_handler,其key_hangdler()位中断服务程序)、
中断处理函数
1.清除中断标志位(ClearPending(BIT_EINT8_23))
2.判断中断号
3.做出相应处理
具体事例如下
mini2440  按键1按下蜂鸣器响一声,按键2按下点亮led1
/*************************************************
Function name: 这是基础实验的一个模版
Parameter    : 无
Description  : 做基础实验,直接调用该模板即可
Return      : 无
Argument     : 无
Autor & date : Daniel
**************************************************/
#define GLOBAL_CLK  1
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"


//int Wait_key(void);
void key_init(void);
//void Led1_run(void);
//void Led1_init(void);
static void __irq key_handler(void);
void beep_init(void);
void beep_run(void);
void Led1_run(void);
void Led1_init(void);
/*************************************************
Function name: delay
Parameter    : times
Description  : 延时函数
Return   : void
Argument     : void
Autor & date :
**************************************************/
void delay(int times)
{
    int i,j;
    for(i=0;i<times;i++)
       for(j=0;j<400;j++);
}
/*************************************************
Function name: Main
Parameter    : void
Description  : 主功能函数
Return   : void
Argument     : void
Autor & date :
**************************************************/
void Main(void)

 Led1_init();
 beep_init();
 MMU_Init();
 key_init();
 while(1);

/*************************************************
Function name: key_init()
Parameter    : void
Description  : key的初始化函数,其中K1连接的是GPG0
               初始化GPG0为输入模式
Return   : void
Argument     : void
Autor & date : Daniel
**************************************************/
void key_init(void) 
{
 rGPGCON &= ~((3<<0)|(3<<6));       //设置eint8为中断模式GPGCON[1:0]=10,eint11为中断模式
 rGPGCON |= (0x2<<0)|(0x2<<6);
 
 rEXTINT1 &= ~((0xf<<0)|(0xf<<12));//设置eint8,eint11为低电平触发,禁止滤波EXTINT1[3:0]=0000
 rEINTPEND |= (1<<8)|(1<<11);//eint8清除外部中断,eint11清除,
// rEINTMASK &= ~((1<<8)|(1<<11));//相应中断位清零,使能eint8中断
 rEINTMASK &= ~((1<<8)|(1<<11));
 pISR_EINT8_23 = (U32)key_handler;//将中断处理子函数名,即函数的首地址赋给子函数处理程序入口
 EnableIrq(BIT_EINT8_23);//允许eint8中断
 
}

/*************************************************
Function name: beep_init()
Parameter    : void
Description  : Led1的初始化函数,其中Led1连接的是GPB5
               初始化GPB5为输出模式
Return   : void
Argument     : void
Autor & date : Daniel
**************************************************/
void Led1_init(void)
{
   rGPBCON &= ~(3<<10);
   rGPBCON |= (1<<10);
}

void Led1_run(void)
{
   rGPBDAT &=~(1<<5); /*LED亮还是灭?*/
   delay(1000);
   rGPBDAT |=(1<<5);
   delay(1000);
}

static void __irq key_handler(void)
{
 if(rINTPND == BIT_EINT8_23)
 {
  ClearPending(BIT_EINT8_23);// 清除中断标志位
  if(rEINTPEND & (1<<8))      
  {
   rEINTPEND |= 1<<8;  //清除外部中断未决寄存器的位
   beep_run();
  }
  else if(rEINTPEND & (1<<11))
  {
   rEINTPEND |= 1<<11;
   Led1_run();
  }
 }
}

void beep_init(void)
{
 rGPBCON &= ~(0x3<<0);
 rGPBCON |= (0x1<<0);
}

void beep_run(void)
{
 rGPBDAT |= (0x1<<0);
 delay(50);
 rGPBDAT &= (0X0<<0);
 delay(50);
}

原创粉丝点击