S3C2440中断处理机制及具体实现(裸机开发)

文章目录

  • 前言
  • 一、中断(interrupt)
  • 二、流程图
  • 三、S3C2440按键中断编程
  • 总结


前言


本期主要分享的是中断处理机制,具体分析S3C2440开发板的中断处理流程,通过此流程来学习中断处理的整个过程;中断是一种资源,更是一种特殊的业务处理方法,在什么时候使用中断,中断处理函数中怎样处理都是需要程序编写者去仔细斟酌的;

一、中断(interrupt)

中断简单的来说就是当CPU接收到中断信号时进行中断处理的过程;那么这个过程一般是经过如下步骤来进行的;
(1)中断信号产生
(2)spsr = cpsr(保护现场),lr = pc;
(3)cpu跳转到异常向量表基地址固定偏移量处执行中断处理函数;
(4)cpsr = spsr(恢复现场),pc= lr - 4;
因此呢从大流程上来讲,中断其实就是当中断信号产生后,相应的标志位会进行置位,CPU内部的中断控制器会对终端进行甄别,进而执行中断处理函数;
这里需要说明的是S3C2440一共有提供60个中断信号源;

二、流程图

S3C2440中断处理机制及具体实现(裸机开发)_第1张图片
上图为中断处理的框图,首先中断源分为有子中断和无子中断两类;
(1)当有子中断时,SUBSRCPND和SRCPND会自动置位,紧接着需要将中断屏蔽寄存器和次级中断屏蔽寄存器(SUBMASK和INTMSK以及INTSUBMSK设置为0)使能(开启中断服务),此时表明中断设置成功;
接下来使用INTOFFSET中断偏移寄存器可以准确定位到中断处理函数的地址处,进而进行中断处理;需要注意的是在中断处理函数中,当处理完业务之后,必须将之前因中断产生而置位的中断标志位清除(一般写入1即可),顺序必须遵循如上框图,从左至右,依次清除;
(2)无子中断的处理过程和有子中断的基本一致,省略掉子中断的那一部分即可;

三、S3C2440按键中断编程

下面举个例子来介绍一下一个完整的中断处理函数的编写过程,这里使用的是S3C2440的按键1中断,首先在原理图上寻找中断标号,进而在用户手册中进行查询;
在这里插入图片描述

外部中断:通过引脚接收
S3C2440有24个外部中断引脚
EXTINT0 —》设置信号
EINTMASK–》信号使能
EINTPEND–》 信号标志
S3C2440中断处理机制及具体实现(裸机开发)_第2张图片

S3C2440中断处理机制及具体实现(裸机开发)_第3张图片
GPG0设置为中断模式
S3C2440中断处理机制及具体实现(裸机开发)_第4张图片

#include "eint.h"

void eint_init()
{
	//io
	GPGCON &= ~0x3;
	GPGCON |= 0x2;					//将GPG0设置为中断模式
	EXTINT1 &= ~0xf;
	EXTINT1 |= (1<<3);  			//使能滤波  低电平出发(开关按下低电平)
	EINTMASK &= ~(1<<8); 			//使能eint8
	INTMSK &= ~(1<<5); 				//使能5号中断
}

void do_key()
{
	uprintf("key1 is down\n");
	EINTPEND |= 1<<8;
	SRCPND |= 1<<5;
	INTPND |= 1<<5;					//清除中断标志位
}

接下来看一下主函数里面的验证,那当然不需要做什么操作了,只需要在开始的时候进行eint_init()就可以啦,中断发生的时候在串口上可以看见打印消息:key1 is down;


总结

本期和大家主要分享的是S3C2440裸机开发中中断处理机制以及中断处理函数的具体编写过程,本其内容可以和启动代码对照结合理解,这样就能够理解启动代码中一些中断处理原理,希望小伙伴们能够在练习后得到深刻理解!最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

你可能感兴趣的:(ARM体系结构与接口技术,arm开发,linux,嵌入式硬件,中断处理,嵌入式开发)