#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位没有清除).
状态。
否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).
#2
为什么我加了以后编译就不通过?
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.
(我已经向你提供了例子了 - 在另一个贴子)
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.
(我已经向你提供了例子了 - 在另一个贴子)
#3
请问你用的是什么开发环境,我虽然能够编译通过_irq,但是一次中断也不响应。帮忙呀。
#1
你的Timer必须是一个ISR,也就是要加_irq. 加了它在返回才能正确地恢复处理器的
状态。
否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).
状态。
否则生成的代码会是普通的子程序调用/返回代码,处理将不会从IRQ恢复到USR模式,
后面的中断将不会响应(I位没有清除).
#2
为什么我加了以后编译就不通过?
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.
(我已经向你提供了例子了 - 在另一个贴子)
------
可能你用的是gnu, 那就不支持这个东西, 这时你要自己写汇编码来解决它.
(我已经向你提供了例子了 - 在另一个贴子)
#3
请问你用的是什么开发环境,我虽然能够编译通过_irq,但是一次中断也不响应。帮忙呀。