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

基于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环境搭建 或者群文件获取即可!

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述



二、开始我们基于 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 ,下面步骤:

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


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

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

void user_init(void) {
	os_printf("hello world");
}


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

  • Build Project :编译项目 ; Clean Project:清理项目,可以清理下缓存。


关闭problem栏


先clear再build


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

这里写图片描述


  • 第三处修改:需要在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, 所以需要修改如下:

在这里插入图片描述


  • 第二处修改:修改编译指令,还记得我们的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

在这里插入图片描述


  • 开始编译之后,便可看到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
    !!!


在这里插入图片描述


四、让我们烧固件走起。


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

这里写图片描述


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


这里写图片描述


  • 让我们开始烧录:根据上面第八步的生成的bin文件,我们看见了其烧录信息:

  • eagle.flash.bin-------->0x00000

  • eagle.irom0text.bin---->0x10000


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

这里写图片描述


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

在这里插入图片描述


  • 上面的图是不是看见很清晰的 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.确保波特率正确
  • 2.确保无串口占用

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

  • 玩转esp8266带你飞、加群QQ群,不喜的朋友勿喷勿加:434878850
  • esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