搜索
bottom↓
回复: 15

mini2440裸奔:外部中断

[复制链接]

出0入0汤圆

发表于 2011-2-28 15:38:57 | 显示全部楼层 |阅读模式
本人从单片机转向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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-2-28 15:57:10 | 显示全部楼层
灰常感谢!!!正找这方面的资料!!!!

出0入0汤圆

 楼主| 发表于 2011-2-28 16:41:33 | 显示全部楼层
回复【1楼】ylmfpad  
-----------------------------------------------------------------------

你也在搞裸机吗?

出0入0汤圆

发表于 2011-3-2 11:29:16 | 显示全部楼层
跟贴,我在搞裸机,初学者,昨天搞了一天的外部中断,没有调试好,刚下载了楼主的试了试,OK,以后跟着楼主混啦,楼主可以查看我的资料,加我

出0入0汤圆

发表于 2011-3-14 16:57:45 | 显示全部楼层
一定要初始化mmu,我试了下,不初始化的情况下,是不会响应的。

出0入0汤圆

 楼主| 发表于 2011-3-21 13:14:01 | 显示全部楼层
回复【4楼】ohmytime  小雨哥
-----------------------------------------------------------------------
是的,一定要初始化MMU来进行向量地址重新映射

出0入0汤圆

发表于 2011-3-22 13:01:35 | 显示全部楼层
多谢楼主分享学习啦!

出0入0汤圆

发表于 2011-3-23 12:52:52 | 显示全部楼层
这个好!

出0入0汤圆

 楼主| 发表于 2011-4-6 10:43:40 | 显示全部楼层
怎么没有什么人顶呀,自己顶!

出0入0汤圆

发表于 2011-4-30 21:34:12 | 显示全部楼层
arm新手,刚从51转过来,也在弄裸奔程序,开始没有初始化mmu!感谢楼主分享!

出0入0汤圆

发表于 2011-5-2 20:31:05 | 显示全部楼层
小弟也在学mini2440的裸机程序.....以后可以向你请教吗??敢问阁下QQ??

出0入0汤圆

 楼主| 发表于 2011-6-28 09:23:44 | 显示全部楼层
75回复【10楼】ARM_weida  
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-6-28 11:06:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-7 14:13:27 | 显示全部楼层
好贴哦顶

出0入0汤圆

发表于 2011-7-7 17:05:18 | 显示全部楼层
本人单片机都还没弄通  就搞ARM了 表示鸭梨很大 ...助顶楼主..

出0入0汤圆

发表于 2012-1-12 00:43:50 | 显示全部楼层
MARK
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 10:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表