mini2440外部irq中断实验
2011-09-26 13:38
375 查看
上图为中断控制流程图,SUBSRCPND为子中断状态寄存器,当中断发生时相应位被置一,清除中断标志位需要向该寄存器写1,因为它是只读存储器,只要向里面写就可以清除相应的位,而不是真的写进去了。SUBMASK为子中断屏蔽寄存器,向相应位写1代表屏蔽该中断,SRCPND为一类中断的状态寄存器,MASK为一类中断的屏蔽寄存器,INTPND为总的状态寄存器,这些寄存器与前面的功能相同,MODE寄存器是模式选择寄存器,0为IRQ模式,1为快速模式。通过按键1GPG0触发低电平引起ENIT8中断,蜂鸣器响。具体实验代码如下(放入src目录下的main函数中可直接在线仿真):
#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"
void delay(int times)//延时函数
{
int i;
for(;times>0;times--)
for(i=0;i<400;i++);
}
void beep_init(void)//蜂鸣器初始化
{
rGPBCON =1<<0;// 设置GPB0为输出端口
rGPBUP=1<<0;//禁止GPB0上拉功能
}
void beep(void)
{
beep_init();//初始化蜂鸣器
rGPBDAT =0x1;//蜂鸣器响
delay(3000);
rGPBDAT=0x0;//蜂鸣器不响
delay(3000);
}
void key1_init() //按键1初始化
{
rGPGCON &=~(0x3<<0);
rGPGCON |=0x2<<0; //设置GPG0为中断模式
rGPGUP|=1<<0;//禁止GPG0上拉
}
static void __irq Key1_ISR(void) //EINT8
{
if(rINTPND & (1<<5))
{
if(rEINTPEND & (1<<8))
{
rEINPEND |=1<<8;//清除子子中断器标记位
beep();//蜂鸣响
}
rSRCPND |=(1<<5);
rINTPND |=(1<<5);
}
}
void inter_init()
{
rINTMSK &=~(1<<5); //屏蔽EINT8_23以外的中断源
rEINTMASK &=~(1<<8);//允许EINT8中断
rINTMOD &=~(1<<5);//把GPG0中断设为IRQ模式
pISR_EINT8_23 = (U32)Key1_ISR;//将中断服务函数的地址传给对应的中断向量表位置
}
void Main(void)
{
MMU_Init();//初始化MMU,解决中断向量表入口地址与内存地址之间不一样的矛盾,进行地址的重映射
key1_init();//初始化按键
inter_init();//初始化中断
while(1); //死循环等待中断发生
}
注意:第一次接触arm的中断,这个程序花了一天的时间,有两个问题值得注意!
1. 中断清除顺
相关文章推荐
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
- 一起学mini2440裸机开发(十)--mini2440外部中断实验
- 实验二:外部中断与定时器/计数器中断实验
- Linux下的51单片机简单的外部中断实验
- stm32外部中断实验
- 一起学mini2440裸机开发(十一)--mini2440定时器0中断实验
- mini2440 定时器中断实验
- 一起学mini2440裸机开发(十二)--mini2440的串口中断实验
- 外部中断实验
- 【实验三】外部中断实验
- STM32学习笔记之外部中断实验
- 51单片机 外部中断实验
- cortex_m3_stm32嵌入式学习笔记(四):外部中断实验
- 参考10定时器 成功外部中断 IRQ_EINT1 没有底半部
- 六、mini2440裸机程序之中断控制器(2)外部按键中断
- stm32外部中断实验
- 单片机实验3(外部中断)
- 单片机实验期末考试-使用两个外部中断控制8只LED显示的电路
- STM32IO仿真与串口通讯实验、外部中断实验