ATmega32U4:启用中断挂起

时间:2016-10-24 08:58:00

标签: c microcontroller interrupt avr

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

上述程序闪烁LED。如果sei();取消注释,则不会。我还没有启用任何中断源,数据表说它们默认情况下全部关闭,而引导加载程序(Caterina)确实使用TIMER1_COMPA,它会在运行我的代码之前再将其关闭。

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

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

关闭引导加载程序[1],启用USB控制器并产生中断。

添加一个空的ISR(USB_GEN_vect)修复了挂起但产生了大幅减速的眨眼,可能是由于ISR实际上没有对导致中断的条件做任何事情,因此被重复调用。 在USBCON = 0;正常工作之前添加sei();

[1] Caterina,如上所述。引导加载程序的代码位于https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/bootloaders/caterina/

答案 1 :(得分:0)

如果LED保持亮起,则可能是看门狗定时器中断。在发生眨眼之前,你的micro会重新启动。我记得,它可能是使用熔丝位启用/禁用的。