s5pc100中断按键驱动

本文介绍了一个基于S5PC100平台的按键控制实例,通过配置向量中断控制器并编写中断处理函数,实现了KEY1和KEY2的按键响应功能。当按键被按下时,会在终端上打印相应的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面介绍一个中断实例,该例子实现了S5PC100按键控制。当按下KEY1和KEY2时,会从终端上打印出相应的按键信息。其中KEY1对应的是EINT1中断源,KEY2对应的是EINT2中断源。

1.电路原理

电路原理图如图7-10所示。


 

2.编程流程

编程流程如图7-11所示。


 

3.程序编写

(1)相关寄存器定义如下。

#define     VIC0ADDRESS      __REG(0xE4000F00)
#define     VIC1ADDRESS      __REG(0xE4100F00)
#define     VIC2ADDRESS      __REG(0xE4200F00)
#define     VIC0VECADDR1      __REG(0xE4000104)
#define     VIC0VECADDR2      __REG(0xE4000108) //定义寄存器地址
typedef struct {
    unsigned int VIC0IRQSTATUS;
    unsigned int VIC0FIQSTATUS;
    unsigned int VIC0RAWINTR;
    unsigned int VIC0INTSELECT;
    unsigned int VIC0INTENABLE;
}interrupt;
#define  INTERRUPT (* (volatile interrupt *)0xE4000000 )

(2)向量中断控制器初始化及配置。

 VIC0VECADDR1 = (unsigned int)int_key1; //将中断向量地址寄存器赋值
GPH0.GPH0CON =(GPH0.GPH0CON & (~(0xf<<4)))+(0x2<<4);
  INTERRUPT.VIC0INTENABLE = INTERRUPT.VIC0INTENABLE | (1<<1);//使能EINT1源
 VIC0VECADDR2 = (unsigned int)int_key2;//将中断向量地址寄存器赋值
 GPH0.GPH0CON =(GPH0.GPH0CON & (~(0xf<<8)))+(0x2<<8);
 INTERRUPT.VIC0INTENABLE = INTERRUPT.VIC0INTENABLE | (1<<2);//使能EINT2源

(3)IRQ跳转函数的实现。

void do_irq()
{
 printf("in do_irq\n");
 ((void (*)(void))VIC0ADDRESS)();
}

(4)按键1处理函数的实现。

/*中断处理程序1*/
void int_key1()
{
 printf("in int_key1\r\n");
 VIC0ADDRESS = 0;//清除中断
}

(5)按键2处理函数的实现。

/*中断处理程序2*/
void int_key2()
{
 printf("in int_key2\r\n");
 VIC0ADDRESS = 0; //清除中断
}

4.实验过程及结果描述

(1)将程序编译后产生.bin可执行文件,然后使用uboot的dnw命令下载到0x20008000这个内存地址,使用go命令去执行,并观察结果。

(2)终端打印结果如图7-12所示。


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值