对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; // 使能定时器中断
}