历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | ARM历程九-ARM中断

发布者:创意火舞 来源: 51hei关键字:ARM  中断 手机看文章 扫描二维码
随时随地手机看文章

    离上次真正写历程已经有10天的时间了。国庆嘛,自己给自己放了几天假——耍耍游戏下下棋什么的。


    其实这次写触屏的驱动和对ARM中中断的过程的了解也花了不少时间和脑力。

我就简单分享一下CPU执行某个中断的条件吧,也是我自己的理解,如果有错还请大家指正(以IRQ中断为例吧):

    

  在程序状态寄存器中(CPSR寄存器)i 位为IRQ中断禁止位,若这一位置1那么所有的IRQ中断都不会被CPU响应,如果这一位被清0,CPU也不一定会响应某一个或某些中断(就像是一个总开关)。所以,要想让CPU执行IRQ中断,CPRS中的i位必须要清0!


  在2440的CPU中还有两个中断屏蔽寄存器:INTMSK(中断屏蔽寄存器)和INTSUBMSK(子中断屏蔽寄存器)。如果相应的屏蔽位置1,寄存器指出某个中断无效。如果INTMSK 的一个中断屏蔽位是0,中断将被正常的服务。


    2440一共有60个中断源,某些中断源又有N个子中断,如:INT_UART0中断,它下面就还有INT_RXD0,INT_TXD0,INT_ERR0三个了中断源。要让CPU执行INT_RXD0的中断服务就要让INTMSK和INTSUBMSK中对应位清0!



    有这么多的中断源,那么CPU中怎么知道那个中断源发生中断了呢?原来在主函数中有这么一句:pISR_ADC = (int)AdcTsAuto; AdcTsAuto是中断服务函数的函数名!pISR_ADC在2440addr.h中定义了的(看最后一行):

#define pISR_EINT0        (*(unsigned *)(_ISR_STARTADDRESS+0x20))

#define pISR_EINT1        (*(unsigned *)(_ISR_STARTADDRESS+0x24))

#define pISR_EINT2        (*(unsigned *)(_ISR_STARTADDRESS+0x28))

#define pISR_EINT3        (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

#define pISR_EINT4_7    (*(unsigned *)(_ISR_STARTADDRESS+0x30))

#define pISR_EINT8_23    (*(unsigned *)(_ISR_STARTADDRESS+0x34))

#define pISR_CAM        (*(unsigned *)(_ISR_STARTADDRESS+0x38))        // Added for 2440.

#define pISR_BAT_FLT    (*(unsigned *)(_ISR_STARTADDRESS+0x3c))

#define pISR_TICK        (*(unsigned *)(_ISR_STARTADDRESS+0x40))

#define pISR_WDT_AC97        (*(unsigned *)(_ISR_STARTADDRESS+0x44))//Changed to pISR_WDT_AC97 for 2440A 

#define pISR_TIMER0         (*(unsigned *)(_ISR_STARTADDRESS+0x48))

#define pISR_TIMER1         (*(unsigned *)(_ISR_STARTADDRESS+0x4c))

#define pISR_TIMER2        (*(unsigned *)(_ISR_STARTADDRESS+0x50))

#define pISR_TIMER3        (*(unsigned *)(_ISR_STARTADDRESS+0x54))

#define pISR_TIMER4        (*(unsigned *)(_ISR_STARTADDRESS+0x58))

#define pISR_UART2        (*(unsigned *)(_ISR_STARTADDRESS+0x5c))

#define pISR_LCD        (*(unsigned *)(_ISR_STARTADDRESS+0x60))

#define pISR_DMA0        (*(unsigned *)(_ISR_STARTADDRESS+0x64))

#define pISR_DMA1        (*(unsigned *)(_ISR_STARTADDRESS+0x68))

#define pISR_DMA2        (*(unsigned *)(_ISR_STARTADDRESS+0x6c))

#define pISR_DMA3        (*(unsigned *)(_ISR_STARTADDRESS+0x70))

#define pISR_SDI        (*(unsigned *)(_ISR_STARTADDRESS+0x74))

#define pISR_SPI0        (*(unsigned *)(_ISR_STARTADDRESS+0x78))

#define pISR_UART1        (*(unsigned *)(_ISR_STARTADDRESS+0x7c))

#define pISR_NFCON        (*(unsigned *)(_ISR_STARTADDRESS+0x80))        // Added for 2440.

#define pISR_USBD        (*(unsigned *)(_ISR_STARTADDRESS+0x84))

#define pISR_USBH        (*(unsigned *)(_ISR_STARTADDRESS+0x88))

#define pISR_IIC        (*(unsigned *)(_ISR_STARTADDRESS+0x8c))

#define pISR_UART0        (*(unsigned *)(_ISR_STARTADDRESS+0x90))

#define pISR_SPI1        (*(unsigned *)(_ISR_STARTADDRESS+0x94))

