起因

最近在想重新处理一下ESP8266下的Homekit使用,开始只记得使用的是ESP-OPEN-SDK,所以就重新找之前完成过的工具来使用,谁知一直不成功,全新安装各种编译错误,后来就重新找了以前编译好的环境来试,果然就可以了!后来经历好几次设置后总算能编译烧录运行!技术还需经常复习!

问题说明

1、编译时报错找不到各种文件

那是因为环境没有搭建成功!环境搭建成功后一般都是能够编译成功。

2、esptool相关报错

如果使用的是python3以上版本,但使用open-sdk下的xtensa-lx106-elf内esptool工具匹配的python2,会报错,解决办法是将esptool改成高版本,或者将python改成2版本,最终为了兼容ESP32等IDF功能,就直接将环境改成ESP32的esptool,也就是升级了esptool

因为python2的print函数能直接打印,而在python3后就需要加括号

3、esptool下载程序

1
esptool.py -p /dev/ttyUSB0 -b 115200 write_flash -fs 1MB -fm dout -ff 40m 0x0 firmware.bak/rboot.bin 0x1000 firmware.bak/blank_config.bin 0x2000 firmware/switch.bin

后续只下载主要程序即可

1
esptool.py write_flash 0x2000 firmware/switch.bin

串口查看软件命令

1
screen /dev/ttyUSB0 115200

ESP-01模块(Flash容量为1M,4Mbit) ESP-12系列(Flash容量为8M,32Mbit)
如果是Nodemcu,则注意SPI选择DIO模式,而非QIO

SPI Mode一般选择QIO,但是nodemcu需要选择DIO。
因为固件都比较大,COM口的波特率可以选择高些,如921600之类的,提高效率。

下载后,将GPIO0和GPIO15拉高或悬空,重新上电即可进入到新固件。

固件下载工具有很多,有nodemcu提供的flasher,也有pytools,不过使用乐鑫官方的FLASH_DOWNLOAD_TOOLS感觉是比较好用的。

可以在乐鑫官方网站找到它,当前的最新版本是flash_download_tools_v3.4.8.zip

1、 UART串口转接
Nodemcu自带usb转串口的芯片(CP2102),可以直接PC。
安信可模组如ESP01,ESP12E/F等等,需要TTL转USB的转接板才能下载固件。
可以选择一般CP2102,CH340或者是FT232芯片的转接板都可以。

如果ESP8266芯片模组,接法都是一样的,包括乐鑫自己的ESP-WROOM-02模组。

1
2
3
4
5
TX(esp8266)  -----  RX(usb转接板)
RX(esp8266) ----- TX(usb转接板)
GND(esp8266)----- GND(usb转接板) 共地
VCC(esp8266) ----- 外接3.3V,不可用usb自带的3.3V
CH_PD(esp8266A) ----- 3.3V (高电平有效)

如果正常连接,PC中即可看到虚拟出的串口,通过各种串口工具访问原有的固件。

2、固件下载模式的接线
固件下载时,在以上接线的基础上,将GPIO0和GPIO15拉低。
NodeMCU因为具有自动下载功能,通过USB即可完成拉低重启等工作,无需另外接线。

1
2
3
4
5
6
7
8
GPIO0(esp8266)  -----  GND(下拉为UART下载模式,上拉为工作模式)
GPIO15(esp8266)----- GND

TX(esp8266) ----- RX(usb转接板)
RX(esp8266) ----- TX(usb转接板)
GND(esp8266)----- GND(usb转接板) 需要和ESP8266共地
VCC(esp8266) ----- 外接3.3V,不可用usb自带的3.3V
CH_PD(esp8266A) ----- 3.3V (高电平有效)

接线后,模组重新上电后,即进入下载模式。

ESP8266_RTOS_SDK与esp-open-sdk的区别

