• 本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。

基于 C SDK 的 ESP8266 开发技术全系列笔记

一、NONOS SDK 无操作系统开发

1、搭建开发环境,开始一个 “hellow world” 串口打印。
2、利用 GPIO 开始使用按钮点亮你的 “第一盏灯”。
3、利用 “软件定时器” 定时 0.5 秒闪烁点亮一盏 LED。
4 、了解 PWM,更为深入地用 PWM 控制一盏 LED 的亮度变化。
5 、原生乐鑫 SDK 高级使用之封装 Post 与 Get 请求云端,拿到 “天气预报信息”。
6 、了解 SmartConfig 与 Airkiss 一键配网,无需把 wifi 名字密码写在固件里。
7 、了解 softAP 热点配网模式原理,仿 “机智云” 定义自己的热点配网模式协议。
8、你要找的 8266 作为 UDP、TCP 客户端或服务端的角色通讯,都在这了。
9、 [小实战上篇]Windows 系统搭建 8266 的本地 Mqtt 服务器,局域网点亮一盏 LED 灯。
10、 [小实战下篇]Windows 系统搭建 8266 的本地 Mqtt 服务器,局域网点亮一盏 LED 灯。
11、8266 接入阿里智能,点亮一盏 LED 灯,期待天猫精灵语音控制的不约而至!
12、图文并茂学习阿里云主机搭建 8266MQTT 服务器,实现移动网络远程控制一盏 LED。
13、 动手做个 8266 毕设小案例,smartConfig + MQTT 协议轻松实现远程控制一盏 LED。
14、esp8266 的 FreeRtos 系统学习的正确姿势 ——— 环境搭建、烧录。
15、esp8266 的 物联网又一股清流,8266 接入阿里云平台非阿里智能的 SDS 服务,点亮一盏 LED 灯。
16、esp8266 的 基于 Nonos 移植红外线 H1838,实现红外遥控器配网,远程控制一盏灯。
17、esp8266 自研的快速上电开关五次 (开 - 关为一次) ,无需按键触发则 8266 进去一键配网模式。
18、 esp8266 基于 NONOS 实现 OTA 远程升级,实现无线 “热修复” 升级固件程序。
19、 esp8266 驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
20、 深入学习 esp8266 的 esp now 模式,仿机智云做一个小网关,实现无需网络下彼此通讯交互数据。
21、浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
22、 esp8266 的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些 makeFile 的事。
23、 乐鑫 esp8266 NONOS SDK 3.0 编程使用 SPI 驱动基于 Max7219 芯片的八位数码管,显示日期信息。


二、RTOS SDK 带操作操作系统开发

