ESP8266Arduino SDK上实现接近6Mbps的高速IO

TL; DR 代码见GitHub Gist: Jamesits/high-frequency-square-wave-generator-esp8266.ino

Arduino UNO上实现了高频方波发生器之后我把魔爪伸向了便宜量足的ESP8266它能不能产生符合要求的高频波形呢

初测

分析ESP8266 Arduino SDK digitalWrite() 实现后发现ESP8266IO分为两组0-15由同一组寄存器控制16号独立控制要实现对0-15IO口的控制只需要向 GPOS 1GPOC 0寄存器的相应位置写数据即可

为了获得尽可能快的结果代码省去了几乎所有非必要的功能和函数调用

测试结果

  • 80MHz5.88MHz
  • 160MHz CPU6.25MHz

看门狗问题

但是这样做还有个问题ESP8266会以每六秒钟多一点一次的频率重启如果你的ESP模块的PIN 4上焊有LED重启时LED会短暂闪亮一下研究发现ESP8266由于在软件上实现了Wi-FiTCP stack故意设计了双重watchdog软件watchdog会在各种系统函数里面被调用用来执行网络操作SDK提供了一个禁用/启用的函数硬件watchdog是强制开启的没有提供禁用方法喂狗间隔6.7s左右会在软件watchdog调用时喂由于大部分人写的代码或多或少会频繁调用一些系统函数因此不会感知到这两个watchdog的存在而现在的这份代码由于死循环且循环内不调用任何函数一开机就会触发watchdog重启

为了测试喂狗造成的时间问题我在上面的程序里加入了喂狗函数然后重新测试

测试结果

现在的确不重启了不幸的是如图所示喂狗大约需要430ns这的确是一笔不小的开销有没有办法绕过硬件watchdog

经过一番研究我发现Mongoose OSESP8266 SDK中禁用了硬件watchdog他们是怎么实现的呢其实硬件watchdog有一个开关只不过ESP8266 Arduino SDK开发者认为关掉它会影响基础功能没有实现Mongoose OSesp_hw_wdt_disable() 函数实现了关闭硬件watchdog功能那么我们把它抄过来

测试结果

结果是非常完美的

实现固定频率方波发生器

接下来我们把上一篇文章实现的高频方波发生器移植过来

测试结果

设定方波频率 实测方波频率 误差 备注
>250KHz 333.27KHz-341.82KHz 极限频率以上误差过大无法使用
250KHz 249.95KHz 0.02%
100KHz 99.98KHz 0.02%
50KHz 49.99KHz 0.02%
1000Hz 999.80Hz 0.02%
  • 得益于高速CPUESP8266在方波发生器程序上的表现远好于Arduino UNO
  • CPU频率设置到80MHz160MHz不影响测试结果
  • 250KHz处有一个间断点超过此频率即出现较大误差且脉宽设定也会失效
  • 其余测试数据上的0.02%误差应该是梦源实验室DSView软件浮点数计算导致的系统误差
  • 如果你设定的方波频率过高ESP8266可能因为固件bug而死机因为我们禁用了watchdog它无法自行重启如果用于生产环境请务必注意

参考

ESP8266Arduino SDK上实现接近6Mbps的高速IO2个想法

回复 oliver 取消回复

您的邮箱地址不会被公开 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论了解你的评论数据如何被处理