LPC的IRQ中断问题
#include <lpc213x.h>
#include <stdlib.h>
#define Fosc 11059200
#define Fcclk Fosc*6
#define Fpclk Fcclk/4
#define Baud 9600
unsigned char i;
unsigned char flash;
void Timer1(void)
{
T1TC=0x00;
if(flash)
{
IO0CLR=0xFFFFFFFF;
flash=0;
}
else
{
IO0SET=i;
flash=1;
}
T1IR=0x01;//复位中断标志
VICVectAddr = 0;
}
main()
{
char *a= "按下一个键:\n ";
////////////////////////设定频率 /////////
PLLCFG=0x25;//CCLK=6*FOSC,P=2,M=5
PLLCON=0x03;//PLL使能和连接
VPBDIV=0x00;//PCLK=CCLK/4
////////////////////////引脚功能设置//////////
PINSEL0=0x05;//P0.0,P0.1为串口
PINSEL1=0x00;//其它都设为IO
IO0DIR=0xFFFFFFFF;//设GPIO为输出
////////////////////////设置串口//////////
U0LCR=0x83;//开始设置波特率
U0DLL=Fpclk/16/Baud;//PCLK/16/9600,=0x6C,波特率9600U0DLM=0
U0LCR=0x03; //8个数据位一个停止位无校验
U0IER=0x00;//关中断,用的是查询方式
////////////////////////定时器设置///////////
T1TC=0;//定时器1设为0
T1PR=0x99;//分频系数为100
T1MCR=0x03;//与MR0匹配时中断且计数器清0
T1MR0=Fpclk/600;//1/6秒中断一次
VICIntSelect=0x00;//全部设为IRQ中断
VICVectCntl0=0x25;//IRQ中断使能并使优先级最高
VICVectAddr0=(unsigned int)Timer1;//设置指向的中断处理函数
VICIntEnable=1 < <5;//定时器1的中断连接到VIC
//////////////////////////流程///////////////////
IO0CLR=0xFFFFFFFF;//IO全部清0
for(i=0;i <12;i++) //提示按一个键
{
while(!(U0LSR & 0x40));
U0THR = a[i];
}
T1TCR=0x01;//开启定时器1
do
{
while(!(U0LSR&0x01));
IO0CLR=0xFFFFFFFF;
i=U0RBR;
flash=1;
IO0SET=i < <8;
while(!(U0LSR & 0x40));
U0THR= '\b ';
while(!(U0LSR & 0x40));
U0THR=i;
}
while(i!= '\r ');
a= "\n程序结束 ";
for(i=0;i <9;i++) //提示按一个键
{
while(!(U0LSR & 0x40));
U0THR = a[i];
}
while(1);
}
为什么我的定时器只有第一次是跳入中断函数的,然后就只计数不中断了?
或者是一直在中断函数里没有出来?但是我再按一个键它还是有反应的啊
另外,中断函数我没加_irq,这个是干什么用的?为什么我加了以后编译就不通过?不加会有什么问题吗?
[解决办法]
你的Timer必须是一个ISR,也就是要加_irq. 加了它在返回才能正确地恢复处理器的
状态。
否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).
[解决办法]
为什么我加了以后编译就不通过?
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.
(我已经向你提供了例子了 - 在另一个贴子)