ESP8266_02程序的编译与下载

2020-06-29 11:30:30 浏览数 (1)

这一节主要看下如何对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.5cygwinhomeaithinkerprojectesp8266_helloworldbinupgrade

你会发现只有一个user1.2048.new.3.bin,它对应上图中的user1.bin,是咱们要的,剩下四个文件都没有!不要急,看上面的截图你会找到提示:由乐鑫在SDK中提供。

所以找到ESP8266_NONOS_SDK,打开路径:

C:AiThinkerIDE_V0.5cygwinhomeaithinkerprojectESP8266_NONOS_SDKbin

你会发现你要的这都有了:

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置高。

然后,先点击软件上的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

0 人点赞