23、再来一波 esp8266 基于 freeRtos 系统连接自己私有的服务器实现 OTA 远程升级,接触下 lwip 的基本知识。。
24、 渗透学习回顾下 esp8266 的外置 spi 芯片 25q 系列,熟悉 8266 代码块在其的分布,得心应手放置图片或其他资料。
25、 深聊下 esp8266 的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。
26、 RTOS 分析 MQTT 实现过程,实现移植 MQTT 协议在 esp8266 rtos 实时系统,可断线重连。
27、 跟紧脚步,用 VisualStudio Code 开发 esp8266 rtos SDK v3.0 版本,全新的 idf 框架,节省内存模块化开发。
28、 教你轻松自如使用 cJson 在乐鑫 esp8266 如何解析一段 json 数据以及如何生成一段 json 数据。
29、 百万条消息免费之乐鑫 esp8266 使用 TCP 直连模式 MQTT 协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。
30、 使用 IIC 总线驱动 0.96 寸的 OLED 显示屏,显示天气预报信息。
31、 当 esp8266 遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制 esp8266。
32、 细聊 HmacMD5 的加密方法带来的安全性,并实践在 esp8266 上,最大保障传输的过程的信息的安全性。
33、 如何优雅地像乐鑫原厂封装 esp8266 底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
34、 乐鑫 esp8266 NONOS SDK 3.0 编程使用 SPI 驱动基于 Max7219 芯片的八位数码管,显示日期信息。
35、 乐鑫 esp8266 芯片借助机智云平台做一个商业化的七彩 RGB 灯泡可调整体方案项目,炫彩夺目高大尚。
36、 认识 esp8266 Rtos 3.0 sdk 工程结构,esp8266 如何向 esp-idf 工程靠近的,如何自定义头文件编译?
37、 你要找的基本外设功能都在这里了,包括 Gpio、Pwm 和 Uart 接口使用。
38、 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用 NVS 保存整型、字符串、数组以及结构体。
39、 捋一捋微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 。
40、 基于乐鑫 idf 框架,研究出超稳定、掉线重连、解决内存泄露问题的 Mqtt 框架!支持 esp8266 和 esp32!
43、esp8266-12 模块基于 rtos3.1 版本 ota 功能远程空中升级固件,官网基础之上增加 dns 域名解析!
43、 我又来了,基于 rtos3.0 版本 SDK 编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们!
43、esp8266-12 模块基于 rtos3.0 版本扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合 esp32。
43、整理分享那些我在项目中常用的 esp8266 rtos3.0 版本的常见驱动,Button 按键长短按、PWM 平滑调光等。
43、 内置仅 1M 的 Esp8285,如何攻破最棘手的 OTA 问题,大大节省资源成本开发产品。
43、 详细分析 Esp8266 上电信息打印的数据,如何做到串口通讯上电不乱码打印。
43、 无需外网,如何实现在本地局域网与控制端做数据交换的一些开发经验。
43、迟来的 1024 程序员祝福,开源分享一个驱动 ds18b20 获取温度的工程。
43、aliyun sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制。
43、esp 产品量产方案初入门之 如何从外部读取 csv 文件的数据,比如从代码读取外部文件阿里云三元组。
43、体验下 Linux 搭建 ESP8266_RTOS_SDK 3.0 最新环境的搭建和编译吧。
43、仅 1M flash 的安信可 ESP-01S 模块,如何二次开发?如何对其 OTA 远程升级固件
43、分享在 esp8266 C SDK 实现冷暖光色温平滑调节的封装,轻松集成到您的项目去。

———— 学习笔记持续更新,欢迎关注我…

很多人怎么联系我一起学习进步,下面打个小小公告:
玩转esp8266带你飞、加群QQ群,提高门槛,不喜的朋友勿喷勿加:434878850
esp8266 源代码免费学习汇总(持续更新,欢迎 star):https://github.com/xuhongv/StudyInEsp8266
esp32 源代码免费学习汇总(持续更新,欢迎 star):https://github.com/xuhongv/StudyInEsp32


一、认识其本质与搭建开发环境。


1.1 、 市面上无线模块有哪些。


大家可知道目前的无线通信模块有哪几种? 主要有Wifi 无线通讯BlueTooth 蓝牙ZigBee,目前大多都是前二者,ZigBee 现在用的很少了。据我所推断的,未来是属于物联网世界、智能家居领域,而蓝牙和 zigbe 局限于范围,蓝牙 4.0 仅仅最大支持 100 米,zigbee 就不说了。


1.2 、wifi 模块 Esp8266 发展。


2015 年物联网处于爆发的一年,乐鑫的 ESP8266WIFI 芯片成为强烈的催化剂。成功的将 2014 年前的 40 以上的 WIFI 成本压缩到现在的 10 元左右。内置 WIFI 前端和高性能的 32 位 MCU,基本引爆物联网市场,几乎牵扯到电子的行业,都可以用上,比如 WIFI 开关 灯具 WIFI 定位 电饭锅 空气净化器 等消费类小家电与大家电,都面临这一场技术革新,与新的用户体验!比如你仅仅增加 10 元的成本就可以把自己的产品被手机控制了。


1.3 、Esp8266 特点。


  • 要知道,在物联网世界里面的牛人,没有谁不认识 8266 。既然如此出色,那肯定有他存在的必然理由:

    • 低功耗、高集成度的 Wi-Fi 芯片。
    • 最小系统仅需 7 个元器件
    • 超宽工作温度范围:-40°C 至 +125°C
    • ESP8285 : ESP8266 内封 8 Mbit Flash。
    • ESP8266EX 有三种运行模式:激活模式、睡眠模式和深度睡眠模式,能够延长电池寿命。

1.4 、搭建开发环境。


方式 1,利用安信可一体化环境【新手推荐】

  • esp8266 经过这么多年的迭代,sdk 从 1.0 到目前的 3.3 版本,也有 2 种 C 语言开发方式:裸跑 nonos 以及 实时操作系统 freeRtos 的支持,安信可公司一直在着乐鑫步伐跟着走,推出了 前 1.0 版本1.0 版本
  • 其中 前 1.0 版本 仅仅支持 2.0 版本及以下,而 1.0 版本支持 3.0 或以上。
  • 教程参考官网教程:添加链接描述

方式 2,自主搭建环境【支持 rtos 和 nonos】:

  • 环境搭建大家应该都几乎是选择 windows 的,作为一个老司机,和大家一样,我也是选择为 win10 的笔记本电脑游戏本,cpu i8 ,16g 内存!
  • 下面我就以 windows 平台为大家搭建一个可以手动同步最新编译工具链、以及可编译 非操作系统 nonos 工程和 操作系统 Rtos 工程的代码,下面是搭建环境的三件套:

    • esp8266 最新的编译工具链下载传送门(仔细看下面的截图): https://github.com/espressif/ESP8266_RTOS_SDK
    • 2019 年的 eclipse c++ 编辑器下载,请关注我的微信公众号后回复 8266 环境搭建 或者群文件获取即可!
    • 感谢安信可提供的 window cywin 环境,下载可在我的微信公众号后回复 8266 环境搭建 或者群文件获取即可!

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图1


  • 待我们的三件套下载了之后,首先第一步是解压,注意是用WinRAR软件以管理员身份解压,可以得到完整的文件夹,其他解压软件有可能会得到不完整的压缩包!
  • 下面我们先设置下 cywin 和编译工具链的环境变量,注意替换为您的实际路径,如下:

    • E:\Espressif\IDE\AiThinkerIDE_V0.5\AiThinkerIDE_V0.5\cygwin\bin\
    • E:\Espressif\IDE\xtensa-lx106-elf\bin\

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图2


  • 下面是我们的编辑器的打开,注意 eclipes 的打开必须事先自行搭建 java 环境,因为 eclipse 是用 java 开发的 !等你可以成功打开界面如下,说明您已经完成了一大半了!

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图3



二、开始我们基于 nonos 工程的第一个 “Hello World”。


第一步:打开我们最新的 NONOS 的 SDK 下载地址:https://github.com/espressif/ESP8266_NONOS_SDK ,解压后请注意以下操作:
  • ①、driver_lib文件夹下面的Makefile文件删除!
  • ②、整个third_party去掉,这是第三方的 demo,我们很少用!
  • ③、把example文件夹下面的任意一个工程,比如smart_config复制到主目录(逼问主目录就是下载压缩包压缩后的目录),可重命名为app,或者不修改!
  • ④、以上做好了之后,可以导入 IDE 了!

我这里演示一个串口实验,打印 hellow world 字符到我们通讯串口助手。下载后解压,注意解压后的路径千万别带中文字符,解压请直接复制到一个没有中文字符的路径的文件夹下面。否则会影响到后面的编译结果!


第二步:导入项目 选择 File→Import ,下面步骤:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图4


第三步:点开 C/C++ 分支,并选中 Existing Code as Makefile Project:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图5


第四步:去除 C++ 支持,选中 Cygwin GCC,点击 Browser,选中我们解压后所在的目录。点击 finish。

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图6


第五步:此刻,成功进入到我们的主界面。

第六步:开始编译工程前,我们装装逼,在其的 app ->user —> user_main.c 方法修改如下,让输出为 hello world。
  • 注意:从 SDK1.4 版本之后,已经移除了下面 2 个函数,我们只需要在user_init()里面敲写即可!
  • esp8266的非实时系统编程的打印函数尽量用os_printf(),切记切记!!!

  1. void user_init(void) {
  2. os_printf("hello world");
  3. }

第七步:开始编译前,按照官方的说法,我们看控制台时候,直接把 Problems 栏目关掉,解释说,这个 Problems 栏目报的错误不准确,只有 Console 栏目下的输出为准,所以建议大家把 Problems 栏目关闭。
  • 之后建议大家每次编译项目前先进行 clear project,再 build project ,这样就保证了正确的代码可以完全被编译,如果正确的代码没有 clear project 就直接 build project ,可能会报错。
  • Build Project :编译项目 ; Clean Project:清理项目,可以清理下缓存。

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图7


Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图8


