ESP8266 Timer1 与 Neopixels WS2812 库冲突

Posted

技术标签:

【中文标题】ESP8266 Timer1 与 Neopixels WS2812 库冲突【英文标题】:ESP8266 Timer1 conflicts with Neopixels WS2812 library 【发布时间】:2018-03-10 11:29:33 【问题描述】:

我想添加一个 Timer1 ISR 以每 0.25 秒触发一次,并使用 WS2812 240 带状 LED 做一些轻微的运动。

在 Arduino Nano 上运行良好,因为它有一个

  cli(); 
  TCCR1A = 0;   // pas de PWM ou OCR
  TCCR1B = (0<<WGM13) | (1<<WGM12) | 4; // Clear Timer on Compare match (CTC) mode, OCR1A= PRD
                                                                                // CS12 CS11 CS10 = 0b100 = 4 =>256 prescaler
  OCR1A = 15625; // 62.5 ns * 15625 * 256 prescaler = 0.250 s
  // pas de compteur logiciel
  TIMSK1 = 1<<OCIE1A; // ISR on Output Compare1 (TCNT1==OCR1)
    TIFR1 = 0;  // clear T1 IF
  TCNT1 = 0; // RAZ T1
  sei(); 

现在我搬到 ESP8266,在我的项目中也使用 Wifi,没有 OCR,所以我尝试使用 Timer1 ISR(Timer0 用于 Wifi)。

单独使用:

//setup
timer1_attachInterrupt(myTimer1_ISR);
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
timer1_write(300000); //120000 us/2
...

void ICACHE_RAM_ATTR myTimer1_ISR()
 
//.....
timer1_write(300000);//12us/2

但是对于 NeoPixels 库,它会给我带来冲突:

错误:void myTimer1_ISR() 导致节类型与静态冲突 volatile void NeoEsp8266DmaMethodBase::i2s_slc_isr() [with T_SPEED = NeoEsp8266DmaSpeed400Kbps]

void ICACHE_RAM_ATTR myTimer1_ISR()

在包含的文件中 ...Arduino\库\NeoPixelBus_by_Makuna\src/NeoPixelBus.h:67:0,

我相信,NeoPixel 代码也使用 Timer1? 我该如何管理? 谢谢

【问题讨论】:

【参考方案1】:

ESP8266 有一个 Ticker 类,可以满足您的目的。

如果您尝试在回调中运行需要太长时间的东西,我有一个怪癖,在这种情况下,推荐的使用方法是设置一个标志,然后检查循环中的标志,执行您的操作并重置国旗。如果你有什么短的,你可以直接在回调中做。

这是一个例子。

#include <Ticker.h>

bool doEveryOneMsStuffNow = false; // start with flag false
Ticker everyOneMs;

void setup() 
  // ... 
 everyOneMs.attach(0.001, []()  doEveryOneMsStuffNow = true; );  // lambda call back - this one just sets the flag to true
  // ...


void loop() 
  // ...
  if (doEveryOneMsStuffNow) 
    doEveryOneMsStuffNow = false;  // reset the flag
    // do what needs to be done every 1 ms
  
  // ...

【讨论】:

以上是关于ESP8266 Timer1 与 Neopixels WS2812 库冲突的主要内容,如果未能解决你的问题,请参考以下文章

Neopixel 示例代码在使用更多像素时崩溃

如何通过 html 网站控制我的 neopixel Arduino 灯

Arduino开发ESP8266——安装与配置ESP8266开发板

ESP8266-003 esp8266环境搭建与编译

Arduino框架下ESP8266与ESP8266之间SPI主从收发通讯示例

ESP8266与ESP8285开发时有什么区别