jiabinjingyu 发表于 2019-12-11 17:50

怎么在定时器中断程序中把中断关上

如题,我需要在打开定时器5S后进入中断函数:
void interrupt LEDINT() //中断响应函数大致是150000000为5秒左右 datasheet 30MHZ
{

    //CSR&= 0xfffe;                // 关中断 GIE=0

    asm(" NOP 1 ");
    ICR = 0xFFF0;
    ISR=0x0;
    printf("\nok");
    TIMER0_INTCLSTAT=0x3;   // 清除定时器中断标志
    asm(" NOP 1 ");
    PWM_1_stop();
    PWM_2_stop();
    PWM_3_stop();
    PWM_4_stop();
    PWM_5_stop();
    CSR&= 0xfffe;

}
但是我在最后加上一句关闭全局中断,还是会不断地进入终端函数,确定别的地方并没有再次打开,请问怎么办???

zhangmangui 发表于 2019-12-11 22:11

一进入中断
CSR&= 0xfffe;               
asm(" NOP 2 ");
这样应该就关掉了
放到最后是不是你的中断没执行到最后就有再次触发了?

zuoanhuafeng 发表于 2019-12-12 15:17

我看到28035芯片手册,默认在中断服务程序开始把中断关掉,执行完再打开。你用的什么芯片?

中断函数中,不要用printf("\nok");

zhangmangui 发表于 2019-12-12 22:14

哦 对   在中断中不要用printf

jiabinjingyu 发表于 2019-12-14 13:55

我是这么解决的,直接把定时器 的中断直接停了
TIMER0_INTCLSTAT=0x2;
下次用再打开
TIMER0_INTCLSTAT=0x3;
暂时先这么用着,谢谢诸位了

jiabinjingyu 发表于 2019-12-14 14:02

zuoanhuafeng 发表于 2019-12-12 15:17
我看到28035芯片手册,默认在中断服务程序开始把中断关掉,执行完再打开。你用的什么芯片?

中断函数中, ...

我用的6747的芯片,printf是暂时测试,使用的时候不会用

jiabinjingyu 发表于 2019-12-14 14:03

还收到回复:进入中断子程序后GIE会自动关闭,退出中断子程序时又会restore CSR,所以即使您在中断子程序里disable了GIE,最后退出子程序时又会restore CSR把GIE使能上。如果要不进入中断函数,那就要把IER寄存器disable掉。
页: [1]
查看完整版本: 怎么在定时器中断程序中把中断关上