第八步:我们编译之后,看看控制台下的信息打印,说明已经成功做好固件啦。:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图9


  • 第三处修改:需要在 project_template 的 Makefile 里添加指定的 SDK 的路径。千万忘记了结尾的”/”。否则编译还是会找不到路径,比如我的工程路径为:C:\Project8266\8266All\8266ProjectCSDN\16_ESP8266_RTOS_SDK_V1.5.0

export SDK_PATH = /cygdrive/C/Project8266/8266All/8266ProjectCSDN/16_ESP8266_RTOS_SDK_V1.5.0/
export BIN_PATH = /cygdrive/C/Project8266/8266All/8266ProjectCSDN/16_ESP8266_RTOS_SDK_V1.5.0/bin/
  • 开始编译之后,便可看到 console 控制台输出如下,恭喜成功编译!

三、基于 rtos 如何打开运行一个工程。


  • 第一处修改:此 rtos 工程导入和安信可的导进就是一模一样的,但是需要修改的是指定的工程编译目录 , 拿我 github 上的一个 rtos 工程,其编译目录为 project_template, 所以需要修改如下:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图10


  • 第二处修改:修改编译指令,还记得我们的 rtos 编译时候需要选择一些选项吗?比如是 user1.bin 还是 user2.bin。这里的话,我们需要手动的编辑此编译的指令:(下面的指令是生成可升级的 user1.bin 的 32Mbit 的 8266 模块,对应我们的 8266-12f 模块)
COMPILE=gcc BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=6

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图11


  • 开始编译之后,便可看到 console 控制台输出如下,恭喜成功编译!
    bin crc: 1b65b8de
    Support boot_v1.4 and +
    Generate user1.4096.new.6.bin successully in BIN_PATH
    boot.bin——————>0x00000
    user1.4096.new.6.bin—>0x01000
    !!!

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图12


四、让我们烧固件走起。


  • 如果您的 8266 是没有最小系统的话(如下),那么需要自己搭建最小系统来烧固件进去。

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图13


看我们的最小系统搭建(强调:烧录时候,一定要让 GPIO0 处于低电平,即接 GND):


Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图14


  • 让我们开始烧录:根据上面第八步的生成的 bin 文件,我们看见了其烧录信息:
  • eagle.flash.bin————>0x00000
  • eagle.irom0text.bin——>0x10000

  • 于是,我们就打开烧录软件,配置刚刚的路径,选择烧录地址 (选择之后就是绿色的),各个参数如下:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图15


  • 下载完毕之后,我们给设备重新上电,打开串口助手,设置波特率 74880:

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图16


  • 上面的图是不是看见很清晰的 hellow world 呀 。
  • 由于 nonos 3.0 以上步骤不可行,则具体操作请访问我的 B 站视频教学:https://www.bilibili.com/video/av40065898
  • 后记:所有自己编译出来的工程,都是有四个文件要烧录的,其中 2 个是必须烧录的(防止初始化失败),这 2 个文件分别是 esp_init_data_default.bin blank.bin,烧录地址根据您的 8266 型号区别;
  • 我们最平常用的是安信可 8266-12 系列的,这个是 32Mbit,也就是 4M flash , 所以他们的地址分别是 0x3FC000 和 0x3FE000 , 最后 2 个的烧录文件地址看编译之后结果而决定!也即是不一定是 0x10000,有可能是 0x2000 , 这个根据 SDK 的版本有关系。所以大家还是留心点!
  • 的好多人问我这个SPI MODE应该怎么选择,这个其实是esp8266芯片和flash芯片的连接方式决定的,四根线就是QIO,而DIO就是六根线,至于后面还有QOUTDOUTflash芯片有关,平时最多的是DIO或者是QIO了!
  • 最后一点,本系列博客的NONOS SDK 都是 1.4~2.2的,在今年2018 年七月左右,更新到了3.0版本,一些初始化代码都已经变了,大家入门的话,还是从我的GitHub下载吧。这样较快地入门学习esp8266;如果您的是最新的3.0或者以上的工程,可能汇报以下错误:
