S3C2440 外部按键中断解析

最新更新时间:2022-04-21来源: eefocus关键字:S3C2440  外部按键  中断 手机看文章 扫描二维码
随时随地手机看文章

学习bootloader制作的过程中,学到 “通过按键进入中断控制LED亮灭”的实验时,自己所用的开发板和视频讲解中的不同,于是琢磨了一下中断涉及到的各个寄存器,并进行编码尝试,最终完成了实验,达到了通过按键以中断方式控制LED亮灭的目的。2440属于非向量中断方式,和6410、210的向量中断方式对于中断的处理有一些不同,因此本文的讲解并不完全适合6410和210。


一、概念


中断分为两大类:外部中断和内部中断。


1、外部中断:S3C2440的24个外部中断占用GPF0~GPF7(EINT0~EINT7)、                                                 GPG0~GPG15(EINT8~EINT23)。使用这些引脚作为中断输入时,必须将引脚配置为EINT模式,配置方法可参考datasheet。


2、内部中断:内部中断包括DMA中断、UART中断、IIC中断等等由内部外设触发的中断。


3、相关寄存器:S3C2440中断控制涉及到10个寄存器-- SRCPND、INTMOD、INTMSK、PRIORITY、INTPND、INTOFFSET、SUBSRCPND、INTSUBMSK、EINTMASK、EINTPEND,这10个寄存器的定义及其功能描述如下表一。对中断的控制无外乎配置和处理这10个寄存器中的某几个。


表一  与S3C2440中断相关的10个寄存器的信息

4、各寄存器的关系(工作流程)。根据中断源进行分类,中断的处理流程可用下图1表示:

图1  S3C2440中断处理流程图


由上图1可知,S3C2440的中断可分为四种情况:由外部中断源(EINT0~EINT3)触发的中断、由外部中断子中断源(EINT4~EINT23)触发的中断、由内部中断源(内部子中断)触发的中断和由内部中断源(非子中断)触发的中断。


5、中断的开启(中断初始化,INTMOD 和 PRTORITY使用默认值)


(a)如果是外部中断(EINT0~EINT3)和内部中断(不带子中断),需设置INTMSK,让它不屏蔽中断即可;


(b)如果是带子中断的内部中断,需设置INTSUBMSK 和 INTMSK,让它们不屏蔽中断即可;


(c)如果是外部中断(EINT4~EINT23),需设置EINTMASK 和 INTMSK,让它们不屏蔽中断即可;


注意:CPSR中的第7位I也需清除(在start.S中关闭了中断,这一步是针对在bootloader设计中进行EINT实验时的操作)


6、中断处理流程


(a)如果是外部中断(EINT0~EINT3)和 不带子中断的内部中断,发生中断后SRCPND相应位置1,如果没有被 INTMSK屏蔽,那么等待进一步处理;


(b)如果是带子中断的内部中断,发生中断后SUBSRCPND相应位置1,如果没有被INTSUBMSK屏蔽,则SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理;


(c)如果是外部中断(EINT4~EINT23),发生中断后EINTPEND相应位置1,如果没有被EINTMASK屏蔽,则SRCPND相应位EINT4-7和EINT8~23置1,如果没有被INTMSK屏蔽,那么等待进一步处理;


三种中断都等待进一步处理了,接下来从SRCPND继续往前看,看看INTMSK,如果中断被屏蔽了,就不用说了(注意:快中断也能被屏蔽)。如果没有被屏蔽,那么会进一步到INTMOD。如果是快中断,那么直接出来,进入FIQ(即CPU进入快中断模式处理)。如果是普通中断,那么SRCPND可以有多位置1(FIQ只能有一个),这时就会经过PRIORITY选出一个优先级高的,然后根据选出的中断把INTPND相应位置1(注意:只能选出一个),进入IRQ,让CPU处理。


INTOFFSET寄存器用来表示INTPND中哪一位置1了,可以用来判断请求中断的中断源,但是,对于外部中断EINT4~EINT23是无法判断的,如EINT4~EINT7中任何一个中断源请求中断,都会将INTOFFSET中的位EINT4_7置1,所以要判断具体是哪个中断源请求的中断,可读取EINTPEND中的值进行判断。


7、中断的清除


(a)如果是外部中断EINT0~EINT3 和不带子中断的内部中断,只需清除SRCPND(注意:清除时对相应位写“1”);


(b)如果是带子中断的内部中断,需清除SRCPND和SUBSRCPND,注意先清除SUBSRCPND,再清除SRCPND。因为如果先清除SRCPND的话,在清除SUBSRCPND的过程中,SRCPND会以为又有中断发生,又会置1,也就是说一次中断会响应两次,所以必须先掐断源头,对它们同样是写“1”清除


(c)如果是外部中断EINT4~EINT23,需清除EINTPEND和SRCPND(同样注意顺序),写“1”清除。


二、按键中断实验

1、所使用开发板的按键与芯片连接示意如下图2,其中KEY1 --> GPF4, KEY2--> GPF5,KEY3 --> GPF6,KEY4 --> GPF7。

图2  按键与S3C2440连接示意


