自己动手编译NodeMCU固件

来源:互联网 发布:模拟器登不上淘宝 编辑:程序博客网 时间:2024/05/21 19:39

NodeMCU的优势还是挺明显的,相关问题可以参考知乎上的回答,NodeMCU 的主要特点和优势是什么,这里主要讲解怎样编译NodeMCU固件,就不多说这些了。

目前常用的编译NodeMCU的方式主要有两种,在线构建本地构建

在线构建

使用在线构建服务NodeMCU custom builds来定制自己的固件,只需要在该网站选择你需要的库,留下邮箱,很快就能收到编译好的固件,这里不多叙述。

本地构建

想要自己编译NodeMCU,首先需要一个Linux环境,实体机或虚拟机都可以,安装教程我想网上有很多,这里在Linux正常运行后继续。

这里给想自己动手编译NodeMCU的小白童鞋提供一个正确的编译方法,不要像我一样经历各种编译失败,惨不忍睹啊。
好了,话不多说,接下来正片开始。

第一步 - 配置编译工具链

首先安装编译相关依赖项。

sudo apt-get updateapt-get install make unrar autoconf automake libtool gcc g++ gperf flex bison \texinfo gawk ncurses-dev libexpat-dev python python-serial sed git libtool-bin screen

接下来给此次需要用到的所有工具安个家:在你看中的地方建一个目录,名字随喜好,然后定位到此目录。
这里已经有编译好的工具链被打包到github,下载、安装和配置如下:

git clone https://github.com/icamgo/xtensa-toolchain.gitcd xtensa-toolchain && ./gen.pyecho "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/bin:\$PATH" >> ~/.bashrc~/.bashrc

:这里将编译器环境变量设为了开机启动,如果不需要,可以写在一个脚本里:

git clone https://github.com/icamgo/xtensa-toolchain.gitcd xtensa-toolchain && ./gen.pytouch setpath.shecho "export PATH=$PWD/xtensa-lx106-elf/bin:$PWD/bin:\$PATH" > ./setpath.sh

我这里脚本名为setpath.sh,需注意,使用时,一定要用source setpath.sh来执行,否则无效!

之后就可以使用 xtensa-lx106-elf-gcc 编译器了。

第二步 - 配置NodeMCU固件

首先从官方下载源代码

git clone https://github.com/nodemcu/nodemcu-firmware/tree/master

打开nodemcu-firmware/app/include/目录,我们需要修改user_model.h中的宏定义来决定编译哪些模块。
如果要修改初始波特率,需要去user_config.h中修改#define BIT_RATE_DEFAULT BIT_RATE_115200,推荐将波特率设置为74880,这样每次启动模块就没有乱码了。
然后还要去user_version.h中修改编译时间。
如果选择了UCG或U8G模块,还需要去修改ucg_config.hu8g_config.h

个人推荐一组比较不错的模块选择:

ADC,BIT,COAP,CRON,CRYPTO,FILE,GPIO,HTTP,I2C,MQTT,NET,NODE,OW,PWM,RTCTIME,SJSON,SNTP,SPI,TMR,UART,WEBSOCKET,WIFI,TLS,

模块的具体功能可以参考 NodeMCU Documentation

第三步 - 编译NodeMCU固件

也不知道NodeMCU官方怎么想的,打包的并不是一个完整的工程,我们需要从ESP官方SDK里提取出缺失的文件复制到工程目录。

git clone https://github.com/espressif/ESP8266_RTOS_SDK.gitcp -r ESP8266_RTOS_SDK/extra_include/xtensa/  nodemcu-firmware/app/user/cp -r ESP8266_RTOS_SDK/extra_include/xtensa/  nodemcu-firmware/app/esp-gdbstub/

接下来开始编译。
我简化一下流程,写了一个脚本文件,直接放在工程目录运行就好。
这里我命名为mymake,也就是说以后编译不用运行make了,直接./mymake就可以了。
当然如果不是2.1.0版本的固件需要修改版本号后使用。

#! /bin/bash# mymakemake&&flag="1"if [ ! -f "./sdk/esp_iot_sdk_v2.1.0/lib/libhal.a" ]then    if [ -f "./libhal.a" ]    then        cp libhal.a ./sdk/esp_iot_sdk_v2.1.0/lib/    else        wget -c https://github.com/esp8266/esp8266-wiki/raw/master/libs/libhal.a        cp libhal.a ./sdk/esp_iot_sdk_v2.1.0/lib/    fi    echo -e "Try again\n"    make&&flag="1"fiif [ "$flag" = "1" ]then    echo -e "\nGenerate 0x00000.bin and 0x10000.bin successully in folder bin."    echo "0x00000.bin------------>0x00000"    echo "0x10000.bin------------>0x10000"fi

看看是不是没有报错?那么恭喜你,编译成功了!
编译完成后会在bin目录中生成两个.bin文件,编译结束后会有提示(当然这是我写进去的(>_<))。

第四步 - 烧录固件

两个bin文件名为各自烧录时的起始地址,具体怎么烧录,我想网上应该有许多资料的,这里就不多叙述了。
至此,一个本地编译的NodeMCU固件就成功的运行在我们的ESP8266上了。