ESP8266_RTOS_SDK与esp-open-sdk是针对ESP8266芯片的两个开发工具包,它们有以下区别:

  1. ESP8266_RTOS_SDK是一个基于FreeRTOS的软件开发框架,用于开发ESP8266芯片的应用程序。它提供了丰富的API和组件,包括WiFi、TCP/IP、文件系统、多线程等,使开发者可以方便地构建功能强大的应用程序。
  2. esp-open-sdk是一个开源的ESP8266开发工具链,用于编译和调试ESP8266的固件。它包含了编译器、调试器、库文件等工具,可以帮助开发者进行底层的系统级开发和调试。

具体区别如下:

  • 功能不同:ESP8266_RTOS_SDK主要提供了丰富的应用程序开发框架,而esp-open-sdk则提供了编译和调试ESP8266固件的工具链。
  • 使用方式不同:ESP8266_RTOS_SDK需要在其提供的开发环境中进行开发,使用其提供的API和组件进行应用程序开发。而esp-open-sdk可以与其他开发环境(如Arduino IDE)结合使用,通过命令行进行编译和调试。
  • 技术层次不同:ESP8266_RTOS_SDK更加高级和抽象,提供了更多的应用程序开发接口和功能。而esp-open-sdk更加底层,主要用于系统级开发和调试。
  • 社区支持不同:ESP8266_RTOS_SDK有一个活跃的开发者社区,提供了丰富的文档和示例代码,可以帮助开发者解决问题。而esp-open-sdk的社区相对较小,文档和示例代码相对较少。

类型说明

一、SDK类型
ESP8266 SDK的基础平台按照是否基于操作系统可分为:
non-OS 和 RTOS 两种版本。
Non-OS SDK 是不基于操作系统的 SDK,提供 IOT_Demo 和 AT 的编译。
Non-OS SDK 主要使用定时器和回调函数的方式实现各个功能事件的嵌套,达到特定条件下触发特定功能函数的目的。Non-OS SDK 使用 espconn 接口实现网络操作,用户需要按照 espconn 接口的使用规则进行软件开发。

2)RTOS SDK 基于 FreeRTOS,在 Github 上开源。
• RTOS 版本 SDK 使用 FreeRTOS 系统,引⼊ OS 多任务处理的机制,用户可以使用
FreeRTOS 的标准接口实现资源管理、循环操作、任务内延时、任务间信息传递和
同步等⾯向任务流程的设计方式。具体接口使用方法参考 FreeRTOS 官方网站。

• RTOS 版本 SDK 的网络操作接口是标准 lwIP API,同时提供了 BSD Socket API 接
口的封装实现,用户可以直接按照 Socket API 的使用方式来开发软件应用,也可以
直接编译运行其他平台的标准 Socket 应用,有效降低平台切换的学习成本。

• RTOS 版本 SDK 引⼊了 cJSON 库,使用该库函数可以更加方便的实现对 JSON 数
据包的解析。

• RTOS 版本兼容 non-OS SDK 中的 Wi-Fi 接口、SmartConfig 接口、Sniffer 相关接
口、系统接口、定时器接口、FOTA 接口和外围驱动接口,不⽀持 AT 实现。

具体可参考如下文档

二、固件说明
乐鑫可以支持在线固件升级,称为Firmware Over The Air(FOTA)。
与此相对的是传统固件类型,称为Non-FOTA。
固件有如下类型:

地址映射图如下:

ESP8266使用esp-open-rtos的实践

一、esp-open-rtos概要

Esp-open-rtos是开源的、基于freertos的、用于ESP8266固件的开发支持环境。最早是从乐鑫官方的ESP8266_RTOS_SDK基础上fork而来,但是目前的代码、框架已经和原SDK相去甚远,有了大幅的变化。从代码结构、编译方法、支撑库等均有不同,而且内置了更多的常见传感器驱动,以及MQTT、TLS、甚至OTA等常用的功能模块。相比官方同样的RTOS SDK、感觉更好用、更便利、开发应用速度更快。
目前,esp-open-rtos在github上获得了550多个STAR,足以证明其被认可的程度。

