ESP8266 Non-OS SDK 开发之旅 基础篇① 初识 Non-OS SDK,史上超级详细手把手教小白20分钟快速搭建SDK软件开发环境,完成第一个例子Hello World!

文章目录

    • 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.总结

ESP8266 Non-OS SDK 开发之旅 基础篇① 初识 Non-OS SDK,史上超级详细手把手教小白20分钟快速搭建SDK软件开发环境,完成第一个例子Hello World!

授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

共同学习成长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-OSRTOS 两个版本。

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.binBootloader,在 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.0v3.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等。

  • includeSDK 自带头文件,包含了了用户可使用的相关 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编程的基础,后面不会重复,请认真思考加以实验。

如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/74472.html