#define pISR_RTC        (*(unsigned *)(_ISR_STARTADDRESS+0x98))

#define pISR_ADC        (*(unsigned *)(_ISR_STARTADDRESS+0x9c))



当程序发生中断的时候,程序指针就会跳转到相应的地址执行程序,此地址中再存放一条跳转到中断服务程序的指令。(如果在中断服务程序里面查询SUBSRCPND中对应位的情况就可以判断中哪一个子中断源发生了中断)(个人理解,仅供参考)


关键字:ARM  中断 引用地址:ARM历程九-ARM中断

上一篇:ARM历程十——毕业设计(钟表)
下一篇:ARM历程四-LCD

推荐阅读

据外媒报道,当地时间11月12日,宾夕法尼亚州立大学(Penn State)在《Nature Energy》杂志上发表的研究结果表明,更持久、充电速度更快以及更安全的锂金属电池是有可能实现的。该项研究由美国能源部(the U.S Department of Energy)提供资助,研究人员研发出一种三维交连聚合物海绵,可附着在电池阳极的金属镀层上。宾夕法尼亚州立大学机械工程教...
前言: 今天我们来学习看门狗的配置与函数,看门狗可以有效解决程序的跑飞,在使用过程中比较常见,是防止芯片故障的有效外设,我们一起来学习下HAL库 STM32CubeMX的独立看门狗,靠窗看门狗的使用。本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用所用工具:1、芯片: STM32F407ZET62、STM32CubeMx软件3、IDE: ...
NAND闪存诞生这么多年,它的发展一直没有停下来,基本上都是追求跟高的存储密度,所以从最初的SLC一直发展到现在的QLC,虽然存储密度大幅度提升,但论性能的话还最初的SLC更快。在2020年闪存峰会上,NEO半导体首席执行官兼创始人Andy Hsu介绍了他们公司的新X-NAND闪存架构,新的架构有望把SLC的速度与QLC的高密度与低价结合在一起。消息来自tomshardware...
上个月,谷歌正式发布了 Pixel 6 和 Pixel 6 Pro 手机,许多用户近期反映,在多个 Pixel 设备(包括 Pixel 6)上,他们的手机会无缘无故地给人拨打电话。据 Pixel 社区管理员的最新回应,谷歌已经修复了这个 Bug,用户需要将 Google App 升级到最新版本(12.43.18 或更高版本),可以通过 Play Store 进行更新。  IT之家了解到,用...

史海拾趣

问答坊 | AI 解惑

数字电视知识

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 上次传TV知识的时候有朋友问有没有数字方面的东西,现在我整理了一些东西传上来共享一下! 希望其他朋友也来共享这个方面的知识! …

查看全部问答∨

LM567cn

本帖最后由 paulhyde 于 2014-9-15 09:28 编辑 LM567cn  …

查看全部问答∨

LED点阵电子时钟屏

题目二:LED点阵电子时钟屏 系统设计要求: 1)显示时间、年月日、星期、温度; 2)4位时间显示,使用四块8×8LED点阵; 3)24小时计时。 这是毕业设计,请各位帮帮忙,编程用C语言。 谢谢大家…

查看全部问答∨

运算放大器讨论专帖

你是否在设计运算放大器时有遇到过什么问题,或者是在解决问题的过程当中有了哪些经验?让我们都来讨论总结一下,集百家之长! 运算放大器在电路中发挥重要的作用,其应用已经延伸到汽车电子、通信、消费等各个领域,并将在支持未来技术方面扮演 ...…

查看全部问答∨

peekmessage的问题

我用peekmessage 写了个函数来peek mouseup消息,但不知道为什么有时候会peek不到mouseup消息呢(只有一个客户的机器有这个问题,其他客户的机器是没这个问题的) 但实际上消息队列里面是肯定有mouseup消息的,因为我不调用peekmessage 的时候,我 ...…

查看全部问答∨

wince6 core授权可以使用哪些系统组件??

详细说明,我没找到这个资料,有人有吗??…

查看全部问答∨

有朋友知道如何读写外部存储器吗?

一块2410的核心板,外接一双口的SRAM,请问该如何对其进行读写? 是不是先把SRAM的硬件物理地址映射成一片虚拟空间,然后再读写?具体函数是什么?最好有代码,谢谢…

查看全部问答∨

wince5.0下如何截取鼠标消息

如题我要做一个全屏的输入法,想要截取手写笔的 消息(即鼠标消息), SetWindowsHookEx 不支持WH_MOUSE 请教各位有没有别的好办法获得鼠标的消息?…

查看全部问答∨

求助PIC12F675的初始化

想让GP4做PWM输出 但是后来发觉没有反应就尝试在GP5做点亮LED的尝试看看,结果发觉全部不行,之前是可以的现在又不对了 不知道是哪里设置的不对 #include<htc.h>/////////////////////////////////////pwm program////PIC12F675////4MHZ/// ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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