ARM7中断向量控制器,学习体会

来源:互联网 发布:comicstudio mac 编辑:程序博客网 时间:2024/06/04 19:09
ARM内核只有FIQ和IRQ两个中断线,如果要扩展中断,就须要用到中断向量控制器。
快速中断和IRQ中断使能,通过CPSR中的I标志位和F标志位设置1来使能中断。

中断寄存器的使用:

中断寄存器包括中断选择寄存器VICIntSelect 中断使能寄存器VICIntEnable 中断禁能寄存器VICIntEnClr。

中断选择寄存器共32位,分别对应32通道对应的中断(通道0 WDT 通道4 Timer0)的选择 0时为IRQ 1时FIQ。
中断使能寄存器,32位,写入1为使能,写入0无效。
 例如使能Timer0中断 VICIntEnable=1<<Timer0_Num 因为写入0无效。
中断使能清零寄存器,写入1,禁止中断。
向量地址寄存器(VICCectAddr ),但发生IRQ后,CPU读取该寄存器并跳转到对应的地址,但是不能直接赋值,而是通过VIC
DefVectAddr或者VICVectAddr0~15中复制来的。
VICDefVectAddr用于分配非向量IRQ中断的地址。
向量地址寄存器0~15分别对应16个向量IRQ通道的响应地址。

向量控制寄存器0~15(VICVectCnt0~15)


重要知识点:中断通道号和IRQ通道的不同点

中断通道号(32个),例如Timer0等和向量IRQ通道0~15是不同的,通过VICVectCnt的设置0~4位,来分配IRQ中断通道,并设置其优先级。
例如分配中断通道号为4的定时器,分配IRQ0通道0.
VICIntSelect = 0x00;
VICVectCnt0=0x20|Timer0_Num;(4)
VICVectAddr0=(int)Timer0_ISR;
T0IR = 0x01;
VICIntEnable = (1<<Timer0_Num);


中断处理完成以后
void _irq Timer0_ISR(void)
{
   {中断处理}
    T0IR = 0x01;   //清除中断标志(因该是状态寄存器)
    VICVectAddr = 0x00;//清楚地址,因为下次要重新复制
 




}


外部中断寄存器。