通过查阅s3c2440的datasheet可知,GPF4~GPF7对应外部中断EINT4~EINT7。所以对于中断初始化,需设置寄存器EINTMASK和INTMSK,取消中断屏蔽。中断处理过程中,可通过阅读EINTPEND寄存器的值判定触发中断的中断源。中断清除时,向EINTPEND和SRCPND中相应位写“1”,清除中断(注意顺序)。以下为实验的源代码:


/*interrupt registes*/

#define  SRCPND (volatile unsigned long *)0x4a000000 //Interrupt request status

#define  INTMOD (volatile unsigned long *)0x4a000004 //Interrupt mode control

#define  INTMSK (volatile unsigned long *)0x4a000008 //Interrupt mask control

#define  PRIORITY (volatile unsigned long *)0x4a00000c //IRQ priority control

#define  INTPND (volatile unsigned long *)0x4a000010 //Interrupt request status

#define  INTOFFSET      (volatile unsigned long *)0x4A000014 //Interrupt request source offset

#define  SUBSRCPND      (volatile unsigned long *)0x4A000018 //Sub source pending

#define  INTSUBMSK      (volatile unsigned long *)0x4A00001c //Interrupt sub mask

#define  EINTMASK       (volatile unsigned long *)0x560000a4 //External interrupt mask register

#define  EINTPEND       (volatile unsigned long *)0x560000a8 //External interrupt pending register

 

/*******************************************************************

*函数名称:init_irq()

*功能描述:中断初始化(取消中断屏蔽)

*其他说明:按键中断对应的是外部中断EINT4~7,所以设置EINTMASK、INTMSK

*修改日期       版本号       修改人 修改内容

*------------------------------------------------------------------

*2015.12.5 V1.0         

*******************************************************************/

void init_irq()

{

*(EINTMASK) &= ((~(1 << 4)) & (~(1 << 5)) & (~(1 << 6)) & (~(1 << 7)));    //取消EINT4~7的子中断屏蔽(注意,这步必须在后面一步之前)

*(INTMSK)   &= (~(1 << 4));    //取消EINT4~7的中断屏蔽

 

/***清除CPSR寄存器中的第7位I(IRQ disable),因为在start.S中关闭了中断****/

__asm__(

"mrs r0, cpsrn"

"bic r0, r0, #0x80n"

"msr cpsr_c, r0n"

:

:

);

}


 

/*******************************************************************

*函数名称:handle_int()

*功能描述:中断处理函数

*其他说明:

*修改日期       版本号       修改人 修改内容

*------------------------------------------------------------------

*2015.12.6 V1.0         

*******************************************************************/

void handle_int()

{

/*判断产生中断的中断源*/

unsigned long value = *(INTOFFSET);

unsigned long value_offset = *(EINTPEND); //value_offset的值分别对应EINT4~EINT7

if (4 == value) //value = 4 表明EINT4 ~ EINT7请求中断 (这个条件不是必须的,可直接判断value_offset)

{

switch (value_offset)

{

case 0x00000010 : //EINT4 --> k1

led_on();

break;

case 0x00000020 : //EINT5 --> k2

led_on();

break;

case 0x00000040 : //EINT6 --> k3

led_off();

break;

case 0x00000080 : //EINT7 --> k4

led_off();

break;

default :

break;

}

}

/*清除中断标志*/

*(EINTPEND) = value_offset; //把EINTPEND中当前值重新赋给EINTPEND,即相当于对相应位置1清除(不过这

//样做的前提是可以明确只发生一个中断,不然有可能将其他的中断请求清除)

*(INTPND) = 1 << 4;

}

关键字:S3C2440  外部按键  中断 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic565173.html

上一篇:Jlink调试2440进不了中断的看这里
下一篇:uboot-2011.12移植到S3C2440(三序)——MMU Cache/TLB/etc on/off functions

推荐阅读

