离上次真正写历程已经有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
推荐阅读
史海拾趣
题目二:LED点阵电子时钟屏 系统设计要求: 1)显示时间、年月日、星期、温度; 2)4位时间显示,使用四块8×8LED点阵; 3)24小时计时。 这是毕业设计,请各位帮帮忙,编程用C语言。 谢谢大家… 查看全部问答∨ |
|
我用peekmessage 写了个函数来peek mouseup消息,但不知道为什么有时候会peek不到mouseup消息呢(只有一个客户的机器有这个问题,其他客户的机器是没这个问题的) 但实际上消息队列里面是肯定有mouseup消息的,因为我不调用peekmessage 的时候,我 ...… 查看全部问答∨ |
|
一块2410的核心板,外接一双口的SRAM,请问该如何对其进行读写? 是不是先把SRAM的硬件物理地址映射成一片虚拟空间,然后再读写?具体函数是什么?最好有代码,谢谢… 查看全部问答∨ |
|
如题我要做一个全屏的输入法,想要截取手写笔的 消息(即鼠标消息), SetWindowsHookEx 不支持WH_MOUSE 请教各位有没有别的好办法获得鼠标的消息?… 查看全部问答∨ |
想让GP4做PWM输出 但是后来发觉没有反应就尝试在GP5做点亮LED的尝试看看,结果发觉全部不行,之前是可以的现在又不对了 不知道是哪里设置的不对 #include<htc.h>/////////////////////////////////////pwm program////PIC12F675////4MHZ/// ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况