Github地址:https://github.com/SuperHouse/esp-open-rtos
Gitcode镜像:https://gitcode.com/gh_mirrors/es/esp-open-rtos

Esp8266的项目较多,容易混淆,总结如下:

    1. esp-open-sdk esp8266编译工具链
    1. esp-open-rtos 基于FreeRTOS的esp8266固件
    1. ESP8266_NONOS_SDK 乐鑫官方非OS版本固件、带AT固件
    1. ESP8266_RTOS_SDK 乐鑫官方RTOS固件(基于FreeRTOS)
    1. nodemcu-firmware NodeMCU的lua固件
  • 2~5均使用同样的编译工具链1。

二、esp-open-rtos安装

1、编译工具链的建立(toolchain)
交叉编译工具链和乐鑫官方SDK相同,均使用esp-open-sdk。
安装方法可参照前面文章:【ESP8266固件的编译1(交叉编译工具链的建立)】。
简便起见,推荐使用【make STANDALONE=y】。

交叉编译环境代码下载

ESP8266 内部有一个完整的 32bit MCU 核心,主频 80/160MHz,其体系结构为 Xtensa lx106。Xtensa 是专为嵌入式单芯片系统而设计的微处理器,由Tensilica 公司开发。Tensilica 也是发展极为迅猛的一家公司,主要是在专业性应用程序微处理器上为高容量嵌入式系统提供解决方案。

Esp8266使用Tensilica

1
git clone https://github.com/pfalcon/esp-open-sdk.git

根据Readme的说明,代码主要包含如下部分:
1) 交叉编译器自身

1
2
3
4
https://github.com/jcmvbkbc/crosstool-NG
https://github.com/jcmvbkbc/gcc-xtensa
https://github.com/jcmvbkbc/newlib-xtensa
https://github.com/tommie/lx106-hal

2) 乐鑫官方提供的IoT SDK

1
http://bbs.espressif.com/viewforum.php?f=46

3) 其他第三方依赖代码

1
2
3
4
5
lwIP, http://savannah.nongnu.org/projects/lwip/
Contiki, http://www.contiki-os.org/
axTLS, http://axtls.sourceforge.net/
wpa_supplicant, http://w1.fi/wpa_supplicant/ (source withheld by Espressif)
net80211/ieee80211 (FreeBSD WiFi stack)

如果是桌面安装,一般以下依赖包都需要安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo yum  -y install autoconf
sudo yum -y install autoconf
sudo yum -y install gcc
sudo yum -y install gcc.g++
sudo yum -y install gperf
sudo yum -y install bison
sudo yum -y install flex
sudo yum -y install makeinfo
sudo yum -y install texinfo
sudo yum -y install help2man
sudo yum -y install gpatch patch
sudo yum -y install libtool
sudo yum -y install curses
sudo yum -y install curses-lib
sudo yum -y install ncurses-libs.x86_64
sudo yum -y install ncurses-devel.x86_64
sudo yum -y install gcc-c++
sudo yum -y install expat

另外,还要安装pip以及esptool(固件打包必须用)所依赖的seriral库。

1
2
3
sudo yum -y install epel-release
sudo pip install esptool
sudo pip install pyserial

编译

有两种模式可供选择:
1) 分离模式
在此模式下,生成交叉编译工具链和乐鑫的IoT SDK没有依赖关系,
也就是说需要主动设置IoT SDK的头文件路径和库路径。
用官方的话来说,就是License更clear,也更容易配合乐鑫官方的SDK升级。
执行make STANDALONE=n

2) StandAlone模式
和某版的乐鑫SDK绑定,从而无需单独指定IoT SDK路径,方便一些。
执行

1
2
make STANDALONE=y
或者 make

执行make命令后,会自动git各种所需组件,会花费相当长的一段时间。
作为参考,在海外阿里云主机上花费了约40min。