MSP432笔记——按键中断
GPIO按键外部中断所用板卡 MSP432P401R LaunchPad按键电路图按键连接GPIO P1.1 P1.4按键按下时,对应IO变化为低电平,按键必须使用上拉电阻程序编写使用库函数 driverLibmain中需要的步骤{设置IO输入/输出方向,带上拉电阻的输入模式清除中断标识位,在配置时就需要清除标志位设置中断触发边沿,上升沿/下降沿使能GPIO中断使能总中断(3个中断函数)}main源码int main(void){ /* Stop Watchdog */ MAP_WDT_A_holdTimer(); //GPIO Interrupt test GPIO_setAsInputPinWithPullUpResis
发表于 2022-08-10
MSP432笔记——<font color='red'>按键</font><font color='red'>中断</font>
MSP432笔记——TIM定时器中断
使用driverlib库函数以TA3为例前期配置时钟源信号源电压等级flash //Flash FlashCtl_setWaitState(FLASH_BANK0,1); FlashCtl_setWaitState(FLASH_BANK1,1); //PCM state PCM_setPowerState(PCM_AM_LDO_VCORE1); //CS configure CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);配置定时器 Config参数配置结构体 config开始定时器 start使能定时器中断 (清空标志位、打开定时器的中断) Timer_A_UpMod
发表于 2022-08-10
基于MSP432的中断练习
/*MSP432:基于寄存器编程:利用P1.1和P1.4引脚外部中断,实现对LED灯亮灭的控制。P1.1和P1.4引脚连接S1和S2按键,该按键按下将触发引脚中断,P2.1和P2.2引脚分别连接连个LED灯,当按键P1.1被按下后,P2.1引脚LED灯的亮灭状态将会发生翻转,当按键P1.4按下后,P2.2引脚的电平将发生翻转。*///中断服务程序extern void PORT1_IRQHandler(void){ if(P1IFG & BIT1) { P2OUT ^= BIT1; P1IFG &= ~BIT1; } if(P1IFG & BIT4) { P2OUT ^= BIT2; P1IFG &
发表于 2022-08-10
基于MSP432的<font color='red'>中断</font>练习
51单片机——定时计数器中断
先写IE寄存器中断允许寄存器,再写中断处理函数就行定时模式下触发一次中断后TH和TL的值会默认复位为0,需要在中断服务函数里重新设定初值。例void timer0() interrupt 1{ TH0 = 0x4b; TL0 = 0xfd;}应用数码管动态扫描,按键按下也能继续执行扫描
发表于 2022-08-09
51单片机——定时计数器<font color='red'>中断</font>
STM32HAL库串口处理---中断收发
利用STM32串口中断收发和buffer机制(循环队列的原理)实现数据的准确接收和发送。为后续添加上层通信协议建立基础。为了方便使用,为函数接口统一标准Arduino串口机制的接口函数void begin(unsigned long baud);//初始化接口void end(void);//关闭串口int available(void);//获取缓存中可以读取的字节数int peek(void);//从缓存中读取字节数据,但不删除该数据int read(void);//从缓存中读取字节数据,并删除该数据int availableWrite(void);//获取发送缓存还可以写入的字节数void flush(void); //将发送
发表于 2022-08-09
MSP432E401Y-按键中断点灯
承接上一篇文章,这次是用按键触发外部中断,通过LED灯显示 这次的实验也是通过对寄存器进行操作来实现相关功能。在进行代码编写之前,先来了解一下关于GPIO寄存器的中断定义解释以及不同赋值下的功能解释。1.GPIO -> IS(Interrupt Sense) :触发状态选择寄存器 0x00:边缘触发 0x01:电平触发2.GPIO -> IBE(Interrupt Both Edges):双边触发寄存器 0x00:正常触发中断 0x01:下降沿上升沿都触发中断3.GPIO -> IEV(Interrupt Event):触发方式选择寄存器 0x00:下降沿触发或者低电平触
发表于 2022-08-08

推荐帖子

放大电路在反馈电阻上加电容的作用?
本信息来自合作QQ群:电子工程师技术交流(12425841)群主在坛子ID:Kata 请问:放大电路在反馈电阻上加电容,什么作用?放大电路在反馈电阻上加电容的作用?
鸿鹰 模拟电子
LPC1114F样片申请-接受申请中……
名称:LPC1114F样片申请 活动赞助:深圳伟博创科技有限公司 活动时间:2010年7月13日~2010年8月13日 申请要求:1、EEWORLD全体会员;2、秀创意:详尽说明利用该芯片可进行的DIY项目。详情点击:http://www.eeworld.com.cn/zhuanti/20100712WEBOCH接下来还会有DIY,大家要关注哦!申请者请更新注册信息:包括姓名、手机、地址、qq/msn。LPC1114F样片申请-接受申请中……
EEWORLD社区 NXP MCU
995美元Spartan6开发板,花落谁家?
Spartan®-6FPGA嵌入式套件基于Spartan-6LX45TFPGA,该套件包含嵌入式开发所需的可扩展式开发板与主要工具和IP。995美元Spartan6开发板,花落谁家?
小志 活动列表
想买MINI2440怎么联系团购
本帖最后由ddllxxrr于2016-1-717:19编辑想买MINI2440怎么联系团购想买MINI2440怎么联系团购
joly314 淘e淘
有没有那位做过Labview for ARM的,问下如何添加在Labview中添加对LM3S9b96的支持?
有没有那位做过LabviewforARM的,问下如何添加在Labview中添加对LM3S9b96的支持? [本帖最后由sptt1于2011-11-915:19编辑]有没有那位做过LabviewforARM的,问下如何添加在Labview中添加对LM3S9b96的支持?
sptt1 微控制器 MCU
大功率三极管13005
13005是NPN型高反压开关三极管,主要参数:1、集电极与基极的最高反向耐压为700V伏特。2、集电极与发射极的最高反向耐压为400伏特。3、电流IC4安。主要用途高频大功率三极管主要用于功率驱动电路、功率放大电路、通信电路的设备中。低频大功率三极管的用途很广泛,如电视机、扩音机、音响设备的低频功率放大电路、稳压电源电路、开关电路等。13005是NPN型高反压开关三极管,主要参数:1、集电极与基极的最高反向耐压为700V伏特。2、集电极与发射极的最高反向耐压为400伏特。3、发射极与
仁懋电子 分立器件
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved