查看: 2447|回复: 0
打印 上一主题 下一主题

LPC VIC中断设置步骤

[复制链接]
跳转到指定楼层
沙发
发表于 2016-6-17 16:03:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有不对之处望大家指出。

在主程序中:
1、设置VICIntSelect
    通过VICIntSelect中断选择寄存器将32个中断请求分配为FIQ或IRQ,相应位为1是FIQ,为0是IRQ。
例如:VICIntSelect = 0x00000000,设置所有中断都是IRQ

2、设置VICVectCntlx(仅对于IRQ,FIQ不需要此设置)
    通过VICVectCntlx(x=0,1,…,15)来选择32个中断请求中的某个为向量IRQ并设定此中断请求为IRQ slotx(x对应于VICVectCntlx中的x)。若某个中断源被设定为IRQ,但却未通过VICVectCntlx使能,则该中断源将被默认为非向量IRQ。
例如:VICVectCntl0 = 0x20 | 15,设置EINT1为向量中断,使用Slot0。其中0x20是因为VICVectCntlx寄存器第六位是使能,15是通过查周立功那本书P208页的表得到的EINT1的VIC通道号。

3、设置VICVectAddrx(仅对于IRQ,FIQ不需要此设置)
当有IRQ中断产生时,VIC将会根据中断源设置VICVectAddr寄存器为相应中断服务程序的地址,切换处理器工作模式为IRQ模式,并跳转到IRQ中断入口0x00000018处;
异常中断向量表中0x00000018处使用“LDR PC, [PC, #-0xFF0]”,使得程序跳转到(0x00000018+8-0x00000FF0=0xFFFFF030)存储器处保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是说:通过该指令,程序跳转到VICVectAddr寄存器所指向的中断服务程序的地址。
例如:VICVectAddr0 = (uint32)EINT1_Exception,设置EINT1中断地址。EINT1一般是中断服务程序函数名即服务中断服务程序的首地址,前面要用(uint32)强制类型转换。

4、设置VICDefVectAddr(当都设置为向量IRQ时可以没有这个)
若是非向量IRQ中断,VIC提供默认服务程序地址VICDefVectAddr,IRQ中断入口程序可通过读取VIC的向量地址寄存器VICVectAddr来取得该地址,然后跳转到相应服务程序继续执行。该默认服务程序由所有非向量IRQ公用,默认服务程序可读取IRQ状态寄存器以确定哪个IRQ被激活。
例如:VICDefVectAddr = (uint32)Default_Entry,设置非向量中断地址。如果在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中没有设置某一个中断EINTx则此EINTx中断发生时,要进入非向量中断处理程序Default_Entry。

5、设置VICIntEnable使能
例如:VICIntEnable = 0x00018000,使能EINT1和EINT2。因为EINT1和EINT2的VIC通道号分别为15和16,所以15和16两位置一将EINT1和EINT2使能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表