编译成功后,需要将路径添加到PATH中,并添加别名xgcc。

1
2
export PATH= 安装路径/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
alias xgcc="xtensa-lx106-elf-gcc"

编译后,在esp-open-sdk目录下,可以看到各依赖包和乐鑫SDK的目录已经被生成。Sdk目录其实是一个符号链接,指向被下载的ESP8266_NONOS_SDK_V2.0.0_16_08_10。

参考链接:
http://www.esp8266.com/wiki/doku.php?id=toolchain#how_to_setup_a_vm_to_host_your_toolchain

2. 代码下载
如下命令从github上下载代码。

git clone --recursive https://github.com/Superhouse/esp-open-rtos.git

使用recursive,可以将依赖的第三方代码一起获取。

三、代码编译

乐鑫官方的RTOS SDK是先编译底层支撑代码,以库的形式提供。
应用层通过连接库的的方式和底层代码链接在一起,build为bin,存在两个阶段。

具体可参照前文:
【ESP8266固件的编译5(RTOS SDK固件)】
但eps-open-rtos采用了另外一种方式,它没有底层代码编译库的过程。
而是以应用为中心,每个应用都会将所有底层代码复制一份
(从FreeRTOS到lwip,再到各种依赖库和应用层代码)每个应用都会复制并编译属于自己的这份,
并和自身的应用层代码一起编译。(其实最终也会通过库的形式,但是编译过程是一体化的)

另外Esp-open-rtos的编译采用make,摆脱了cmake,感觉清爽、瘦身很多。
编译时可通过make help来看到编译相关的帮助,尤其是make flash。

非常重要的是,
Esp-open-rtos在examples目录下提供了很多例子(很赞),上手可以很快。

1、编译准备
在编译之前,需要在include目录下,创建private_ssid_config.h文件,
来预定义系统默认wifi参数,内容如下:

1
2
#define WIFI_SSID "mywifissid"
#define WIFI_PASS "my secret password"

2. mqtt_client的编译

上面已经说明过,esp-open-rtos以应用为中心编译,
下面以mqtt_client为例进行说明

编译方法1,在esp-open-rtos根目录下,执行

1
make -C examples/mqtt_client/

编译方法2,进入到examples/mqtt_client目录下,直接执行

1
make

3. esp8266的相关参数设定
系统默认的esp8266相关的参数,如SPI类型、Flash大小等,定义在根目录下的parameters.mk中,如下:

1
2
3
FLASH_SIZE ?= 16
FLASH_MODE ?= qio
FLASH_SPEED ?= 40

?= 是make的语法,意为如果没有定义,就使用=后的值做赋值,相当于默认参数。
如果目标硬件(ESP8266模组)固定,可以直接修改此文件。
若目标硬件经常变化,如经常切换ESP01和ESP12,也可以修改应用目录下的Makefile文件进行配置:

1
2
3
4
5
6
PROGRAM=mqtt_client
FLASH_SIZE ?= 32
FLASH_MODE ?= qio

EXTRA_COMPONENTS = extras/paho_mqtt_c
include ../../common.mk

因使用安信可的ESP12F模块,所以将FLASH_SIZE修改为32,
如使用nodeMCU,除FLASH_SIZE外,还要将FLASH_MODE改为dio。

注意EXTRA_COMPONENTS宏,是esp-open-rtos的Make体系中指明依赖组件的宏,
所有需要依赖的扩展都要定义在该宏中(空格分隔)
这里可以看出,mqtt的协议是使用的Apache Paho(根据esp8266移植过)

MQTT本身的参数设定,可在在mqtt_client.c中修改。

编译成功后,在examples/mqtt_client/ firmware目录下,
会生成名为mqtt_client.bin的固件文件。

4. mqtt_client代码解析
mqtt_client的代码简单且结构清晰:
主函数启动3个task,分别是:

  • wifi管理task
  • mqtt管理task
  • 以及mqtt连接成功后定时pub的测试task

