ESP8266学习随笔之一——编译NodeMCU固件

  • ESP8266介绍
  • 编译NodeMCU固件
  • 网站编译
  • 下载源码
  • 修改配置
  • 开始编译
  • 刷机工具
  • 编译LFS镜像
  • 代码上传运行工具
  • 附件


ESP8266介绍

ESP8266是乐鑫设计,安可信生产的一块极便宜的WIFI模块,说是WIFI模块,是因为很多时候他被当作WIFI的发射接收模块和其他单片机配合使用,但实际上,他本身就是一块单片机,内置超低功耗 Tensilica L106 32 位 RISC 处理器,CPU 时钟速度最高可达 160 MHz,还有数量不等的IO端口(芯片是一样的,不同型号封装引出的管脚不同),所以在对IO管脚要求不是非常多的情况,直接用一块ESP8266就已经是完整的一个单片机方案。

esp8266出厂固件 esp8266最新固件_docker

esp8266出厂固件 esp8266最新固件_docker_02

说便宜,例如上面这块ESP-12F模块在网上可以用几块钱买到,加上某厂家5元包邮的电路板打样,自己焊几个电阻电容就完事,对于DIY来说实在很香。对于焊工不太好的朋友,一块山寨的开发板包括5V转3.3V电源(芯片是3.3V输入),USB刷机调试接口,也就是十几元包邮的样子。十多块钱的小东西要用WIFI,这应该是唯一的选择了。

esp8266出厂固件 esp8266最新固件_docker_03

ESP8266有自己的SDK,也支持Arduino开发,如果对程序的延迟非常敏感,就只能选择上面这些C++的开发环境,例如之前我用8266加上DWM1000做测距,就不太可能用NodeMCU。因为NodeMCU是一个Lua语言的运行环境,刷上NodeMCU固件大家可以愉快地用Lua进行编程,不用一次又一次地编译调试,几乎不会出现C/C++的什么指针,内存泄露问题,代价就是运行速度比C++开发的程序要慢一些。但对于大部分只是控制GPIO,WIFI时钟对时,或者传感器状态上报之类的应用,差1秒2秒又有什么关系呢?轻松开发才是最重要的……

NodeMCU开发有多简单?看个例子,11行代码就可以建立WIFI热点,并提供一个最简单的HTTP服务器。运行成功后,用手机或者电脑连上WIFI热点:testap,密码:12345678,然后打开浏览器即可成功访问http://192.168.4.1/

wifi.setmode(wifi.SOFTAP)
local apcfg={ssid="testap", pwd="12345678",}
wifi.ap.config(apcfg)
srv = net.createServer(net.TCP)
srv:listen(80, function(conn)
    conn:on("receive", function(sck, payload)
        print(payload)
        sck:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>")
    end)
    conn:on("sent", function(sck) sck:close() end)
end)

更多API说明参考https://nodemcu.readthedocs.io/en/master/

编译NodeMCU固件

网站编译

好了,闲话说了一堆,言归正传谈下编译NodeMCU固件和刷机的问题,NodeMCU最简单的编译办法是去https://nodemcu-build.com/,按需选择要支持的模块,点击编译,一般不用10分钟,编译好的固件链接就会发到邮箱里。

esp8266出厂固件 esp8266最新固件_固件_04

大部分情况下,没有必要自己来编译固件。但如果我们对程序运行空间要求比较高(例如需要TLS支持),内存比较紧张,还不至于要回到C++那边完全重写,这时候就要用到LFS大法(具体LFS的解释和用法以后再说),但LFS镜像就非要自己编译不可了,所以还是要弄一个编译环境。

搭建编译环境办法有好几种,用docker是最方便的,都2020年,不懂的强烈建议学一下。只要有一个可以跑docker的环境,无论Linux,Mac,Windows子系统都可以,能够在github下载代码,事情就很简单了。

下载源码

git clone --recurse-submodules https://github.com/nodemcu/nodemcu-firmware.git

修改配置

修改nodemcu-firmware/app/include/user_modules.h文件选择自己想要的模块(可以参考前面nodemcu-build网站的说明);支持LFS,修改nodemcu-firmware/app/include/user_config.h,去掉以下注释

//#define LUA_FLASH_STORE                   0x10000

如果程序不需要浮点运算,修改nodemcu-firmware/app/include/user_config.h,去掉以下的注释,固件运行效率会高一些

//#define LUA_NUMBER_INTEGRAL

开始编译

docker run --rm -ti -v `pwd`/nodemcu-firmware:/opt/nodemcu-firmware marcelstoer/nodemcu-build build

此时编译的结果在nodemcu-firmware/bin目录里,文件名类似nodemcu_integer_release_日期-xxxx.bin,这就是刷机用的固件

刷机工具

刷机工具从https://github.com/marcelstoer/nodemcu-pyflasher/releases下载

esp8266出厂固件 esp8266最新固件_lua_05

编译LFS镜像

如果要编译LFS镜像(这是我们这次折腾的主要目标),在刚才的目录下

mkdir luasrc
cp lua代码 luasrc
docker run --rm -ti -v `pwd`/nodemcu-firmware:/opt/nodemcu-firmware -v `pwd`/luasrc:/opt/lua marcelstoer/nodemcu-build lfs-image

此时编译的LFS镜像在刚才新建立的luasrc目录里

代码上传运行工具

现在可以用https://esp8266.ru/esplorer/来上传和运行Lua程序代码和LFS镜像(没看错,LFS镜像不是固件,是当做某种特殊的代码上传使用的)

附件

对于不方便上上述各种网站的朋友,这里有一份打包好的资源
链接:https://pan.baidu.com/s/1hvdAToW7VKGra2Aa69spsQ
提取码:ag60
以linux系统为例,把nodemcu-build.tgz和nodemcu-firmware.tgz放在/opt目录下,运行

cd /opt
zcat nodemcu-build.tgz|docker load 
tar xzf nodemcu-firmware.tgz

即可跳过前面提到的下载源码步骤,直接开始编译。