ESP8266_01搭建开发环境
ESP8266_02程序的编译与下载
ESP8266_03SDK与Makefile的基本用法
ESP8266_04管脚控制与软件定时器
ESP8266_05 ESP8266有几个串口?
ESP8266_06硬件定时器与IO中断
ESP8266_07基于PWM的呼吸灯
ESP8266_08基于flash的数据掉电保护
ESP8266_09基于IIC控制的OLED屏幕
ESP8266_10 ESP8266的STATION模式
ESP8266_11 ESP8266的UDP广播
ESP8266_12 ESP8266客户端模式下的TCP通信
ESP8266_13服务器端模式下的TCP通信
ESP8266_14 SOFTAP模式下的服务器端和客户端
ESP8266_15天气预报之TCP的GET操作
ESP8266_16天气预报之JSON数据的生成与解析
ESP8266_17简单网络时间协议-SNTP
ESP8266_18 MQTT协议接入ONENET平台
ESP8266_19MQTT协议接入ONENET平台_订阅主题
ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作
ESP8266_21基于ESP8266的一键配网
ESP8266_22基于自身ADC的电压采样
ESP8266_23基于硬件定时器的红外遥控器解码
这一节主要看下如何对ESP8266的程序进行编译和下载,首先打开 AiThinker_IDE.exe。如下图所示,咱们选中其中一个现有的工程文件进行编译:
工程选择:esp8266_helloworld,依次打开包含的文件夹:user,以及user下面的user_main.c文件。
这里的user_main.c文件,就相当于单片机工程里的main.c文件;而文件里的user_init(void)函数,就相当于单片机程序里的main函数。理解了这两点,剩下的就好理解了。
user_init(void)函数里面只包含了三行代码:第一行通过串口打印当前SDK的版本,第二行打印当前程序的编译时间。
第三行稍微麻烦一点,它是在注册系统初始化完成的回调函数。如果是搞单片机的,估计大部分是第一次听说回调函数。关于回调函数,这里摘抄一段网上讲的比较好的说明:
对普通函数的调用:
调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行。从发出调用的程序的角度看,这个过程为“调用-->等待被调用函数执行完毕-->继续执行”
对回调函数调用:
调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行。这样,调用程序和被调用函数同时在执行。当被调函数执行完毕后,被调函数会反过来调用某个事先指定函数,以通知调用程序:函数调用结束。这个过程称为回调(Callback),这正是回调函数名称的由来。
回调函数与普通函数的区别在于调用者不同。普通函数的调用是直接或者间接由main函数发起的。回调函数由系统发起调用,与main函数无关。
也就是说,官方提供的SDK,是内含一个系统的,而咱们的程序是在这个系统下运行。回到程序里,system_init_done_cb是调用程序,system_done是回调函数,而system_done内部又注册了一个回调函数,实现了一个定时输出hello world的功能。
程序是直接就能用的,咱们编译看一下。鼠标右键点击左侧工程栏里的esp8266_helloworld,在弹出的页面先点击:Clean Project,执行完成之后,再点击Build Project。编译完成之后,下方的输出框会有类似信息输出:
这里生成的是bin文件,而不是hex文件。注意user1.2048.new.3.bin生成的位置,在工程目录下的bin/upgrade里。
这里说一下,编译器生成的bin文件,根据Makefile里面的配置不同,分为两种:一种是不支持云端升级的,一种是支持云端升级的。Makefile如何配置,后面会讲,这一节主要说和下载相关的东西。
使用乐鑫提供的下载工具,链接如下:
https://wiki.ai-thinker.com/_media/esp8266/flash_download_tools_v3.6.4.rar
同时要准备一个串口助手,用来显示接收到的信息。
注意:串口助手的波特率要能支持78400.
下载软件打开后如图所示:
选择最上面的按钮,点击,弹出下面的工具框:
第一次使用这个工具的人,看到上图可能会有点懵!因为我同时选中了四个bin文件,这就意味着要给芯片烧录四个文件。和单片机的程序烧录不一样,单片机一般一次只烧一个hex文件,而这里,根据配置不同,你可能一次要烧录4~5个bin文件。
怎么回事?
这几个文件里面,有两个是编译器编译生成的,有2~3个是SDK里面自带的(包括系统参数和启动程序),如果同时有多个版本,建议使用最新版。
参照下面的截图,以及上面生成bin文件的截图,可以知道当前程序是支持云端升级的模式,需要下载5个bin文件。
同时,你会发现,根据flash的大小不同,即便是同一个文件,它的烧录地址也有可能不同。具体如何配置,参照上图。
注意:虽然上图给出了eagle.irom0test.bin、user1.bin、user2.bin这三个文件在不同flash下的地址,但是每次编译器编译完成后,会再次输出分配好的地址。这里以编译器输出地址为主。
那么,怎么知道你的ESP8266的FLASH是多大空间?依然参照截图,安信可不同型号的模块,flash的大小都在这里表明了。
注意:flash大小的单位是bit,不是byte。意味着,32Mbit=4Mbyte。
打开工程文件所在路径(这是我的路径,你要找你的):
C:\AiThinkerIDE_V0.5\cygwin\home\aithinker\project\esp8266_helloworld\bin\upgrade
你会发现只有一个user1.2048.new.3.bin,它对应上图中的user1.bin,是咱们要的,剩下四个文件都没有!不要急,看上面的截图你会找到提示:由乐鑫在SDK中提供。
所以找到ESP8266_NONOS_SDK,打开路径:
C:\AiThinkerIDE_V0.5\cygwin\home\aithinker\project\ESP8266_NONOS_SDK\bin
你会发现你要的这都有了:
boot.bin有两个,一个是1.2版本,一个是1.6版本,尽量用新的。但是,还有个问题,user2.bin在哪?笔者推测,这是因为hello world这个程序代码量太小,所以没有生成这么多需要烧录的bin文件,因此空着就行。
我们对下载软件进行配置,SPI SPEED,SPI MODE,这两个位置参照截图里的配置,SPI FLASH一定要根据你手里的模块选择。每个bin文件的下载地址一定要写对,否则程序无法正常运行。
注意:SPI MODE这里,它表示的其实是ESP8266芯片和flash芯片的连接方式,一般以DOUT和QIO居多。如果你不确定,建议你的模块买回来之后,先不要烧程序,先上电看一下串口打印的信息,里面有说明。如下所示:
硬件连接方面,使用一条USB转串口线,一端连接你的ESP8266模块,另一端连接电脑,根据电脑里显示的端口号选择串口号。玩过单片机的应该都懂,如果不会,重新学一下基础。
同时,官方要求把GPIO0和GPIO15管脚拉低,GPIO2置高。但是笔者在使用过程中发现,只要把GPIO0和GPIO15接到GND,其它管脚悬空即可。
然后,先点击软件上的START按钮,再给模块供电,这时模块自动进入下载过程(有点像STC的冷启动)。如果无法下载,建议多尝试几次,或者参照安信可的网站内容。
下载完成后,要把GPIO0悬空,否则无法正常工作,同时给模块重新上电,可以看到串口输出相关信息:
ets Jan 8 2013,rst cause:2, boot mode:(3,7)
load 0x40100000, len 2408, room 16
tail 8
chksum 0xe5
load 0x3ffe8000, len 776, room 0
tail 8
chksum 0x84
load 0x3ffe8310, len 632, room 0
tail 8
chksum 0xd8
csum 0xd8
2nd boot version : 1.6
SPI Speed : 40MHz
SPI Mode : DOUT
SPI Flash Size & Map: 16Mbit(512KB+512KB)
jump to run user1 @ 1000
rf cal sector: 507
rf[112] : 00
rf[113] : 00
rf[114] : 01
SDK ver: 2.0.0(656edbf) compiled @ Jul 19 2016 17:58:40
phy ver: 1055, pp ver: 10.2
SDK version:2.0.0(656edbf) , Compile time:Jul 5 2019 14:34:40
mode : softAP(5e:cf:7f:c3:f1:49)
add if1
dhcp server start:(ip:192.168.4.1,mask:255.255.255.0,gw:192.168.4.1)
bcn 100
[2019-07-05 15:02:42.575]# RECV ASCII>
Hello world !
Hello world !
其中的“SDK version:2.0.0(656edbf) , Compile time:Jul 5 2019 14:34:40”对应user_init函数里前两行打印的信息。而下面,每隔3秒,串口会打印一个“hello world”并换行!
注意,串口波特率要设置为78400。本片教程主要参照乐鑫的文档:3a-esp8266_sdk_flash_tool_user_guide_cn_v1.0,以及安信可网址:
https://wiki.ai-thinker.com/esp_download
https://wiki.ai-thinker.com/esp8266