C ATmega32U4:启用中断挂起 #包括 #包括 无效延迟(){ 挥发性uint16_t i; 对于(i=1e6;i;i--); } 内部主(空){ DDRB=255; /*sei()*/ 而(1){ PORTB^=1; 延迟(); } }

C ATmega32U4:启用中断挂起 #包括 #包括 无效延迟(){ 挥发性uint16_t i; 对于(i=1e6;i;i--); } 内部主(空){ DDRB=255; /*sei()*/ 而(1){ PORTB^=1; 延迟(); } },c,microcontroller,interrupt,avr,C,Microcontroller,Interrupt,Avr,上述程序使LED闪烁。使用sei()未注释它不会。我还没有启用任何中断源,数据表上说默认情况下它们都是关闭的,虽然引导加载程序(Caterina)确实使用TIMER1\u COMPA,但在运行我的代码之前,它会再次将其关闭 它似乎不可能调用未定义的中断处理程序。但我很困惑,为什么它不会一直眨眼 这是怎么回事?如果指示灯一直亮着,可能是看门狗定时器中断。在闪烁发生之前,micro已重新启动。我记得,它可能使用保险丝位启用/禁用。结果是引导加载程序[1]使USB控制器处于启用状态,并产生中断 添加一

上述程序使LED闪烁。使用
sei()未注释它不会。我还没有启用任何中断源,数据表上说默认情况下它们都是关闭的,虽然引导加载程序(Caterina)确实使用TIMER1\u COMPA,但在运行我的代码之前,它会再次将其关闭

它似乎不可能调用未定义的中断处理程序。但我很困惑,为什么它不会一直眨眼


这是怎么回事?

如果指示灯一直亮着,可能是看门狗定时器中断。在闪烁发生之前,micro已重新启动。我记得,它可能使用保险丝位启用/禁用。

结果是引导加载程序[1]使USB控制器处于启用状态,并产生中断

添加一个空的
ISR(USB\u GEN\u vect)
修复了挂起问题,但导致闪烁速度大幅减慢,这可能是因为ISR实际上没有对导致中断的条件做任何处理,因此被反复调用。 添加
USBCON=0
sei()之前工作正常


[1] 如前所述,卡特琳娜。引导加载程序的代码位于

是否有调试器?要么引导加载程序将中断弄乱,要么看门狗配置为在中断模式下自动启动(请参见保险丝)。旁注:将uint16_t变量初始化为1e6似乎很有趣。@teroi因为没有(全局)非易失性变量,内存障碍不会对生成的汇编代码产生任何影响。您在此处发布的代码不是问题的原因。您需要查看(或在此处发布)引导加载程序以查看正在执行的操作…添加
MCUSR&=~(1)这是MCU和引导加载程序组合的正确答案。修复了我的问题。
#include <avr/io.h>
#include <avr/interrupt.h>

void delay() {
    volatile uint16_t i;
    for (i=1e6; i; i--);
}

int main(void) {
    DDRB = 255;
    /* sei(); */
    while (1) {
        PORTB ^= 1;
        delay();
   }
}