ESP8266_02程序的编译与下载

本文介绍ESP8266开发环境搭建、程序编译与下载流程,涵盖开发工具配置、bin文件生成及下载注意事项,适用于初学者快速入门。

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

 

### ESP8266 头文件定义和用法 对于 ESP8266 的开发,通常会使用特定的头文件来管理模块的功能实现以及配置选项。以下是有关 `#ifndef __ESP8266_H` 定义及其用途的相关说明。 #### 1. 防重复包含机制 在 C/C++ 中,为了防止同一个头文件被多次包含而导致编译错误,通常会在头文件中加入防重复包含宏。这种结构如下所示: ```c #ifndef __ESP8266_H #define __ESP8266_H // 文件中的内容声明 #endif /* __ESP8266_H */ ``` 此代码片段的作用是在第一次包含该头文件时定义宏 `__ESP8266_H`,从而阻止后续对该文件的再次包含[^3]。 #### 2. 常见功能声明 在一个典型的 ESP8266 头文件中,可能会有以下几种常见的功能声明或定义: - **外设初始化函数** 这些函数用于设置硬件资源,例如 GPIO、UART 或 SPI 接口等。 ```c void esp8266_init(void); ``` - **网络连接接口** 提供 Wi-Fi 和 TCP/IP 协议栈的支持,允许设备通过无线方式接入互联网。 ```c int esp8266_connect_wifi(const char *ssid, const char *password); int esp8266_send_data(const uint8_t *data, size_t length); ``` - **中断处理程序** 如果涉及到外部事件触发,则可能需要注册相应的中断服务例程 (ISR)。 ```c void esp8266_handle_interrupt(void); ``` - **常量枚举类型** 可能还会定义一些全局使用的参数或者状态码以便于统一管理和调用。 ```c typedef enum { ESP8266_OK, ESP8266_ERROR_TIMEOUT, ESP8266_ERROR_INVALID_PARAM } Esp8266_Status; ``` 以上仅为假设性的例子,在实际项目里具体的内容取决于开发者的设计需求和技术路线选择[^4]。 #### 3. 使用方法示例 下面给出一段简单的演示如何利用上述提到的部分 API 来完成基本操作的例子: ```c #include "esp8266.h" int main() { // 初始化 ESP8266 模块 esp8266_init(); // 尝试连接到指定 SSID 的 WiFi 网络 if (esp8266_connect_wifi("MyWiFi", "Password123") != ESP8266_OK) { printf("Failed to connect to WiFi network.\n"); return -1; } printf("Connected successfully!\n"); while (true) { static uint8_t message[] = { 'H', 'e', 'l', 'l', 'o' }; esp8266_send_data(message, sizeof(message)); delay(5000); // 发送数据间隔时间设定为五秒 } } ``` 这段伪代码展示了从初始化到建立网络链接再到周期性发送消息的整体流程[^5]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值