初始化中断按键(2440)

以下是主要代码:

1.led.c

#define GPBCON (volatile unsigned long*)0x56000010
#define GPBDAT (volatile unsigned long*)0x56000014

void led_init()
{   
    *(GPBCON) = 0x400;
}

void led_off()
{
    *(GPBDAT) = 0x7ff;
}

void led_on()
{
    *(GPBDAT) = 0x0;
}

2.interrupt.c

/*interrupt registes*/
#define SRCPND              (volatile unsigned long *)0x4A000000
#define INTMOD              (volatile unsigned long *)0x4A000004
#define INTMSK              (volatile unsigned long *)0x4A000008
#define PRIORITY            (volatile unsigned long *)0x4A00000c
#define INTPND              (volatile unsigned long *)0x4A000010
#define INTOFFSET           (volatile unsigned long *)0x4A000014
#define SUBSRCPND           (volatile unsigned long *)0x4A000018
#define INTSUBMSK           (volatile unsigned long *)0x4A00001c

#define EINTMASK            (volatile unsigned long *)0x560000a4
#define EINTPEND            (volatile unsigned long *)0x560000a8

void init_irq()
{

// 在EINTMASK寄存器中使能它们
    *(EINTMASK) &= (~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14));

// EINT8_23使能
    *(INTMSK)   &= ~(1<<5);
    
    __asm__(
    /*开中断*/  
    "mrs r0,cpsr\n"
    "bic r0, r0, #0x80\n"
    "msr cpsr_c, r0\n"            
    :
    :
  );
}

void handle_int()
{
    /*读取产生中断的源*/
    unsigned long value = *(EINTPEND) & ((1<<8)|(1<<11)|(1<<13)|(1<<14));
    
    switch(value)
    {
        case (1<<8): //K1
            led_on();
            break;
        
        case (1<<11): //K2
            led_off();
            break;
        
        case (1<<13): //K3
            led_on();
            break;
        
        case (1<<14): //K4
            led_off();
            break;
        
        default:
            break;
    }
    
    /* 中断清除 相应的位 1 */
    *(EINTPEND) = value;
    
    *(SRCPND) = 1 << 5;
    *(INTPND) = 1 << 5;
}

3.button.c

#define GPGCON  (volatile unsigned long *)0x56000060

/*
 * K1,K2,K3,K4对应GPG0、GPG3、GPG5、GPG6
 */
#define GPG0_int     (0x2<<(0*2))
#define GPG3_int     (0x2<<(3*2))
#define GPG5_int     (0x2<<(5*2))
#define GPG6_int     (0x2<<(6*2))

#define GPG0_msk    (3<<(0*2))
#define GPG3_msk    (3<<(3*2))
#define GPG5_msk    (3<<(5*2))
#define GPG6_msk    (3<<(6*2))

void button_init()
{   
        *(GPGCON) &= ~(GPG0_msk | GPG3_msk | GPG5_msk | GPG6_msk);
    *(GPGCON) |= GPG0_int | GPG3_int | GPG5_int | GPG6_int;
}

@以上代码仅供参考。

时间: 2024-10-14 03:05:27

初始化中断按键(2440)的相关文章

20150218【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 一.使用struct pin_desc 管理按键的值 1.定义结构体 2.将前面我们申请中断时写的(void *)1修改为 &pins_desc[n] 在ioctl中,设置中断中修改 在key_release中释放中修改 3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值 4.得到按键键值后,唤醒程序,在read函数中返回键值 附上驱动源程序: 1 /***********

20150218【改进信号量】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进信号量]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 前面我们使用POLL查询方式来实现GPIO-IRQ按键中断程序 这里我们来使用信号量,让我们的驱动同时只能有一个应用程序打开. 一.首先在前面代码的基础上来一个简单的信号 1.定义一个全局的整形变量 2.在打开函数中,每次进入打开函数canopen都自减1, 3.当我们不使用时,在realease 中canopen自加1 4.这样就实现了一个简单的信号量,我们编译,测试 当我们使用两个应用程序来

20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进Poll定时查询]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值. 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回. 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descrip

23.核心初始化之中断屏蔽-2440

23.核心初始化之中断屏蔽-2440 ? 在上一节中,我在设置关闭看门狗的时候,已经把WTCON的[2]设置为0,屏蔽了中断.如下图: 这一节是要屏蔽中断寄存器: 下面是2440芯片处理中断的机制: 中断屏蔽寄存器: ? 可以看到,只要把中断对应的中断屏蔽寄存器对应的位置为1即可.所以屏蔽中断就是往中断屏蔽寄存器置为全1,就屏蔽了所有中断. ? 编译: ? ?

字符设备之中断按键

从题目就可以意会到这一节还是关于字符设备的驱动,不过是另一种技巧:中断.这个词一点都不陌生. 一.先来分析今天的重量级函数request_irq(),看看他的函数原型就行了,先不进行深入分析. int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev_id); 关键是参数的意义: ①irq:中断号,在irqs.h中定义,每一条中断线上面对应一个中

IMX257实现GPIO-IRQ中断按键驱动程序

IMX257实现GPIO-IRQ中断按键驱动程序 2015-02-18 李海沿 ????昨天我们已经实现了中断查询的方式实现GPIO按键驱动程序,但是,有一个缺点就是,当我们把应用程序放在后台执行时,即便没有按键,应用程序while循环中的read函数也不断的在运行,严重的导致了CPU资源的浪费. ????本文中,我们在前面按键查询驱动程序的基础上来修改. ????大概介绍一下设计思路吧: ????和前面的差不多,当我们加载驱动时,首先在init函数中,对GPIO功能进行模式设置,都设置为GPI

中断——按键控制LED状态

程序功能:按键控制LED状态,中断实现. 现象描述:当按下k键时,LED0总会闪烁,从而影响其他LED. 注意:用杜邦线把P3.2引脚(INT0)与开关K引脚相连. 程序: ORG 0000H LJMP MAIN ORG 0003H ;外部中断0入口 LJMP INT0 ORG 0200H MAIN:SETB EA ;开启总中断 SETB EX0 ;开启外部中断 0,即P3.2引脚 CLR IT0 ;设置成 低电平触发方式 SJMP $ ;主程序只等待中断 INT0:DEC P1 ;外部中断 0

中断按键驱动

有很多Linux 的驱动都是通过中断的方式来进行内核和硬件的交互. 在 Linux 设备驱动中,使用中断的设备需要申请和释放对应的中断,分别使用内核提供的request_irq()和free_irq()函数. 驱动程序申请中断和释放中断的调用在include/linux/sched.h里声明. request_irq()调用的定义: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt

【黑金ZYNQ7000系列原创视频教程】06.ZYNQ来自FPGA的中断&mdash;&mdash;按键中断实验

黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36640&extra=page%3D1 爱奇艺地址: http://www.iqiyi.com/w_19rugglzn1.html?source=