C ATmega32U4:启用中断挂起 #包括 #包括 无效延迟(){ 挥发性uint16_t i; 对于(i=1e6;i;i--); } 内部主(空){ DDRB=255; /*sei()*/ 而(1){ PORTB^=1; 延迟(); } }
上述程序使LED闪烁。使用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控制器处于启用状态,并产生中断 添加一
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();
}
}