wifi_alive是一个信号灯(semaphore),用于协调wifi task和 mqtt task,以保证网络正常后再进行mqtt处理。
publish_queue是一个消息队列,用于beat_task和mqtt task间的数据传递,用于定时向【/beat】主题发布。
另外,mqtt task中在mqtt连接建立后,会订阅【esptopic】主题,并显示收到的消息。
下面是入口函数user_init的实现。

1
2
3
4
5
6
7
8
9
10
11
void user_init(void)
{
uart_set_baud(0, 115200);
printf("SDK version:%s¥n", sdk_system_get_sdk_version());

vSemaphoreCreateBinary(wifi_alive);
publish_queue = xQueueCreate(3, PUB_MSG_LEN);
xTaskCreate(&wifi_task, "wifi_task", 256, NULL, 2, NULL);
xTaskCreate(&beat_task, "beat_task", 256, NULL, 3, NULL);
xTaskCreate(&mqtt_task, "mqtt_task", 1024, NULL, 4, NULL);
}

四、固件下载(刷写)

因为esp-open-rtos内置了esptool.py,可用make flash进行直接做固件刷新。
但在windows上,还是使用官方的下载工具更加方便。
关于固件下载工具的使用,可参照前文【ESP8266固件的编译5(RTOS SDK固件)】。
和其他固件的刷新方法一样,但写入地址方面,和乐鑫官方、nodemcu差别较大。

观察make flash的命令输出:

1
2
esptool.py -p /dev/ttyUSB0 --baud 115200 write_flash -fs 32m -fm qio -ff 40m
0x0 ../../bootloader/firmware_prebuilt/rboot.bin 0x1000 ../../bootloader/firmware_prebuilt/blank_config.bin 0x2000 ./firmware/mqtt_client.bin

可以看到,出mqtt_client.bin外,还要刷入预置的,
存放于bootloader/firmware_prebuilt目录下rboot.bin和blank_config.bin。

其写入地址为:

1
2
3
rboot.bin               0x0000
blank_config.bin 0x1000
mqtt_client.bin 0x2000

如下图:

刷入后,如网络征程,即可以看到wifi连接成功后,mqtt的通信状况。
ESP8266侧如图:

框内内容分别是,wifi接入,mqtt接入,和收到mqtt消息。

服务端可用如下命令测试(mosquitto):

发布:

1
mosquitto_pub -u test -P test -t /esptopic -m "hello world"

接收:

1
mosquitto_sub -u test -P test -t /beat

可以看到收到连续的beat消息。

如上,mqtt在esp8266上非常容易的便可被实现,而且还有多task的支持。
增加传感器,将读取数据通过mqtt送出,即可实现简单的IoT系统。
而且,esp-open-rtos对常见传感器(温度、光线 etc.)的驱动支持也相当不错。
examples目录下有例子,extras目录下有协议实现。

ESP-OPEN-SDK开发之环境搭建参考

最近在弄这个WiFi模块,发现网上SDK开发方面的资料很少,发现了一套视频教程,不过主讲人的讲课方式实在受不了。对基于SDK开发感兴趣的同学可以通过本帖在Ubuntu系统上通过Eclipes搭建开发环境。

过程可以分为两步:
1、下载、编译SDK
2、配置Eclipes

一、下载、编译SDK

esp8266的sdk有两种,分别是ESP8266_RTOS_SDK和ESP8266_NONOS_SDK,这两者的区别在于RTOS_SDK有一个叫做RTOS的操作系统,采用了NONOS_SDK部分接口,不支持AT指令。
详见:Q: What is the difference between RTOS and the non-OS SDK?

这里我们使用NONOS_SDK,下载地址:esp-open-sdk

里边集成了NONOS_SDK的编译器和烧录工具等,也可用此编译器编译ESP_RTOS_SDK中的项目。

