历史上的今天
今天是: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中对应位的情况就可以判断中哪一个子中断源发生了中断)(个人理解,仅供参考)
上一篇:ARM历程十——毕业设计(钟表)
下一篇:ARM历程四-LCD
史海拾趣
|
不知道为什么 编译通过了 但是运行的时候却发生了错误: error:Debug Asesertion Failed Failed! f:\\sp\\vctors\\vc7libsce\\ship\\atlmfc\\src\\mfc\\filecore.cpp line 207 (207看不清楚不知道是297还是207) 相关的MFC函数: ...… 查看全部问答> |
|
现在在做一网卡项目,实现的功能是当网卡插入Windows XP系统时,显示一个USB口和一个串口,其中USB口实现上网,串口用于走AT命令等,现在在Windows端的驱动程序都已有现成的,USB也可以上网了 其中卡侧是TTPcom开发环境 &nb ...… 查看全部问答> |
|
请问用多片ADSP21161N时不可以用外部晶振作为CLKIN的输入吗?看ADSP21161N的数据手册24页这么说的,不知道是不是理解错了。想用FPGA来驱动4片ADSP21161N时钟信号,现在不知道该怎么办了。。。请高人指点,谢谢。… 查看全部问答> |




