历史上的今天
返回首页

历史上的今天

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

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

2019-11-16 来源:51hei

    离上次真正写历程已经有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中对应位的情况就可以判断中哪一个子中断源发生了中断)(个人理解,仅供参考)


推荐阅读

史海拾趣

浙江东亚电子(DongYa)公司的发展小趣事

随着公司的发展,浙江东亚电子不断拓展其产业布局。除了传统的电力电子元件、分流器等产品外,公司还涉足新能源汽车、充电桩、变频器和储能等领域。特别是在新能源汽车和充电桩领域,公司紧跟国家“新基建”发展战略,推出了一系列具有竞争力的产品,为公司带来了新的增长点。

General Industrial Controls ( GIC )公司的发展小趣事
固定输出版本包括3.3V、5V、12V,可调版本可以输出小于37V的各种电压。
Dytran Instruments Inc公司的发展小趣事

1980年,Dytran由传感器行业的资深人士尼古拉斯·D.改变(Nicholas D. Change)创立。在此之前,尼古拉斯在纽约地区的一家开创性传感器制造商担任产品线经理,积累了丰富的行业经验。他看到了传感器市场的巨大潜力,于是决定成立自己的公司,将自己的设计和创新带入这个不断增长的领域。Dytran的名字来源于“动态”和“换能器”的结合,寓意着公司专注于动态测量和转换技术的研发。

在创业初期,Dytran就展现出了其技术实力。公司专注于压电加速度计的研发和生产,凭借其卓越的性能和稳定性,迅速在市场上崭露头角。此后,Dytran不断推出新的传感器产品,如称重传感器、压力传感器和脉冲锤等,逐渐在电子行业树立了其技术领先的形象。

ENTRELECUK公司的发展小趣事

在电子行业中,绿色环保和可持续发展已成为重要的议题。ENTRELEC UK积极响应这一趋势,致力于研发和生产环保型产品。公司采用环保材料和节能技术,降低产品对环境的影响。同时,公司还积极参与环保公益活动,推动行业的可持续发展。

Amveco Toroidal Power Products公司的发展小趣事

品质是企业的生命线。Amveco公司深知这一点,因此始终将品质管理放在企业发展的首位。公司建立了严格的质量管理体系,从原材料采购到产品出厂的每一个环节都进行严格把控。同时,公司还注重品牌建设,通过广告宣传、参加行业会议等方式提升品牌知名度和美誉度。这些努力使得Amveco公司的环形变压器在市场上树立了良好的品牌形象。

DCD [Digital Core Design]公司的发展小趣事

在快速变化的市场环境中,创新成为DCD公司持续发展的关键。公司不断加大研发投入,鼓励员工提出创新性的想法和建议。同时,公司还积极引进国内外先进的技术和管理经验,为公司的发展注入了新的活力。在创新驱动下,DCD公司不断推出具有竞争力的新产品和解决方案,赢得了客户的广泛赞誉和市场的持续认可。

问答坊 | AI 解惑

电子万年历我成功调试过

http://blog.163.com/li_j920/edit/ 还的硬件电路,你们要我会给你们的。…

查看全部问答>

求助IIC总线

在网上看了IIC总线的资料但是还是不懂如何用C语言写个程序出来,看了人家的程序也不懂,请哪些高手帮助我下解释程序的含义,或者进一步讲解下思路。 我看了下资料,不知道这样可以实现IIC总线的启停吗? #include <reg51.h>#include \"intrin ...…

查看全部问答>

EVC的CString是否有问题?

程序莫名奇妙得在其一个成员函数里抛出ASSERT错。同样的运行路径进行第二次,就没问题了。…

查看全部问答>

WCE不支持CStdioFile么?

不知道为什么 编译通过了 但是运行的时候却发生了错误: error:Debug Asesertion Failed Failed! f:\\sp\\vctors\\vc7libsce\\ship\\atlmfc\\src\\mfc\\filecore.cpp line 207   (207看不清楚不知道是297还是207) 相关的MFC函数: ...…

查看全部问答>

求助!ADI平台,USB如何虚拟出一个串口?

现在在做一网卡项目,实现的功能是当网卡插入Windows XP系统时,显示一个USB口和一个串口,其中USB口实现上网,串口用于走AT命令等,现在在Windows端的驱动程序都已有现成的,USB也可以上网了     其中卡侧是TTPcom开发环境   &nb ...…

查看全部问答>

想找个师傅带一下【上海,武汉均可】

要毕业了没有工作经验,想找一个师傅教一下。毕业课题是无线点菜机,辅导我做一下。…

查看全部问答>

ARM的IO脚为什么不像51那样可以直接操作

arm是先要打开指定的IO口才可以读写,感觉不如51的方便arm的IO脚为什么不像51那样可以直接操作?这样有什么好处?…

查看全部问答>

GBT 20234-2006电动汽车传导充电用插头、插座、车辆耦合器和车辆插孔通用要求

GBT 20234-2006电动汽车传导充电用插头、插座、车辆耦合器和车辆插孔通用要求…

查看全部问答>

ADSP21161N的时钟问题

请问用多片ADSP21161N时不可以用外部晶振作为CLKIN的输入吗?看ADSP21161N的数据手册24页这么说的,不知道是不是理解错了。想用FPGA来驱动4片ADSP21161N时钟信号,现在不知道该怎么办了。。。请高人指点,谢谢。…

查看全部问答>