2779|3

81

帖子

0

资源

一粒金砂(初级)

LPC的IRQ中断问题 [复制链接]

#include       
#include          


#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;
        }
        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;
        }
        while(1);

}

为什么我的定时器只有第一次是跳入中断函数的,然后就只计数不中断了?
或者是一直在中断函数里没有出来?但是我再按一个键它还是有反应的啊

另外,中断函数我没加_irq,这个是干什么用的?为什么我加了以后编译就不通过?不加会有什么问题吗?

回复

76

帖子

0

资源

一粒金砂(初级)

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

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

回复

58

帖子

0

资源

一粒金砂(初级)

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

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

回复

67

帖子

0

资源

一粒金砂(初级)

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

回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表