在初始化向量中断控制器的时候,应该要注意把向量控制寄存器VICVectCntl0~15清零,即: /* 向量控制寄存器0~15清零 */ volatile unsigned long * VIC_CNT; VIC_CNT = (volatile unsigned long *) 0xFFFFF200; for(i=0;i<16;i++) *VIC_CNT++ = 0;
如果不清零会怎么样?呵呵,假如原来FLASH中烧了一段程序,这段程序在初始化的时候将UART0的中断配置如下: VICVectAddr0 = (uint32)IRQ_UART0; VICVectCntl0 = (0x20 | 0x06); VICIntEnable = 1 << 6;
现在要进行仿真了,先给开发板上电,于是FLASH中的程序得以运行过一次。假设要进行仿真的程序也用到了UART0的中断,可是配置如下: VICVectAddr1 = (uint32)IRQ_UART0; VICVectCntl1 = (0x20 | 0x06); VICIntEnable = 1 << 6; 那么当UART0的中断到来的时候,程序会怎么样? 程序会跑到原来FLASH程序初始化时设置的VICVectAddr0地址去运行,后果一般是数据终止或预取指终止或其它不可预料的情况。所以最好还是加上这几句吧,特别是在用BOOTLOADER加载程序的和仿真的时候,呵呵 |