mini2440裸奔:外部中断
本人从单片机转向arm,现在在学习裸机,希望这个对初学者有用;/******************************************************************************
*说明:本程序是一个简单的按键中断的程序,当有按键按下时,蜂鸣器发声。
*
*
*1X6 矩阵键盘
*六个输入引脚: EINT8 ---- (GPG0)--- K1
* EINT11---- (GPG3)--- K2
* EINT13---- (GPG5)--- K3
* EINT14---- (GPG6)--- K4
* EINT15---- (GPG7)--- K5
* EINT19---- (GPG11) --- K6
*内存运行地址: 0x30000000
*
*开发环境:mini2440
*编译环境:ADS V1.2
*
*
*作者:tianyi
*
*最后修改时间:2011.2.28
*
*版权所有:kfxy
*
*
******************************************************************************/
#define GLOBAL_CLK //相当于定义了FCLK,HCLK,PCLK,UCLK
#include "def.h"
#include "option.h"
#include "mmu.h"
#include "2440addr.h"
//#include "profile.h"
//#include "memtest.h"
//#include "2440lib.h"
//#include "2440slib.h"
static void __irq key_handler(void);
void delay(int times)
{
int i,j;
for(i=0;i<times;i++)
for(j=0;j<400;j++);
}
void beep_init(void)
{
//rGPBCON &= ~(0x3<<0);
rGPBCON |=(0x1<<0);
}
void beep_run(void)
{
rGPBDAT |= (0x1<<0);
delay(100);
rGPBDAT &= ~(0x1<<0);
delay(100);
}
void Key_Init(void)
{
rGPGCON &= ~(0x3<<0);
rGPGCON |=(0x2<<0);
rGPGCON &= ~(0x3<<6);
rGPGCON |=(0x2<<6);
rGPGCON &= ~(0x3<<10);
rGPGCON |=(0x2<<10);
rGPGCON &= ~(0x3<<12);
rGPGCON |=(0x2<<12);
rGPGCON &= ~(0x3<<14);
rGPGCON |=(0x2<<14);
rGPGCON &= ~(0x3<<22);
rGPGCON |=(0x2<<22); //设置外部引脚为第二功能(外部中断)
//rINTMOD |= (0x1<<5);
rINTMOD &= ~(0x1<<5); //设置为普通中断模式
rEXTINT1 &= ~((0x7<<0)|(0x7<<12)|(0x7<<20)|(0x7<<24)|(0x7<<28));//设置为低电平触发
rEXTINT2 &= ~(0x7<<12); //设置为低电平触发
rEINTMASK &=~((1<<8)|(1<<11)|(1<<13)|(1<<14)|(1<<15)|(1<<19)); //设置外部中断屏蔽寄存器为disable
rINTMSK&= ~BIT_EINT8_23; //中断使能
pISR_EINT8_23=(U32)key_handler; //将中断服务函数的地址传给对应的中断向量表位置
EnableIrq(BIT_EINT8_23); //中断使能
}
int Main(void)
{
MMU_Init(); //初始化MMU,解决中断向量表入口地址与内存地址之间不一样的矛盾,进行地址的重映射
Key_Init(); //初始化按键设置相应的管脚为中断模式
beep_init();
return 0;
}
static void __irq key_handler(void)
{
/*判断是否是按键K1产生的中断*/
if(rINTPND==BIT_EINT8_23)
{
ClearPending(BIT_EINT8_23); //在中断服务函数中,需要清除相应的屏蔽寄存器
if(rEINTPEND&(1<<11))
{
rEINTPEND |= 1<< 11; //在中断服务函数中,需要清除相应的屏蔽寄存器
beep_run();
}
if(rEINTPEND&(1<<13))
{
rEINTPEND |= 1<< 13;
beep_run();
}
if(rEINTPEND&(1<<14))
{
rEINTPEND |= 1<< 14;
beep_run();
}
if(rEINTPEND&(1<<15))
{
rEINTPEND |= 1<< 15;
beep_run();
}
if(rEINTPEND&(1<<19))
{
rEINTPEND |= 1<< 19;
beep_run();
}
if(rEINTPEND&(1<<8))
{
rEINTPEND |= 1<< 8;
beep_run();
}
}
}
工程文件ourdev_618923TG14JA.rar(文件大小:110K) (原文件名:key_interrupt.rar) 灰常感谢!!!正找这方面的资料!!!! 回复【1楼】ylmfpad
-----------------------------------------------------------------------
你也在搞裸机吗? 跟贴,我在搞裸机,初学者,昨天搞了一天的外部中断,没有调试好,刚下载了楼主的试了试,OK,以后跟着楼主混啦,楼主可以查看我的资料,加我 一定要初始化mmu,我试了下,不初始化的情况下,是不会响应的。 回复【4楼】ohmytime小雨哥
-----------------------------------------------------------------------
是的,一定要初始化MMU来进行向量地址重新映射 多谢楼主分享学习啦! 这个好! 怎么没有什么人顶呀,自己顶! arm新手,刚从51转过来,也在弄裸奔程序,开始没有初始化mmu!感谢楼主分享! 小弟也在学mini2440的裸机程序.....以后可以向你请教吗??敢问阁下QQ?? 75回复【10楼】ARM_weida
-----------------------------------------------------------------------
我的QQ是753919770,大家相互学习! mark 好贴哦顶 本人单片机都还没弄通就搞ARM了 表示鸭梨很大 ...助顶楼主.. MARK
页:
[1]