kfxy128 发表于 2011-2-28 15:38:57

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)

ylmfpad 发表于 2011-2-28 15:57:10

灰常感谢!!!正找这方面的资料!!!!

kfxy128 发表于 2011-2-28 16:41:33

回复【1楼】ylmfpad
-----------------------------------------------------------------------

你也在搞裸机吗?

songtao0728 发表于 2011-3-2 11:29:16

跟贴,我在搞裸机,初学者,昨天搞了一天的外部中断,没有调试好,刚下载了楼主的试了试,OK,以后跟着楼主混啦,楼主可以查看我的资料,加我

ohmytime 发表于 2011-3-14 16:57:45

一定要初始化mmu,我试了下,不初始化的情况下,是不会响应的。

kfxy128 发表于 2011-3-21 13:14:01

回复【4楼】ohmytime小雨哥
-----------------------------------------------------------------------
是的,一定要初始化MMU来进行向量地址重新映射

qt_girl 发表于 2011-3-22 13:01:35

多谢楼主分享学习啦!

DanielDeng 发表于 2011-3-23 12:52:52

这个好!

kfxy128 发表于 2011-4-6 10:43:40

怎么没有什么人顶呀,自己顶!

zhanglu52271 发表于 2011-4-30 21:34:12

arm新手,刚从51转过来,也在弄裸奔程序,开始没有初始化mmu!感谢楼主分享!

ARM_weida 发表于 2011-5-2 20:31:05

小弟也在学mini2440的裸机程序.....以后可以向你请教吗??敢问阁下QQ??

kfxy128 发表于 2011-6-28 09:23:44

75回复【10楼】ARM_weida
-----------------------------------------------------------------------

我的QQ是753919770,大家相互学习!

cargle 发表于 2011-6-28 11:06:14

mark

fc201fc 发表于 2011-7-7 14:13:27

好贴哦顶

Garvian 发表于 2011-7-7 17:05:18

本人单片机都还没弄通就搞ARM了 表示鸭梨很大 ...助顶楼主..

LK9286 发表于 2012-1-12 00:43:50

MARK
页: [1]
查看完整版本: mini2440裸奔:外部中断