ESP8266(ESP12F)中断报错 - ISR not in IRAM解决

Posted GenCoder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ESP8266(ESP12F)中断报错 - ISR not in IRAM解决相关的知识,希望对你有一定的参考价值。

ESP8266可以在Arduino IDE平台上编写中断,当使用外部中断并且成功编译烧写后,ESP8266出现不断重启并且串口一直重复打印堆栈信息如下:

ISR not in IRAM!

User exception (panic/abort/assert)
--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Abort called

>>>stack>>>

ctx: cont
sp: 3fffff00 end: 3fffffc0 offset: 0000
3fffff00:  feefeffe feefeffe feefeffe 3ffef58c  
3fffff10:  000000fe 00000000 00000000 00000000  
3fffff20:  00000000 00000000 00000000 00ff0000  
3fffff30:  5ffffe00 5ffffe00 3ffe87fa 3ffee754  
3fffff40:  00000000 00000002 00000002 40202bda  
3fffff50:  401006f9 3ffe87f9 3ffee6ec 40202bec  
3fffff60:  40201f78 3ffe87f9 00000002 402037ed  
3fffff70:  3fffdad0 00000020 3ffee6ec 402021ec  
3fffff80:  3fffdad0 00000000 3ffee6ec 4020388c  
3fffff90:  3fffdad0 00000000 3ffee6ec 402010a4  
3fffffa0:  feefeffe 00000000 3ffee740 40202768  
3fffffb0:  feefeffe feefeffe 3ffe85e0 40100fb5  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

解决方法参考 ESP8266 Arduino Core 开发说明,在 attachInterrupt 调用的中断函数定义前面添加 IRAM_ATTR 属性

demo代码如下

/**
 * 功能描述:ESP8266中断演示
 */ 
void setup() 
 //设置串口波特率
 Serial.begin(115200);
 //设置中断号、响应函数、触发方式
 attachInterrupt(digitalPinToInterrupt(D2), InterruptFunc, RISING);

 
void loop() 


/**
 * 中断响应函数
 */ 
IRAM_ATTR void InterruptFunc()
 Serial.println("Hello ESP8266");


在中断函数前添加属性后,中断可以正常运行

以上是关于ESP8266(ESP12F)中断报错 - ISR not in IRAM解决的主要内容,如果未能解决你的问题,请参考以下文章

ESP8266 12F 怎么烧写自己编译的固件

ESP8266(ESP12F)学习笔记2 -- NTP网络时间获取

ESP8266 中断(Interrupts)和计时器(Timers)功能介绍

ESP8266 IO口中断触发程序

MicroPython ESP32/8266定时器中断示例解析

ESP8266中断和定时器使用