授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。
共同学习成长QQ群 622368884,不喜勿加,里面有一大群志同道合的探路人
快速导航
单片机菜鸟的博客快速索引(快速找到你要的)
如果觉得有用,麻烦点赞收藏,您的支持是博主创作的动力。
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开发流程。
ESP8266 Hardware Development Kit(HDK)包括芯片 ESP8266EX、ESP8266模组以及 ESP8266开发板(比如NodeMcu)等硬件设备。用户使用烧录工具下载编译好的固件到硬件设备上。
ESP8266 Software Development Kit(SDK)是乐鑫为开发者提供的物联网(IOT)应用开发平台,包括基础平台以及上层应用开发示例等。
SDK的基础平台按照是否基于操作系统可分为:Non-OS 和 RTOS 两个版本。
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。
绝大部分的工具都在 开发工具清单 下载。
我们主要用到的工具包括:
开发环境
一种方式是通过Linux操作系统,这种我们不讲;
一种方式是通过安装 安信可一体化开发环境,可以在Window操作系统上使用,也是我们极度推荐;
固件下载工具
ESP8266 DOWNLOAD TOOL 工具是由乐鑫官方开发的固件下载工具,用户可根据实际的编译方式和 Flash 的容量,将多个 BIN 文件一键下载到 ESP8266 母板(开发板或者模
组)的 SPI Flash 中。
串口调试工具
串口调试工具可以通过标准 RS-232 端口直接与 ESP8266 建立通信。对于不带有物理理串口的 PC,可以使用 USB 转串口模块来虚拟出一个串口设备。用户可以直接在串口终端输入命令和实时查看相关打印信息。
以上开发工具我都上传了一份到我个人QQ群的群文件里。
请读者自行下载以上所有工具。
我们本系列主要是讲 Non-OS SDK的开发,那么首先第一步肯定要下载 SDK 文件。
SDK 下载地址:https://github.com/espressif/ESP8266_NONOS_SDK/releases
记住,该SDK是不断迭代开发,到博主写本篇博文为止最新版本:
而据我了解,目前用得比较多就是 v2.2.0 和 v3.0.0 版本。
找到对应版本的这里:
下载 Source Code,这里就可以下载下来 SDK 开发包。
documents:SDK 相关的文档或链接。
driver_lib:外设驱动的库文件,如:UART、I2C 和 GPIO 等。后面我们会把这里重命名为 app目录开发我们的用户程序。
include:SDK 自带头文件,包含了了用户可使用的相关 API 函数及其他宏定义(包括各种网络操作、系统操作等),用户无需修改。需要用到什么功能我们就引入对应的头文件。
安信可 ESP 系列一体化开发环境是安信可科技为方便不熟悉linux平台下开发的广大用户而推出的基于 Windows + Cygwin + Eclipse + GCC 的综合 IDE 环境。
注意:eclipes的打开必须事先自行搭建 java 环境(JDK),因为eclipse是用 java开发的
由于博主是做Android开发的,所以默认是已经安装过JDK。
安信可一体化开发环境有以下特点:
下载地址:https://pan.baidu.com/s/1ffc71Zqiu44ww3FM-bG5WQ
至此,开发环境配置完毕。接下来:
初次启动完IDE之后,我们可以看到IDE自带了 SDK、官方案例等
这里自带的SDK目前是2.x版本,可以支持 1MB以下的 ESP8266(比如01系列);
默认情况下,初次安装完IDE之后,IDE会把空格显示出来,所以我们需要配置点环境,按照下面两图操作:
接下来开始编译第一个例子。
首先,我们这里使用最新版本的官方SDK 3.0版本,这里默认读者已经把SDK文件下载下来。
SDK文件博主已经上传到个人QQ交流群,需要的请自行去下载。
基于 Non-OS SDK的开发方式,意味着我们需要基于SDK文件去开发我们的项目,所以建立一个通用的 SDK模板代码是比较科学的,我们后面也可以基于这个模板工程去自定义个人项目。
当我们导入成功工程之后,让我们快速尝鲜,首次编译模板工程看看。
正常的编译步骤:
见证奇迹的时刻来了!!!!!!
继续看看编译结果
是不是有点慌????怎么出师不利,还没有开始玩就编译失败了?
别怕,慢慢解决它,哪里有问题就搞哪里。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
在SDK编程中,读者需要时刻牢记这是MakeFile编译。
重点的内容,博主强调三遍,请读者必须牢记于心。
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目录
在上面基础上,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吧。
上面我们做的过程是一个官方已经写好的示例代码,里面包含了非常多功能,接下来就让我们来构建最小运行SDK_Template,这才是真正意义上的模板工程。
除了Makefile之外,其他文件全部删掉,需要用到对应驱动模块时再添加进来
删除后效果图:
除了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
说白了,就是清空内容,剩下一个头文件就好。
这个文件夹里面的内容就是我们后面需要编写代码的地方了。
除了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工程。
拷贝一份 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");
}
该工程,博主也一并上传到群文件。
这里需要用到烧录工具 flash_download_tools_v3.6.6,博主也已经上传到个人qq技术交流群。
然后,接下来介绍一下SDK烧录(还记得我们属于no-Fota):
至于每个bin是什么意思?请读者往回翻翻吧。
NodeMcu对应以下烧录地址:
以管理员身份运行,烧录工具,选择 8266 SPI工具,填入相关文件:
或者有些读者就问了,怎么进入烧录模式?
请按照下图连接ESP8266-01和USB转TTL线,进入烧录模式:
如果WiFi模块是ESP8266-12系列,按照下图对应引脚接线:
温馨提示
烧录成功后,通过串口调试工具可以看到效果:
终于,我们完成了第一个例子 Hello World!Hello ESP8266 SDK。
初识 Non-OS SDK,史上超级详细手把手教小白10分钟快速搭建软件开发环境,完成第一个Hello World例子!
这是后面所有SDK编程的基础,后面不会重复,请认真思考加以实验。
如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。
如果觉得可以,麻烦狂点赞。