LPC 2103 定时器
关于lpc2103 定时器中断的问题:VICIntSelect=0x00; //所有中断通道设置为IRQ中断
VICVectCntl0=0x20|4; // 向量IRQ solt使能| 中断号
*****VICVectAddr0=(unsigned long)IRQ_Time0;//使能中断服务程序地址
VICIntEnable=1<<0x04; //使能定时器0中断
其中第三句话 IRQ_Time0怎么定义啊 VICVectAddr0=(unsigned long)IRQ_Time0;
的意思是取IRQ_Time0函数的地址给 VICVectAddr0(强制转化为ulong),这样在中断发生时,pc调转到 VICVectAddr0,然后取里面的数值给pc值,这样就跳转到了中断服务程序。具体的散转在启动代码中,lz可以好好研究一下启动代码。 回复【1楼】hzr0071
-----------------------------------------------------------------
好的,谢谢楼上啊。 还是没有懂。这是我写的,大家帮忙分析一下,谢谢了
voidTimerInit(void) //定时器初始化
{
IRQEnable(); //IRQ中断使能
T0TCR=0x02;
T0PR = 0; // 设置定时器0,不分频
T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC
T0MR0 = 11059200; // 比较值(1S定时一次)
T0TCR = 0x01; //定时器计数器和预分频计数器使能
VICIntSelect = VICIntSelect&(~(1<<4); // 所有中断通道设置为IRQ中断
VICVectCntl0 = 0x20|4 ; // 向量IRQ slot 使能 | 中断号
VICVectAddr0 = (unsigned int)IRQTimer0; // 设置中断服务程序地址
VICIntEnable = 1<<4; // 使能定时器0中断
}
然后是中断函数
__irq __arm void IRQTimer0()
{
if((IOSET&(1<<18))==0)IOSET=1<<18; //取反操作
elseIOCLR=1<<18;
T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
我单步调试,无法进入中断函数,分析一下 没人指点吗? 终于找到问题的所在了, 要先使能中断 IRQEnable();
IRQEnable();则需要设置CPSR寄存器的I位:但是CPSR 需要在特权模式下,才可以下进行,不可以直接
CPSR=0x5f; 需要在启动代码中设置。
大家分析是否这样的? 算是搞清楚了,第三句意思,是发生中断的时候,寄存器的值会被拷贝到那个地址里面,然后在根据那个地址进行跳转,
还有就是 使能中断IRQEnable(); 正如我想的那样,思路是正确的,然后可以再启动代码里面修改。
页:
[1]