文章目录
- 1.前言
- 2. SDK概述
- 2.1 SDK使用流程
- 2.2 ESP8266 HDK —— 硬件开发工具
- 2.3 ESP8266 SDK —— 软件开发工具包
- 2.3.1 Non-OS SDK
- 2.3.2 RTOS SDK
- 2.4 ESP8266 FW
- 2.5 ESP8266 工具集
- 3. Non-OS SDK
- 3.1 下载 SDK
- 3.2 Non-OS SDK 目录结构
- 4. 软件环境搭建 —— 安信可一体化开发环境
- 4.1 简介
- 4.2 安装包下载
- 4.3 安装环境 IDE
- 5. SDK_Template模板工程
- 5.1 创建 SDK_Template
- 5.2 导入 SDK_Template
- 5.3 编译 SDK_Template
- 5.3.1 初次编译 SDK_Template —— 没办法,就是编译失败了
- 5.3.2 二次编译 SDK_Template
- 5.3.2.1 步骤1 先解决Clean Project的问题
- 5.3.2.2 步骤2 在解决 Build Project错误
- 5.4 构建SDK_Template,删除多余文件
- 5.4.1 处理driver文件夹
- 5.4.2 处理 include文件夹
- 5.4.3 处理user文件夹
- 5.4.4 最终SDK_Template
- 6.向世界 say Hello World!
- 6.1 01 Hello World
- 6.2 烧录Bin文件
- 7.总结
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
共同学习成长QQ群 622368884,不喜勿加,里面有一大群志同道合的探路人
快速导航
单片机菜鸟的博客快速索引(快速找到你要的)
如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。
1.前言
ESP8266EX芯片由espressif乐鑫公司开发,提供了一套高度集成的Wi-Fi SOC解决方案,其低功耗、紧凑设计和高稳定性可以满足用户的需求。
而ai-thinker 安信可公司基于 ESP8266EX芯片去设计了一系列ESP8266 模组(基本上我们现在说的ESP8266多是指 ESP8266模组)。这些模组包括:
具体可以参考 安信可ESP8266系列模组
而很多其他厂家又会基于 ESP8266系列模组 去设计 ESP8266开发板,其中使用广泛的就是基于 ESP-12F 模组的NodeMcu开发板:
这下子,初学者应该可以了解芯片-模组-开发板的关系了。
- 乐鑫开发芯片
- 安信可开发模组
- 其他厂家开发开发板
为了学习ESP8266编程,我们首选的开发板就是 NodeMcu Esp8266开发板。
而软件开发方式则分为几种:
-
AT指令
需要烧录AT固件,借助另外一款MCU进行控制,有点浪费ESP8266的天赋,后面博主专门写一个帖子专门介绍一下 -
Lua开发
据我了解不是很多人会去考虑的开发方式,有点杀马特的感觉,除非你之前已经懂Lua语言,不然不建议。 -
Arduino 开发
非常简单愉快的一种开发方式,非常适合具有Arduino基础的同学,博主也推出了一个专栏专门讲解 ESP8266 Arduino教程,极度推荐。 -
SDK开发
这也是官方极度推荐的开发方式,也是博主本系列重点关注的内容。 -
MicroPython开发
适合有Python开发基础的同学,不过更建议在ESP32上使用此种开发方式。
总体来说,我更推荐用Arduino开发或者SDK开发。接下来,就开始初步认识一下SDK开发流程。
2. SDK概述
2.1 SDK使用流程
包括:
- ESP8266 HDK —— 硬件开发工具
- ESP8266 SDK —— 软件开发工具包
- ESP8266 FW —— 固件
- ESP8266 工具集 —— 软件开发工具、固件下载工具和串口调试工具等
2.2 ESP8266 HDK —— 硬件开发工具
ESP8266 Hardware Development Kit(HDK)包括芯片 ESP8266EX、ESP8266模组以及 ESP8266开发板(比如NodeMcu)等硬件设备。用户使用烧录工具下载编译好的固件到硬件设备上。
2.3 ESP8266 SDK —— 软件开发工具包
ESP8266 Software Development Kit(SDK)是乐鑫为开发者提供的物联网(IOT)应用开发平台,包括基础平台以及上层应用开发示例等。
SDK的基础平台按照是否基于操作系统可分为:Non-OS 和 RTOS 两个版本。
2.3.1 Non-OS SDK
- Non-OS SDK 是不基于操作系统的SDK,提供IOT_demo和AT的编译。
- Non-OS SDK 主要使用定时器和回调函数的方式来实现各个功能事件的嵌套,达到特定条件下触发特定功能函数的目的。
- Non-OS SDK 使用espconn接口实现网络操作,用户需要按照espconn接口的使用规则进行软件开发。
2.3.2 RTOS SDK
- RTOS SDK基于FreeRTOS,引入OS多任务处理机制。
- 请读者自行去学习,不是我们目前的重点。
2.4 ESP8266 FW
ESP8266 Firmware(FW)是一些可以直接下载到ESP8266 HDK中的BIN文件,用户可以选择下载 Fireware Over-The-Air(FOTA,支持云端升级) 和 non-FOTA (不支持云端升级) 的BIN文件:
文件名字 | 说明 | Non-FOTA是否需要 | FOTA是否需要 | 备注 |
---|---|---|---|---|
esp_init_data_default.bin | 初始化射频参数,在 SDK 根⽬录中提供。 | 是 | 是 | |
blank.bin | 初始化系统参数,在 SDK 根⽬录中提供。 | 是 | 是 | |
eagle.flash.bin | 主程序,存放运行系统必要的固件。 | 是 | 否 | |
eagle.irom0.text.bin | 主程序,存放用户编写程序的固件。 | 是 | 否 | |
boot.bin | Bootloader,在 SDK 根目录中提供。 | 否 | 是 | |
user1.bin | 主程序,编译代码生成。 | 否 | 是 | 初次使用 |
user2.bin | 主程序,编译代码生成。 | 否 | 是 | 升级使用 |
==读者需要注意区分 Non-FOTA 和 FOTA 分别需要烧录哪些文件。==我们这里重点关注 Non-FOTA。
2.5 ESP8266 工具集
绝大部分的工具都在 开发工具清单 下载。
我们主要用到的工具包括:
-
开发环境
一种方式是通过Linux操作系统,这种我们不讲;
一种方式是通过安装 安信可一体化开发环境,可以在Window操作系统上使用,也是我们极度推荐; -
固件下载工具
ESP8266 DOWNLOAD TOOL 工具是由乐鑫官方开发的固件下载工具,用户可根据实际的编译方式和 Flash 的容量,将多个 BIN 文件一键下载到 ESP8266 母板(开发板或者模
组)的 SPI Flash 中。 -
串口调试工具
串口调试工具可以通过标准 RS-232 端口直接与 ESP8266 建立通信。对于不带有物理理串口的 PC,可以使用 USB 转串口模块来虚拟出一个串口设备。用户可以直接在串口终端输入命令和实时查看相关打印信息。
以上开发工具我都上传了一份到我个人QQ群的群文件里。
请读者自行下载以上所有工具。
3. Non-OS SDK
我们本系列主要是讲 Non-OS SDK的开发,那么首先第一步肯定要下载 SDK 文件。
3.1 下载 SDK
SDK 下载地址:https://github.com/espressif/ESP8266_NONOS_SDK/releases
记住,该SDK是不断迭代开发,到博主写本篇博文为止最新版本:
而据我了解,目前用得比较多就是 v2.2.0 和 v3.0.0 版本。
找到对应版本的这里:
下载 Source Code,这里就可以下载下来 SDK 开发包。
3.2 Non-OS SDK 目录结构
解压上面的SDK Zip包,可以得到以下结构:
-
bin:编译生成的 BIN 文件,可直接下载到 Flash 中。(最终需要通过固件烧录工具烧录到ESP8266)。
-
documents:SDK 相关的文档或链接。
-
driver_lib:外设驱动的库文件,如:UART、I2C 和 GPIO 等。后面我们会把这里重命名为 app目录开发我们的用户程序。
-
examples:可供用户二次开发的示例代码,如 IoT Demo 、smartconfig等。
-
include:SDK 自带头文件,包含了了用户可使用的相关 API 函数及其他宏定义(包括各种网络操作、系统操作等),用户无需修改。需要用到什么功能我们就引入对应的头文件。
-
ld:链接时所需的脚本文件(包括定义各种内存定义,dram、iram、irom等),若无特殊需求,用户无需修改。
-
lib:SDK 提供的库文件(这就是乐鑫官方牛逼的地方,封装好了各种方法调用)。
-
third_party:第三方库,可以忽略
-
tools:编译 BIN 文件所需的⼯工具,用户无需修改。这里通过makefile来编译我们的代码生成固件。
4. 软件环境搭建 —— 安信可一体化开发环境
安信可 ESP 系列一体化开发环境是安信可科技为方便不熟悉linux平台下开发的广大用户而推出的基于 Windows + Cygwin + Eclipse + GCC 的综合 IDE 环境。
注意:eclipes的打开必须事先自行搭建 java 环境(JDK),因为eclipse是用 java开发的
由于博主是做Android开发的,所以默认是已经安装过JDK。
4.1 简介
安信可一体化开发环境有以下特点:
- 支持ESP8266 NONOS和FreeRTOS环境开发(新版 ESP8266 RTOS SDK V3.0以上版本)
- 支持ESP32 FreeRTOS环境开发
- 下载即用,无需另外配置环境
- 可直接编译乐鑫官方推出的SDK开发包
- 图形化界面开发
4.2 安装包下载
下载地址:https://pan.baidu.com/s/1ffc71Zqiu44ww3FM-bG5WQ
安装包内容:
4.3 安装环境 IDE
- 点击上面的 AiThinkerIDE_V1.0.exe 安装,注意安装路径中不要有中文或者空格
- 博主安装到D盘根目录,等待安装完成
- 安装完成后,请不要打开 IDE,先找到安装路径,并且以管理员方式运行ConfigTool.exe配置程序,此配置程序只需要运行一次即可,之后就不需要在运行
不需要点任何地方,直接点击Default,然后点击Save,Config就会自动关闭保存当前配置。
Eclipse Path路径为 eclipse.exe 所在的路径;
Cygwin Path路径为 编译器路径;
IDF Path路径暂时没懂怎么用;
至此,开发环境配置完毕。接下来:
-
找到刚才的安装路径,启动 IDE,这里建议读者建立桌面快捷方式:
-
初次启动完IDE之后,我们可以看到IDE自带了 SDK、官方案例等
这里自带的SDK目前是2.x版本,可以支持 1MB以下的 ESP8266(比如01系列); -
默认情况下,初次安装完IDE之后,IDE会把空格显示出来,所以我们需要配置点环境,按照下面两图操作:
点击Apply即可。
- 为了更好地讲解 Hello World,我们先将IDE自带的SDK和官方案例全部delete掉
感觉整个世界都很清静!!!!!!!
接下来开始编译第一个例子。
5. SDK_Template模板工程
首先,我们这里使用最新版本的官方SDK 3.0版本,这里默认读者已经把SDK文件下载下来。
SDK文件博主已经上传到个人QQ交流群,需要的请自行去下载。
基于 Non-OS SDK的开发方式,意味着我们需要基于SDK文件去开发我们的项目,所以建立一个通用的 SDK模板代码是比较科学的,我们后面也可以基于这个模板工程去自定义个人项目。
5.1 创建 SDK_Template
- 解压 ESP8266_NONOS_SDK-3.0 zip包
- 重命名文件夹名为 SDK_Template(后面所有的代码都基于这个最基本的模板代码)。
5.2 导入 SDK_Template
- 步骤1
- 步骤2
- 步骤3
- 导入成功
5.3 编译 SDK_Template
5.3.1 初次编译 SDK_Template —— 没办法,就是编译失败了
当我们导入成功工程之后,让我们快速尝鲜,首次编译模板工程看看。
正常的编译步骤:
- Clean Project
- Build Project
见证奇迹的时刻来了!!!!!!
-
Clean Project
看看Clean结果,可以看到Make Clean出问题了。
其实,出现这个页面,基本上不用编译了,不过为了看效果,还是编译一下吧。 -
Build Project
继续看看编译结果
是不是有点慌????怎么出师不利,还没有开始玩就编译失败了?
别怕,慢慢解决它,哪里有问题就搞哪里。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
重点的内容,博主强调三遍,请读者必须牢记于心。
5.3.2 二次编译 SDK_Template
5.3.2.1 步骤1 先解决Clean Project的问题
请往上翻阅我们刚才说到的各个目录的作用。
-
third_party:第三方库,可以忽略
将hird_party/makefile 重命名为 makefile.bak
再次,Clean一下工程看看:
完美,解决third_party问题。 -
driver_lib:外设驱动的库文件,如:UART、I2C 和 GPIO 等。后面我们会把这里重命名为 app目录开发我们的用户程序。
将 driver_lib 目录重命名为 app,重新clean project,错误又不一样了。
这里是说,我们没有这个user目录,所以执行不了 user clean。
解决方法:
找到 官方事例 IOT_Demo,拷贝所有的文件,粘贴覆盖到app目录
再次,clean工程
5.3.2.2 步骤2 在解决 Build Project错误
在上面基础上,Build Project
打开 SDK_Template/app/user/user_main.c 文件看看这个错误是什么来的?
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#else
#error "The flash map is not supported"
#endif
这里意思就是 SPI_FLASH_SIZE_MAP 很可能被配置成了 0 或者 1。
SPI_FLASH_SIZE_MAP 是个什么鬼?
enum flash_size_map {
FLASH_SIZE_4M_MAP_256_256 = 0, /**< Flash size : 4Mbits. Map : 256KBytes + 256KBytes */
FLASH_SIZE_2M = 1, /**< Flash size : 2Mbits. Map : 256KBytes */
FLASH_SIZE_8M_MAP_512_512 = 2, /**< Flash size : 8Mbits. Map : 512KBytes + 512KBytes */
FLASH_SIZE_16M_MAP_512_512 = 3, /**< Flash size : 16Mbits. Map : 512KBytes + 512KBytes */
FLASH_SIZE_32M_MAP_512_512 = 4, /**< Flash size : 32Mbits. Map : 512KBytes + 512KBytes */
FLASH_SIZE_16M_MAP_1024_1024 = 5, /**< Flash size : 16Mbits. Map : 1024KBytes + 1024KBytes */
FLASH_SIZE_32M_MAP_1024_1024 = 6, /**< Flash size : 32Mbits. Map : 1024KBytes + 1024KBytes */
FLASH_SIZE_32M_MAP_2048_2048 = 7, /**< attention: don't support now ,just compatible for nodemcu;
Flash size : 32Mbits. Map : 2048KBytes + 2048KBytes */
FLASH_SIZE_64M_MAP_1024_1024 = 8, /**< Flash size : 64Mbits. Map : 1024KBytes + 1024KBytes */
FLASH_SIZE_128M_MAP_1024_1024 = 9 /**< Flash size : 128Mbits. Map : 1024KBytes + 1024KBytes */
};
其实就是flash内存映射关系。
接下来,我们去MakeFile里面找找跟flash Map有关的配置。
打开这个文件,找到这几行配置(博主加了注释,这几行配置非常重要):
=none - 不使用boot
=old - 使用老版本的boot_v1.1+
=new - 使用新版本的boot_v1.2+
BOOT?=none
=0 - 不使用远程升级FOTA
=1 - 使用FOTA,生成user1.<flash_map>.<BOOT>.bin
=2 - 使用FOTA,生成user2.<flash_map>.<BOOT>.bin
APP?=0
SPI速率和模式,一般不用改动
SPI_SPEED?=40
SPI_MODE?=QIO
SPI_SIZE_MAP flash映射方式
1MB Flash使用 SPI_SIZE_MAP?=2
4MB Flash使用 SPI_SIZE_MAP?=4
SPI_SIZE_MAP?=0
这下明白了吧,需要根据具体的flash映射改成不同的值,如果是01,我们改成 2,如果是12系列,我们可以改成4以上。博主因为是NodeMcu,属于12系列,所以改成 4吧。
再次编译,查看结果。
没错,编译成功了!!!!!
5.4 构建SDK_Template,删除多余文件
上面我们做的过程是一个官方已经写好的示例代码,里面包含了非常多功能,接下来就让我们来构建最小运行SDK_Template,这才是真正意义上的模板工程。
5.4.1 处理driver文件夹
除了Makefile之外,其他文件全部删掉,需要用到对应驱动模块时再添加进来
删除后效果图:
5.4.2 处理 include文件夹
除了user_config.h文件(为什么剩下它,因为其他文件应用到它了)之外,其他文件全部删除,需要用到对应驱动模块时再添加进来
删除后效果图:
然后,修改user_config.h 的内容成下面这样:
/*
* ESPRESSIF MIT License
*
* Copyright (c) 2016
*
* Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
* it is free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#ifndef __USER_CONFIG_H__
#define __USER_CONFIG_H__
#endif
说白了,就是清空内容,剩下一个头文件就好。
5.4.3 处理user文件夹
这个文件夹里面的内容就是我们后面需要编写代码的地方了。
除了user_main.c和makefile之外,其他文件全部删掉,需要用到对应驱动模块时再添加进来。
删除后效果:
然后修改user_main.c 的内容如下:
/*
* ESPRESSIF MIT License
*
* Copyright (c) 2016
*
* Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
* it is free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#else
#error "The flash map is not supported"
#endif
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM SYSTEM_PARTITION_CUSTOMER_BEGIN
static const partition_item_t at_partition_table[] = {
{ SYSTEM_PARTITION_BOOTLOADER, 0x0, 0x1000},
{ SYSTEM_PARTITION_OTA_1, 0x1000, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_OTA_2, SYSTEM_PARTITION_OTA_2_ADDR, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
{ SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
{ SYSTEM_PARTITION_SYSTEM_PARAMETER, SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
{ SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM, SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR, 0x1000},
};
void ICACHE_FLASH_ATTR user_pre_init(void)
{
if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
os_printf("system_partition_table_regist fail\r\n");
while(1);
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
// 官方入口函数
}
这里只剩下 user_pre_init 和 user_init这两个必须的方法。并且里面 user_pre_init 里面的内容不要删除。
以上可以概述 SDK下的 运行模型:
{
//8266内核初始化;
user_pre_init();
user_init();
while(1){
// 执行内核功能
// 执行用户功能(涉及到回调函数)
}
}
弄完以上操作之后,重新编译工程,如果没有操作错误。这就是我们需要的SDK_Template工程。
5.4.4 最终SDK_Template
此模板工程,博主已经上传到个人QQ群文件。
6.向世界 say Hello World!
6.1 01 Hello World
拷贝一份 SDK_Template,重命名为 01 Hello World。用IDE导入该工程。
然后修改 user_main,c文件如下:
/*
* ESPRESSIF MIT License
*
* Copyright (c) 2016
*
* Permission is hereby granted for use on ESPRESSIF SYSTEMS ESP8266 only, in which case,
* it is free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished
* to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#include "ets_sys.h"
#include "osapi.h"
#include "user_interface.h"
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0xfb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0xfc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 3)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 4)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x81000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0x7c000
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x1fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x1fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x1fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0x6A000
#define SYSTEM_PARTITION_OTA_2_ADDR 0x101000
#define SYSTEM_PARTITION_RF_CAL_ADDR 0x3fb000
#define SYSTEM_PARTITION_PHY_DATA_ADDR 0x3fc000
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR 0x3fd000
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 0xfc000
#else
#error "The flash map is not supported"
#endif
#define SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM SYSTEM_PARTITION_CUSTOMER_BEGIN
static const partition_item_t at_partition_table[] = {
{ SYSTEM_PARTITION_BOOTLOADER, 0x0, 0x1000},
{ SYSTEM_PARTITION_OTA_1, 0x1000, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_OTA_2, SYSTEM_PARTITION_OTA_2_ADDR, SYSTEM_PARTITION_OTA_SIZE},
{ SYSTEM_PARTITION_RF_CAL, SYSTEM_PARTITION_RF_CAL_ADDR, 0x1000},
{ SYSTEM_PARTITION_PHY_DATA, SYSTEM_PARTITION_PHY_DATA_ADDR, 0x1000},
{ SYSTEM_PARTITION_SYSTEM_PARAMETER, SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR, 0x3000},
{ SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM, SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR, 0x1000},
};
void ICACHE_FLASH_ATTR user_pre_init(void)
{
if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
os_printf("system_partition_table_regist fail\r\n");
while(1);
}
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
os_printf("Hello World!单片机菜鸟哥\r\n");
}
编译工程,如无意外会成功生成bin文件。
该工程,博主也一并上传到群文件。
6.2 烧录Bin文件
这里需要用到烧录工具 flash_download_tools_v3.6.6,博主也已经上传到个人qq技术交流群。
然后,接下来介绍一下SDK烧录(还记得我们属于no-Fota):
至于每个bin是什么意思?请读者往回翻翻吧。
NodeMcu对应以下烧录地址:
以管理员身份运行,烧录工具,选择 8266 SPI工具,填入相关文件:
或者有些读者就问了,怎么进入烧录模式?
- 参考 ESP8266开发之旅 基础篇② 如何安装ESP8266的Arduino开发环境
- 或者参考下面:
烧录固件模式
请按照下图连接ESP8266-01和USB转TTL线,进入烧录模式:
如果WiFi模块是ESP8266-12系列,按照下图对应引脚接线:
温馨提示
- 从Arduino IDE角度来看,ESP8266工作模式包括:
1.烧录固件模式
下载代码的时候,需要将GPIO0口接地;
2.正常工作模式
下载完代码,需要将GPIO0口悬空;
有电路经验的读者可以安装拨码开关来切换工作模式。 - 注意ESP8266安全工作电压是3.3V,不要直接连接5v;
- 手动切换工作模式之后,最好重新启动一下ESP8266模块(通断电);
- 有时ESP8266下载失败,有可能是供电问题,可以尝试独立供电,不直接连到TTL Vcc;
- 烧录固件,我们需要了解的是,我们的固件是以下哪一种:AT固件、自己编写的SDK固件(基于ESP8266 SDK开发或者Lua)以及基于Arduino平台开发的ESP8266固件(笔者成为 ESP8266 Arduino固件)。
烧录成功后,通过串口调试工具可以看到效果:
这里需要注意,如果不改波特率,模块的波特率是 74880.
终于,我们完成了第一个例子 Hello World!Hello ESP8266 SDK。
7.总结
初识 Non-OS SDK,史上超级详细手把手教小白10分钟快速搭建软件开发环境,完成第一个Hello World例子!
这是后面所有SDK编程的基础,后面不会重复,请认真思考加以实验。
如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。