LPC的IRQ中断问题

时间:2021-05-08 04:16:25
#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,波特率9600 U0DLM=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,这个是干什么用的?为什么我加了以后编译就不通过?不加会有什么问题吗?

3 个解决方案

#1


你的Timer必须是一个ISR,也就是要加_irq. 加了它在返回才能正确地恢复处理器的
状态。

否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).

#2


为什么我加了以后编译就不通过?
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.

(我已经向你提供了例子了 - 在另一个贴子)

#3


请问你用的是什么开发环境,我虽然能够编译通过_irq,但是一次中断也不响应。帮忙呀。

#1


你的Timer必须是一个ISR,也就是要加_irq. 加了它在返回才能正确地恢复处理器的
状态。

否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).

#2


为什么我加了以后编译就不通过?
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.

(我已经向你提供了例子了 - 在另一个贴子)

#3


请问你用的是什么开发环境,我虽然能够编译通过_irq,但是一次中断也不响应。帮忙呀。