user_main.c:45:2: error: #error "The flash map is not supported"
 #error "The flash map is not supported"
  ^
xt-xcc -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf  -DICACHE_FLASH -DGLOBAL_DEBUG_ON -DSPI_FLASH_SIZE_MAP=0   -I include -I ./ -I ../include -I ../include/mqtt -I ../include/modules -I ../../include -I ../../include/eagle -I ../../driver_lib/include  -o .output/eagle/debug/obj/user_main.o -c user_main.c
user_main.c:45:2: error: #error "The flash map is not supported"
 #error "The flash map is not supported"
  ^
user_main.c:156:58: error: 'SYSTEM_PARTITION_OTA_SIZE' undeclared here (not in a function)
     { SYSTEM_PARTITION_OTA_1,         0x1000,            SYSTEM_PARTITION_OTA_SIZE},
                                                          ^
user_main.c:157:39: error: 'SYSTEM_PARTITION_OTA_2_ADDR' undeclared here (not in a function)
     { SYSTEM_PARTITION_OTA_2,         SYSTEM_PARTITION_OTA_2_ADDR,       SYSTEM_PARTITION_OTA_SIZE},
                                       ^
user_main.c:158:39: error: 'SYSTEM_PARTITION_RF_CAL_ADDR' undeclared here (not in a function)
     { SYSTEM_PARTITION_RF_CAL,        SYSTEM_PARTITION_RF_CAL_ADDR,       0x1000},
                                       ^
user_main.c:159:40: error: 'SYSTEM_PARTITION_PHY_DATA_ADDR' undeclared here (not in a function)
     { SYSTEM_PARTITION_PHY_DATA,       SYSTEM_PARTITION_PHY_DATA_ADDR,      0x1000},
                                        ^
user_main.c:160:46: error: 'SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR' undeclared here (not in a function)
     { SYSTEM_PARTITION_SYSTEM_PARAMETER,     SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR,    0x3000},
                                              ^

  • 莫急,这是因为未定义造成的,一般地,根据我们最常用的esp8266-12系列的32Mbit的模块,那么只需要在根目录的Makefile文件的第 25 行的代码修改如下,重新编译即可!!烧录地址不变!!
BOOT?=new
APP?=1
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP?=6

五、上电不跑程序,异常分析。


ESP8266 上电时打印的 boot 模式信息代表什么?如何改变 boot 模式?

ESP8266 上电时会判断 boot strapping 管脚的状态,并决定 boot 模式。例如,ESP8266 上电时打印的 boot 模式信息如下:

ets Jan 8 2013,rst cause:1, boot mode:(3,2)
  • 其中打印的 boot mode 的第一位数字(3)代表当前的 boot 模式。
  • Boot 模式由 strapping 管脚的 3 位值 [GPIO15,GPIO0,GPIO2] 共同决定。如下表所示: | Strapping 管脚的 3 位值 | [GPIO15,GPIO0,GPIO2] | Boot 模式 | | —- | —- | —- | | 7 | [1,1,1] | SDIO HighSpeed V2 IO | | 6 | [1,1,0] | SDIO LowSpeed V1 IO | | 5 | [1,0,1] | SDIO HighSpeed V1 IO | | 4 | [1,0,0] | SDIO LowSpeed V2 IO | | 3 | [0,1,1] | Flash Boot | | 2 | [0,1,0] | Jump Boot | | 1 | [0,0,1] | UART Boot | | 0 | [0,0,0] | Remapping |

烧写失败定位
确保 boot 模式在 UART boot.

将 ESP8266 拨到烧写模式,看烧写口的 log(默认 74880 查看). 正常烧写应该是 boot mode:(1,n), 其中 n 任意,第二个参数和 SDIO 相关,不用关心!

看 log 乱码 / 无打印定位,确保 boot 模式在 Flash boot!

将 ESP8266 拨到运行模式,看 log 口的输出. 正常 log 应该是 boot mode:(3,n),第二个参数和 SDIO 相关,不用关心!

    1. 确保波特率正确
    1. 确保无串口占用

另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!

Esp8266学习之旅① 搭建开发环境,开始一个“hellow world”串口打印。_徐宏的博客 | 修身齐家治国平天下-CSDN博客 - 图17
https://blog.csdn.net/xh870189248/article/details/77985541