当前位置: 首页 > 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;	
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AI学习指南深度学习篇-Adam的Python实践
  • python-3n+1数链/233
  • 2024最新!!!iOS高级面试题,全!(一)
  • 关于安卓App自动化测试的一些想法
  • ZYNQ FPGA自学笔记~操作PLL
  • 【学习笔记】 使用AD24完成相同电路的自动布线布局(相同模块布局布线ROOM布线快速克隆)
  • postgres_fdw访问存储在外部 PostgreSQL 服务器中的数据
  • 音频北斗定位系统有什么用?
  • Python使用虚拟环境解决依赖冲突
  • 代码随想录算法day37 | 动态规划算法part10 |
  • STM32F407单片机编程入门(十一) ESP8266 WIFI模块实战含源码
  • C#_封装详解
  • Java反序列化利用链篇 | CC6链分析(通用版CC链)
  • windows下,用docker部署xinference,为什么老是提示localhost无法访问?
  • 记录一下,Vcenter清理/storage/archive空间
  • 「面试题」如何实现一个圣杯布局?
  • eclipse的离线汉化
  • github从入门到放弃(1)
  • Logstash 参考指南(目录)
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • ng6--错误信息小结(持续更新)
  • passportjs 源码分析
  • 分类模型——Logistics Regression
  • 给第三方使用接口的 URL 签名实现
  • 前端存储 - localStorage
  • 如何利用MongoDB打造TOP榜小程序
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • ​520就是要宠粉,你的心头书我买单
  • ​ubuntu下安装kvm虚拟机
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ###C语言程序设计-----C语言学习(3)#
  • (3) cmake编译多个cpp文件
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)二分查找 超详细
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (八)Flask之app.route装饰器函数的参数
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (转)Google的Objective-C编码规范
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)setTimeout 和 setInterval 的区别
  • .NET 8 跨平台高性能边缘采集网关
  • .NET Micro Framework初体验
  • .net 获取某一天 在当月是 第几周 函数
  • .Net 执行Linux下多行shell命令方法
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .Net8 Blazor 尝鲜
  • .net连接oracle数据库
  • .NET是什么
  • .NET未来路在何方?
  • .Net中间语言BeforeFieldInit