当前位置: 首页 > news >正文

S3C2440中断

一、中断执行的流程

soc中断的执行流程

1、中断源发生中断请求

2、CPU检查该中断是否被屏蔽,以及总中断是否被屏蔽

3、考察中断优先级

4、保护现场

5、执行中断服务函数

6、恢复现场

二、中断初始化

1、设置中断模式(INTMOD)寄存器(设置中断处于那种状态)

此寄存器由32位组成,其每一位都都涉及一个中断源。如果某个指定为被设置为1,则在FIQ(快中断)模式 中处理相应中断。否则则在IRQ模式中处理。

2、设置中断屏蔽(INTMSK)寄存器(打开中断源)

此寄存器由32位组成,其每一位都都涉及一个中断源。如果某个指定为被设置为1,则CPU不会去服务来自 相应中断源(请注意即使在这种情况中,SRCPND寄存器的相应位也设置为1)的中断请求。如果屏蔽位为0,则 可以服务中断请求。

3、设置对应的中断源的触发方式以及工作方式

GPG等寄存器,使其工作在中断模式下

EXTINTn(外部中断控制寄存器n)设置中断触发方式

8个外部中断可以由多种信号触发方式所请求。EXTINT寄存器为外部中断配制信号触发方式为电平触发或边 沿触发,同时还配制信号触发极性。

4、将内部的具体的中断屏蔽位进行置位EINTMASK(外部中断屏蔽寄存器)

0 = 使能中断 1 = 禁止中断

三、中断执行

1、执行中断服务程序完之后恢复

EINTPEND(外部中断挂起寄存器),记录了有没有该中断源发生中断,所以一旦中断进行响应,我们需要立刻将其置1清零此位(具体哪一位中断进行响应)

中断挂起(INTPND)寄存器 中断挂起寄存器中32位的每一位都表明了是否相应未屏蔽并且正在等待中断服务的中断请求具有最高的优先 级。当INTPND寄存器在优先级逻辑后被定位了,只有1位可以设置为1并且产生中断请求IRQ给CPU。IRQ的 中断服务程序中可以读取此寄存器来决定服务32个中断源的哪个源。

SRCPND寄存器由32位组成,其每一位都涉及一个中断源。如果中断源产生了中断则相应的位被设置为1并 且等待中断服务。因此此寄存器指示出是哪个中断源正在等待请求服务。注意SRCPND寄存器的每一位都是由中 断源自动置位,其不顾INTMASK寄存器中的屏蔽位。另外SRCPND寄存器不受中断控制器的优先级逻辑的影响。 在指定中断源的中断服务程序中,必须通过清除SRCPND寄存器的相应位来正确的获得来自相同源的中断请 求。如果从ISR中返回并且未清除相应位,则中断控制器的操作就好像其它中断请求已经从同一个源进入了。换句 话说,如果SRCPND寄存器的指定位被设置为1,其通常被认作一个有效中断请求正在等待服务。 清除相应位的时间依赖于用户的需要。如果希望收到来自相同冤源的其它有效请求,则应该首先清除相应位, 并且接着使能中断。 可以通过写入一个数据到此寄存器来清除SRCPND寄存器的指定位。其只清除那些数据中被设置为1的相应 位置的SRCPND位。那些数据中被设置为0的相应位置的位保持不变。

注意

要先进行清SRCPND,否则会一直进行中断响应

中断偏移(INTOFFSET)寄存器 中断偏移寄存器中的值表明了是哪个IRQ模式的中断请求在INTPND寄存器中。此位可以通过清楚SRCPND 和INTPND自动清除。(通过查改位置可以判断是那个中断进行响应)

四、例子

//初始化
void init_key(void)
{unsigned int t;INTMOD &= ~(1 << 5); INTMSK &= ~(1 << 5);t = GPGCON;t &= ~((3 << 0)|(3 << 3) | (3 << 5));t |= (2 << 0) | (2 << 6) | (2 << 10);GPGCON = t;t = EXTINT1;t &= ~((0x0F << 0)| (0x0F << 8) | (0x0F << 16));t |= (1 << 3) | (1 << 11) | (1 << 13);t |= (2 << 0) | (2 << 12) | (2 << 20);EXTINT1	= t;EINTMASK &= ~((1 << 8)| (1 << 11) | (1 << 13));}
//函数的执行
void irq_handler(void)
{if(INTOFFSET == 5){if((EINTPEND & (1 << 8)) != 0){led_on(4);}else if((EINTPEND & (1 << 11)) != 0){beep_on();}else if((EINTPEND & (1 << 13)) != 0){beep_off();}EINTPEND = EINTPEND;}SRCPND = SRCPND	;INTPND = INTPND;	
}

http://www.lryc.cn/news/442975.html

相关文章:

  • 编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MinGW版)
  • SQLyou基础用法讲解
  • Can‘t get Kerberos realm
  • [python]从零开始的PySide安装配置教程
  • LeetCode[中等] 74.搜索二维矩阵
  • overleaf如何下载论文的pdf
  • Java 每日一刊(第13期):this super static
  • 关于一些Spring的配置的作用
  • 利用Python与Ansible实现高效网络配置管理
  • JDBC技术在不同数据库系统中的兼容性及Java数据库交互技术概览
  • 双击热备 Electron网页客户端
  • 数据中台系统产品原型RP原型Axure高保真交互原型 源文件分享
  • 论文阅读笔记:Sapiens: Foundation for Human Vision Models
  • 【学术会议:中国厦门,为全球的计算机科学与管理科技研究者提供一个国际交流平台】第五届计算机科学与管理科技国际学术会议(ICCSMT 2024)
  • RK3588/RK3588s运行yolov8达到27ms
  • 2024年华为杯中国研究生数学建模竞赛E题(高速公路应急车道紧急启用模型)思路
  • np.random.seed设完又想用随机seed怎么办
  • [数据结构]动态顺序表的实现与应用
  • Invalid Private Key, Not a valid string or uint8Array
  • 【Text2SQL】PET-SQL:在Spider基准测试中取得了SOTA
  • python-3n+1数链/233
  • vue2基础系列教程之v-model及面试高频问题
  • 【高分系列卫星简介——高分一号(GF-1)】
  • Python基于TensorFlow实现时间序列循环神经网络回归模型(LSTM时间序列回归算法)项目实战
  • springboot实战学习(6)(用户模块的登录认证)(初识令牌)(JWT)
  • 二叉树的顺序存储和基本操作实现
  • python学习-10【模块】
  • modbus调试助手/mqtt调试工具/超轻巧物联网组件/多线程实时采集/各种协议支持
  • 数值计算 --- 平方根倒数快速算法(0x5f3759df,这是什么鬼!!!)
  • 迭代器和生成器的学习笔记