我们直接在命令行进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
#安装一些依赖工具
$ sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf \
flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial \
sed git unzip bash help2man wget bzip2
#如果ubuntu版本高于14.04可能还需要此工具
$ sudo apt-get install libtool-bin
#使用git克隆项目到本地,这里假设项目克隆到了/home/mmmmar/esp-open-sdk
$ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
#进入项目文件夹
$ cd /home/mmmmar/esp-open-sdk
#编译
$ make STANDALONE=y

注意:在SDK的编译过程中需要联网下载一些依赖库并编译,而且下载过程很容易失败,我在下载时挂代理才成功的。
如果编译失败可以查看esp-open-sdk/crosstool-NG/build.log 查看崩溃信息,一般都是下载失败。

编译成功后会在esp-open-sdk文件夹出现xtensa-lx106-elf esptool ESP8266_NONOS_SDK三个文件夹,分别是编译器,烧录工具,NONOS_SDK最新版。
这时需要把编译器路径加入到系统路径中,执行:

1
2
#此命令只作用于当前控制台
export PATH=/home/mmmmar/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

这时就可以编译esp-open-sdk/*ESP8266_NONOS_SDK*/examples中的示例工程了。
需要注意,要把ESP8266_NONOS_SDK文件夹复制到esp-open-sdk文件夹的外部,假如我们要编译examples文件夹中的at项目,我们需要把at文件夹复制到ESP8266_NONOS_SDK目录下,不然编译会失败。
复制完之后路径如下:

1
2
3
4
5
/home/mmmmar
├── ESP8266_NONOS_SDK
│ ├── at
│ ├── examples
└── esp-open-sdk

复制完之后就可以编译at(我们最初用的AT指令就是这个项目,不过我们只能添加新的AT命令)项目了。
执行at文件夹下的gen_misc.sh,这里需要输入一些参数。
对于那些参数我也不是特别清楚,我的esp-01(黑色)选择的是:
boot version  = none
spi size and map = 1024KB( 512KB+ 512KB)

其余默认。黑色的版的esp-01有1MB的存储空间,而蓝色版只有512KB,不能使用最新版的AT固件。

编译完成后有如下输出:

1
2
3
4
5
6
!!!
No boot needed.
Generate eagle.flash.bin and eagle.irom0text.bin successully in folder bin.
eagle.flash.bin-------->0x00000
eagle.irom0text.bin---->0x10000
!!!

现在可以把ESP8266_NONOS_SDK/bin目录中生成的固件烧录到开发板中去了,可以使用esp-open-sdk/esptool/esptool.py
不过我用的是windows上的一键烧录工具,大家百度一下就能搜到。

在配置一栏里需要填写各个二进制文件的烧录地址,这里附上官方文档里说明:

详见:2a-esp8266-sdk_getting_started_guide_en.pdf
至此,整套编译工具烧录工具就可以使用了,接下来介绍如何配置Eclipes

二、配置Eclipes(这部分用不到就不记录)

ubuntu上烧录方法:

使用esp-open-sdk/esptool/esptool.py,执行如下命令

1
2
#这里的参数需要根据自己的需求改变,详见esp-open-sdk/esptool/README.md
sudo ./esptool.py --port /dev/ttyUSB1 write_flash 0x00000 eagle.flash.bin 0x10000 eagle.irom0text.bin

烧录时要确保接线牢固,不然可能传输过程中会出现数据丢失或更改导致固件验证失败

参考:
官网文档
Free and open (as much as possible) integrated SDK for ESP8266/ESP8285 chips
Latest ESP8266 SDK based on FreeRTOS


相关链接(侵删)

  1. ESP8266_RTOS_SDK与esp-open-sdk的区别
  2. ESP8266使用esp-open-rtos的实践
  3. esp8266 SDK开发之环境搭建
  4. ESP8266固件的编译(交叉编译工具链的建立)
  5. ESP8266固件的编译(乐鑫原厂SDK)

=================我是分割线=================

欢迎到公众号来唠嗑: