S3C2440 外部按键中断解析

发布者:beup001最新更新时间: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  外部按键  中断 引用地址:S3C2440 外部按键中断解析

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

推荐阅读最新更新时间:2024-11-12 11:27

2440启动代码和中断处理过程
启动代码与Bootloader不同,主要是指进入C语言之前的汇编代码,网上都称为是bootloader的stage1,一般通用的内容包括: (1) 定义程序入口点 (2)设置异常向量表 (3)初始化存储系统 (4)初始化用户程序的执行环境 (5)初始化堆栈指针寄存器,改变处理器的模式 (6)设置FIQ/IRQ中断处理程序入口 (7)进入C程序 1、编译器选择 GBLL THUMBCODE 因为处理器分为16位/32位两种工作状态,程序的编译器也是分16位和32两种编译方式,所以这段程序用于根据处理器工作状态确定编译器编译方式,程序不难理解,主要解释一下符号 的意思,上面的程序是指: if({CONFIG} = 1
[单片机]
带缓存中断响应的4*4键盘函数
#include key.h #include scom.h unsigned char KeyNum ={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; //键值缓存区 unsigned char KeyCntWr; //写键值计数器 unsigned char KeyCntRd; //读键值计数器 //unsigned char KeyNum; void KeyInit(void) { P1DIR=0Xf0; P1REN=0X0f; //使能上拉 P1OUT=0X0f; P1IFG=0x00; P1IE=0X0f; //中断使能 P1IES
[单片机]
STM32F4定时器 -- 定时中断
1. 定时器简介 STM32F4的定时器分布如下: - 其中基本定时器包括TIM6、TIM7,其结构最简单,也具有最基本的定时功能,一是用于基本定时、产生时基、二是用于驱动DAC数模转换器。 - 其中通用定时器包括TIME2-TIME5,TIME9-TIME14共10个;通用定时器除了包含基本定时器的功能外还有输入捕获、输出比较和PWM功能等。 - 其中高级定时器包括TIM1、TIM8; 定时器的相关常用寄存器功能如下: 1.1 时钟源选择寄存器(TIMx_SMCR) 定时器的时钟源有4个: - 内部时钟(CK_INT) - 外部时钟模式1:外部输入脚(TIx) - 外部时钟模式2:外部触发输入(ETR),仅适用于TIM2、
[单片机]
谈谈和S3C2440的对比
最新做一个有一定运算量的Linux平台项目,由于有功耗的要求,选择了这款S5P210 Cortex-A8开发板。照片如下,总体看起来做工各方面还是比较好的,特别是核心板厂家说是直接从产品转过来的,稳定性应该不错。 对于之前一直使用的是三星S3C2440的开发板的童鞋而言,这款同样是三星推出的Cortex-A8 Soc总体来说上手应该比较快的。苹果的经典产品iphone4当年使用的A4处理器,基本上是这款芯片的克隆,也是有三星代工生产的。现在这款芯片价格骤降,开发板综合成本比6440还低,但性能却远不是2440可比,需要用ARM做项目的可以考虑了。下面就简要对比一下二者,方便童鞋们上手: 一、基本参数 1、基于Cortex-A
[单片机]
谈谈和<font color='red'>S3C2440</font>的对比
UART-中断模式
init.c /* * init.c: 进行一些初始化 */ #include s3c24xx.h void disable_watch_dog(void); void clock_init(void); void memsetup(void); void copy_steppingstone_to_sdram(void); /* * 关闭WATCHDOG,否则CPU会不断重启 */ void disable_watch_dog(void) { WTCON = 0; // 关闭WATCHDOG很简单,往这个寄存器写0即可 } #define S3C2410_MPLL_200MHZ ((0x5c
[单片机]
中断中断寄存器的处理流程
a. 外部子中断 外部子中断的屏蔽位主要有两个寄存器(即屏蔽寄存器),EINTMASK和INTMSK,所以要产生中断,必须将这两个寄存器中对应的屏蔽位中断使能即可。这两个寄存器一般只在初始化的时候使用。 中断暂存寄存器,EINTPEND和SRCPND,中断产生后将会使这两个寄存器对应的位置1,所以中断服务函数必须将这两个寄存器中的对应的中断标志位清除(写1清除),否则会一直产生中断。注意:需要先清除EINTPEND,然后在清除SRCPND的中断标志位。这两个寄存器一般只在中断产生后中断标志的清除,用于中断服务函数中。 INTPND是中断最高优先级寄存器,也需要在中断服务函数中进行清除。 INTMOD是设置中断是FIQ还是I
[单片机]
s3c2440的LCD应用详解
人机交互是嵌入式系统必须具有的功能。比较简单的人机交互有按键、LED、蜂鸣器,稍微复杂的有7段数码管和点阵。但如今这些都不能满足人们的需求了,所以又出现了LCD和触摸屏技术。s3c2440具有LCD和触摸屏接口,可以很好的连接LCD和触摸屏。这篇文章主要介绍TFT型LCD的用法。 要想正确使用LCD,必须注意两点:1、时序;2、显示缓存区。 1、时序 LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即每秒屏幕刷新的次数(单位Hz)。HSYNC是水平同步信号,在每进行一行的扫描之前,该信号就有效一次,
[单片机]
STM32是如何进入中断服务函数xxx_IRQHandler的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口。 以串口中断服务函数void USART1_IRQHandler(void) 为例,首先用到串口中断,需要先设定串口中断初始化以及串口初始化,另外void USART1_IRQHandler(void) 中断服务函数也应该写好。 发现在stm32的启动文件startup_stm32f10x_md.s中写到 DCD USART1_IRQHandler 其中DCD是一条数据定义伪指令,用于分配一片连续的字存储单元并用指定的数据初始化。 库里定义 #define USART1 ((
[单片机]

推荐帖子

1
111
forgetful 嵌入式系统
问题:IGBT开关波形在脉冲很小情况下带电感负载情况
有高人给指点一下,是什么结果?问题:IGBT开关波形在脉冲很小情况下带电感负载情况
eeleader 工控电子
安防技术讨论群:QQ50982007
电子安防技术和元器件性能讨论及查找样品,欢迎加入!!安防技术讨论群:QQ50982007
angus.ren 安防电子
IGBT和 干簧继电器相比有什么优势?
IGBT和干簧继电器相比有什么优势?或者哪个更有优势?谢谢!IGBT和干簧继电器相比有什么优势?很少有人对这两种东西进行比较。一般地说,相近的两种东西才会进行比较。而它们应用的场合完全不同。干簧继电器属于继电器的一种,一个干簧管作为开关,在它外面绕上线圈用于控制触点。它的开关是机械式IGBT从原理上相当于一个MODFET和一晶体管复合得到的器件,它可以在“直流”电路中起到开关作用,它是电子式的。在电压电流特性上,机械式都有电子式不可比拟的优异特性,如耐冲击、耐过载……
zlj740917 汽车电子
各位,在VS2005下面编译,C怎么嵌入汇编
请各位帮忙!各位,在VS2005下面编译,C怎么嵌入汇编_asm{movr0,r3}即可谢谢回复。这个我试过,编译时说没有_asm这个关键字。VS2005不支持_arm内嵌汇编,需要自定义生成规则(rule),用armasm.exe编译arm汇编。这样啊。还要自定义规则。算了。
nwuwmz 嵌入式系统
基于PIC24FJ64的智能光伏汇流采集装置设计及应用
摘要:介绍一种基于16位单片机PIC24FJ64为主控芯片应用于智能型光伏汇流箱的多回路光伏汇流采集装置AGF-M16的设计原理,以及该产品主要技术指标与应用。关键字:PIC24FJ64芯片;智能光伏汇流箱;AGF-M16型;霍尔传感器;设计;应用0引言伴随着世界人口的不断增长和城市化进程的不断推进,化石能源日趋枯竭,燃烧化石燃料所导致的环境污染日趋严重。从而使太阳能这种清洁能源备受关注,太阳能是一种低密度的平面能源,需要数量巨大的太阳能电池板阵列进行串并联组
acrel008 电源技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved