对VICVectCntl寄存器设置的理解

来源:互联网 发布:网络社区营销优点 编辑:程序博客网 时间:2024/05/01 01:13

对VICVectCntl寄存器设置的理解

    (说明:本人用的芯片型号为LPC2220,因为在电脑上面文件名不能命名为<<对类似VICVectCntl0 = 0x20|4的理解>>,所以重命名为《对VICVectCntl寄存器设置的理解》)

    首先,明确LPC2000系列ARM的VIC模块最多可以控制32个中断请求输入;16个向量IRQ中断;16个优先级,可动态分配优先级;可产生软中断。

向量IRQ有16的通道(slot),也可以说是16个优先级,32个中断源可以选择任一个向量IRQ的通道,如果你要对一个中断源申请一个向量IRQ,那么要用到两个寄存器:VICVectCntl0-15和VICVectAddr0-15。而且VICVectCntl0-15和VICVectAddr0-15是一一配对使用的。(注:VICVectCntl最后一位是字母l不是数字1)


图1寄存器VICVectCntl0-15

从datasheet中对寄存器VICVectCntl0-15说明中可得:寄存器的0到4共五位表示中断源的中断号(见图2,仅列出8个中断号,详细见datasheet);第5位为1时,使能相应的IRQ slot(通道);31:6保留位,不用理会。

图2 中断源的中断号

    寄存器名称最后的数字(0-15)同时也代表该寄存器控制的向量IRQ中断的优先级,数值越小,优先级越高。注意:如果将同一个中断源,分配给多个使能的向量IRQ中断,那么该中断源发生中断时,会使用最高优先级(最低编号)的寄存器设置。

举例如下:假设计数器0(TIMER0)申请向量通道0。

     因为是申请向量通道0,所以VICVectCntl寄存器后面的数字就是0,即为VICVectCntl0。同时,因为计数器0(TIMER0)的中断号是4(见图2),所以VICVectCntl0的低五位(bit0~bit4)为00100。其实也就是中断源的中断号是多少,后面的数字就是多少。 然后使能该通道,即VICVectCntl0的第5位(bit5)要写1。这样用C语言表示就是:VICVectCntl0 = 0x20|4,或者写成VICVectCntl0 = (1<<5)|4,或者直接写为VICVectCntl0=0x24,或者VICVectCntl0=(VICVectCntl0&0xffffffc0)|0x24(推荐用法),或者与之等效的语句都是可以的。

    如果想改变优先级(或者说是IRQ的通道号),比如将上面提到的定时器0的优先级由0(最高级)改为15,只需要改变VICVectCntl寄存器后面的数字为15,就可以了。

其他类似。

 

引用本人程序定时器0的中断设置:

void InitTimer0(void)

{

 //   PCONP=PCONP|((uint32)1<<2);  //打开定时器0时钟源,默认打开                    

    T0TC=0;             //定时器设置为0

    T0PR=0;             //时钟不分频

    T0MCR=0x03;         //设置T0MR0匹配后复位T0TC并产生中断标志

    T0MR0=Fpclk;      //定时1s

    T0TCR=0x01;         //启动定时器

    

    VICIntSelect=0x00;

    VICVectAddr0=(uint32)IRQ_Timer0;

//    VICIntEnable=1<<0x04;               //使能定时器0中断

    VICVectCntl0=(VICVectCntl0&0xffffffc0)|0x24; // 定时器中断通道分配最高优先级(向量控制器)

    VICIntEnable = 0x00000010;                // 使能定时器中断

   

}

原创粉丝点击