ESP-12F
一、ESP866flash读写
1.ESP8266读写接口
Flash擦除的最小单位是一个扇区,一个sector是4KB,从扇区0开始计数。
注意:
- Flash先擦除后写入
- Flash读写必须4个字节对齐
示例代码:
uint32 data[M]
// TODO:fit in the data
api_flash_erase_sector(N);
api_flash_write(N*4*1024,data,M*4);
返回值:
Typedef enum{
SPI_FLASH_RESULTT_OK,
SPI_FLASH_RESULT_ERR.
SPI_FLASH_RESULT_TIMEOUT
}SpiFlashOpResult;
1.1 spi_flash erase_sector
1.2 spi_flash_write
1.3 spi_flash_read
2、 Flash layout
2.1 Flash三个区域的划分:
2.1.1 程序区
代码编译生成的bin文件,烧录到Flash占用的区域,勿改写
2.1.2 系统参数区
** esp_iot_sdk中底层用于存放系统参数的区域,勿改写**
2.1.3 用户参数区
** 上层应用程序存储用户参数的区域。由实际Flash size设置**
2.2 none boot(软件不支持云端升级)
注意:
- 程序区仅表明起始位置,Flash占用空间由编译烧录的bin大小决定。
- esp_init_data_default.bin:位于Flash倒数第4个sector
- blank.bin:位于Flash倒数第2个sector
2.3 boot(软件支持云端升级)
注意:
- 程序区仅表明起始位置,Flash占用空间由编译烧录的bin大小决定。
- esp_init_data_default.bin:位于Flash倒数第4个sector
- blank.bin:位于Flash倒数第2个sector
3、 Flash读写保护机制
3.1 Flash读写保护介绍
Flash擦写流程是:先擦除整个扇区,再将该扇区的数据写回去。
保护示例解决问题:若扇区在擦写过程中突然断电,就可能导致该扇区的数据丢失。因此需要Flash读写保护机制。
在ESP8266_NONOS_SDK的IOT_Demo中user_esp_platform.c提供了Flash读写保护的示例
3.2 Flash读写保护实现原理
使用三个sector实现,将sector1和sector2作为数据sector,轮流读写,分为存放“本次”数据和“前一次”数据,sector3作为flag sector标志最新的数据存储sector。
其中:只有数据扇区sector1和sector2写完以后,才会写flag sector(sector3)
3.3 软件示例
IOT_Demo中,使用0X3C000开始的4个sector,作为用户参数存储区。0x3D000、0x3E000、0x3F000这3个sector实现了读写保护的功能,并存储了应用级参数esp_platform_saved_param
对于“有读写保护的存储区”的内存空间,通过调用user_esp_platform_load_param和user_esp_platform_save_param进行读写
- user_esp_platform_load_param —— 读Flash用户参数区数据
- user_esp_platform_save_param —— 写Flash用户参数区数据
**使用方式:参数struct esp_platform_saved_param定了目前乐鑫存储于Flash的用户级数据,用户可以直接将要存储的数据添加到结构体struct esp_platform_saved_param后面,调用spi_flash_write和spi_flash_read两个函数读写即可。
3.4 其他存储保护建议
3.4.1 Flash读写保护参考一
3.4.2 Flash读写保护参考二
参考:ESP8266flash读写说明
二、ESP-12F电路设计
1. 产品概述
ESP-12F由安可信科技开发的WI-FI模块,该模块核心处理器ESP8266是一款Tensilica L106超低功耗32位微型MCU,支持,标准的IEEE802.11 b/g/n协议,完整的TCP/IP协议栈。
内部系统框图如下:
2. 特性
3. 管脚定义
ESP-12F模组共接出16个接口
脚序 | 名称 | 功能说明 |
---|---|---|
1 | RST | 复位 |
2 | ADC | A/D转换接口。输入电压范围01V,取值范围:01024 |
3 | EN | 芯片使能,高电平有效 |
4 | IO16 | GPIO16,接到RST管脚可做deep sleep的唤醒 |
5 | IO14 | GPIO14/HSPI_CLK |
6 | IO12 | GPIO12/HSPI_MISO |
7 | IO13 | GPIO13/HSPI_MOSI/UART0_CTS |
8 | VCC | 3.3V供电,外部供电电源输出电流500mA以上 |
9 | GND | 接地 |
10 | IO15 | GPIO15/MTDO/HSPICS/UART0_CTS |
11 | IO2 | GPIO2/UART1_TXD |
12 | IO0 | GPIO0;下载模式:外部拉低,运行模式:悬空或外部拉高 |
13 | IO4 | GPIO4 |
14 | IO5 | GPIO5/TR_R |
15 | RXD | UART0_RXD/GPIO3 |
16 | TXD | UART0_TXD/GPIO1 |
4. 原理图
注意:
- 模组外围电路GPIO0必须上拉到VCC,GPIO15必须下拉到GND
- EN脚和RST脚必须上拉到VCC
- 模组的Pin9-Pin14不可用
5. 推荐模组封装设计尺寸
6. GPIO的使用
参考:ESP-12F产品规格书
三、ESP8266 Wi-Fi信道的选择
1. 介绍
ESP8266可以作为无线网卡用于嵌入式系统以实现设备的联网或D2D通信,可以作为主芯片独立运行并执行应用代码。
ESP8266内置了网络协议栈和整个射频电路,可以通过一组API或指令控制网络硬件,API和指令不会根据设备所处位置区分信道,因此需要合理的分配信道。IEEE802.11为ISM频段中低功率Wi-Fi通信定义了14个信道。
2. 信道选择
在wifi网络中,对无线设备配置时注意影响到物理层的属性。其中乐鑫提供的API支持自主选择信道。ESP8266支持的802.11 b/g/n标准工作在ISM(免执照)频段,范围为2400~2484MHz。
对信道设置考虑注意事项如下:
- 信道干扰
- 合法性
- FCC规定和发射功率
2.1 信道干扰
- 不同信道之间的频段间隔:相邻两个信道中心频段间隔为5MHz。其中信道13和信道14的中心频率间隔为12MHz。
- 相邻两个信道不造成干扰的条件:每个信道通常需要20MHz的带宽,如果要获得最佳无限性能,则设置为25MHz。
当两个发射器在同一无线空域内工作并有可能产生干扰时,将信道间隔设置为20MHz以上最好。
2.2 合法性
发射器的工作频段要符合所在国的频率划分,前几个信道在大多数国家都可以使用,使用后几个信道时必须谨慎,如果发射器偏离了设定的频段,则可能与相邻的有执照/限制的信道产生干扰。
2.3 FCC规定和发射功率
FCC规定ISM频段设备最大发射功率为30dBm。ESP8266发射器的输出功率最大为20dBm
总结:通过确保在某些情况下的设备运行不受干扰,可提升传输速率。
参考:ESP8266WIFI信道选择指南
四、 固件下载
1. 介绍
1.1 硬件准备
硬件设置如下图:
硬件连接如下图:
1.2 下载流程
- 同步:发送同步帧同步波特率
- 擦除数据:根据下载的固件大小和下载地址擦除flash响应 e
- 发送数据:将固件封装成多帧发送给ESP8266
- 发送接受帧:发送下载结束帧给ESP8266
2. 传输协议
传输协议采用串联线路网际网路协议(SLIP)封装格式
- 每个数据包以0XC0开始和结束。
- 0xC0若出现在数据包中,将0xC0替换成两个字节0xDB 0xDC;
- 0xDB若出现在数据包,则替换成0xDB 0xDD。
- 所有数据帧中,数据包由数据头和长度不定的数据体组成
- 所有多字节字段的存储模式均为小端模式
2.1 数据头
2.2 数据体
数据体的word0-word3是描述数据体的,不同的数据指令其描述也不同。
3. 固件格式
固件 包含 文件头和数量可变的数据块。且所有多字节字段的存储模式均为小端模式。
、
文件头格式如下表:
4. 编程示例
4.1 效验和
uint32_t espcomm_colc_checkssum(unsigned char *data,uint16_t data_size)
{
uint16_t cnt;
uint32_t result;
result = oxEF;
for(cnt = 0;cnt < data_size;cnt++)
{
result ^= data[cnt];
}
return result;
}
4.2 擦除flash
#define BLOCKSIZE_FLASH 0x400
#define FLASH_DOWNLOAD_BEGIN 0x02
uint32 flash_pocket[];
int erase_flash(uint32_t size,uint32_t address)
{
const int sector_size = 4096;
const int sector_per_block = 16;
const int first_sector_index = address / setor_size;
const int total_sector_count = ((size % sector_size) == 0)?
(size / sector_size):(size / sector_size +1 );
const int max_head_sector_count = sectors_per_block - (first_sector_index % sectors_per_block);
const int head_sector_count = (max_head_sector_count > total_sector_count) ? total_sector_count : max_head_sector_count;
const int adjusted_sector_count = (total_sector_count > 2 * head_sector_count) ? (total_sector_count - head_sector_count):(total_sector_count + 1 ) / 2;
erase_size = adjusted_sector_count * sector_size;
flash_packet[0] = erase_size;
flash_packet[1] = (size + BLOCKSIZE_FLASH -1 ) / BLOCKSIZE_FLASH;
Flash_packet[2] = BLOCKSIZE_FLASH;
flash_packet[3] = address;
espcomm_send_command(FLASH_DOWNLOAD_BEGIN,(unsigned char*)&flash_pocket,16);
}
参考:ESP8266固件下载协议
五、ESP8266云端升级
1、概述
ESP8266支持两种主程序固件模式:
- Non-FOTA(Firmware Over the Air):不支持通过WI-FI从云端下载新版本ESP8266固件
- FOTA模式:支持通过WI-FI从云端下载新版本ESP8266固件
2、使用指南
2.1编译固件
以ESP8266_NONOS_SDK的IoT_Demo为应用程序示例,进行介绍。
2.1.1 修改IoT_Demo
2.1.1.1 下载IoT_Demo
下载连接SDK链接:https://www.espressif.com/zh-hans/support/download/sdks-demos
2.1.1.2 IoT_Demo提供SmartLight、SmartPlug、Sensor三种设备简单示例。Sensor不支持升级功能,默认设备类型SmartLight。
- 在ESP8266_NONOS_SDK\IOT_DEMO\include\ user_config.h中对设备使能。
- user_config.h配置文件如图。每次只能使能一种设备。
2.1.1.3 根据实际使用的ESP8266硬件模块FLASH的大小,修改用户参数区。
使用不同的FLash map对应头文件的修改设置:
2.1.2 编译IOT_Demo
- step1:选择 boot版本(defautl 2)
- 0 = boot_v1.1
- 1 = boot_v1.2+
- 2 = none
- step2:STEP 2: choose** bin generate(default 0)**
- 0 = eagle.flash.bin+eagle.irom0text.bin
- 1 = user1.bin
- 2 = user2.bin
- STEP 3: choose spi speed (default 2)
- 0=20MHz
- 1 = 26.7MHz
- 2 = 40MHz
- 3 = 80MHz
- STEP 4: choose spi mode (default 0)
- 0=QIO,
- 1=QOUT
- 2=DIO
- 3=DOUT
- STEP 5: choose spi size and map (default 0)
- 0= 512KB( 256KB+ 256KB)
注意:
1、user1.bin和user2.bin由同一份应用代码在编译过程中STEP2选择不同的选项,分别编译生成
- 编译生成user1.bin后,先运行make clean清除上次编译生成的临时文件,再重新编译生成user2.bin
2、user1.bin和user2.bin的区别在于他们存放在flash的位置不同。
3、默认烧录user1.bin到Flash,并将user1.bin和user2.bin上传到云端。
4、编译STEP5之后的选项5和6仅sdk_v1.1.0 +boot 1.4+flash download tool_v1.2及之后支持。
3.1 烧录固件
3.1.1 获取master_device_key.bin
master_device_key:是开发者在乐鑫云服务器创建一个智能设备时,自动生成的属于该设备身份的唯一ID值。
乐鑫云帮助文档地址:http://iot.espressif.cn/#/help-zh-cn/
3.1.2烧录说明
根据实际ESP8266硬件模块Flash大小,对应烧录地址如下:
FOTA固件说明如下:
BIN文件 | 说明 |
---|---|
master_device_key.bin | 用户从乐鑫云申请,享受乐鑫云服务 存放在用户参数区,存储地址由用户应用程序定义 |
blank.bin(烧录位置一) | 初始化RF_CAL参数区 烧录位置由应用程序中的user_rf_cal_sector_set设置决定 由乐鑫官网提供,位于ESP8266_SDK\bin路径下 |
esp_init_data_default.bin | 初始化其他射频参数区,至少烧录一次 当RF_CAL参数区初始化烧录时,本区域也需烧录 由乐鑫官方提供,位于ESP8266_SDK\bin路径下 |
blank.bin(烧录位置二) | 初始化系统参数区 由乐鑫官方提供,位于ESP8266_SDK\bin目录下 |
boot.bin | 主程序,由乐鑫官方提供,位于ESP8266_SDK\bin目录下 |
user1.bin | 主程序,编译应用程序生成,位于ESP8266_SDK\bin目录下 |
4.1 运行
将 ESP8266 模块上电运⾏(默认波特率 74880)。使用乐鑫手机app,配置ESP8266模块连接路由器。
5.1 乐鑫云升级操作
3、升级实现原理
3.1 Flash布局
分区说明:
- user1.bin和user2.bin是同一个应用程序,选择不同的编译步骤,分别生成的两个固件,存放在SPI Flash的不同位置。
- 系统参数区存储一个标志位,标识启动时应当运行user1.bin或user2.bin
- 启动时先boot,boot读取系统参数区的标志位,判断运行user1.bin或user2.bin,然后到SPI Flash对应位置读取运行
3.2 软件实现
开发者可以使用其他云端服务器,调用ESP8266 SDK提供的软件接口,通过HTTP协议实现下载升级功能。
3.2.1 ESP8266_NONOS_SDK应用
- 升级接口说明:《ESP8266 NOn_OS SDK API 参考》
- 升级应用实例:ESP8266_NONOS_SDK\examples\IoT_Demo\user\user_esp_platform.c由user_esp_platform_upgrade_begin系列函数实现。
3.2.2 ESP8266_RTOS_SDK应用
- 升级接口说明:《ESP8266 RTOS SDK API 参考》
- 升级应用实例:
- 参考 ESP8266_IOT_PLATFORM\upgrade
- 应⽤⽰例下载链接:https://github.com/espressif/ESP8266_IOT_PLATFORM
3.2.3 自定义服务器要求
使用自定义云端服务器实现升级时,需要以下支持:
- ESP
4、固件版本命名规则
- ESP8266_NONOS_SDK的IoT_Demo实例时对下载的固件版本命名需遵循规则,否则导致云端升级失败。
- 基于ESP8266_NONOS_SDK实现升级应用无以下规则限制。
4.1 版本命名模板
模板:[v|b]Num1.Num2.Num3.tPTYPE([o|l|a|n])
形式:v1.0.2t45772(a)
形式解析:
4.2 版本命名解释
- 版本类型:v或b
- version:正式版本
- bate:测试版本
- 对应 IoT_Demo\include\user_iot_version.h 中的 #define VERSION_TYPE 定义
- 版本值:Num1,Num2,Num3
- Num:取值范围[0,9],整数
- 示例:1.0.5
- 对应IoT_Demo\include\user_iot_version.h中如下定义
- 乐鑫app最大支持1.4.0
4.3 类型标志t
t:类型标志符号,后面跟随PTYPE值
4.4 设备类型值:PTYPE
- PTYPE:设备在乐鑫云上的ptype(product type)值
- 对应 IoT_Demo\include\user_iot_version.h 中的 #define device_type 定义
4.5升级支持
o:online,支持在线升级
l:local,支持本地升级
a:all,都支持
n:not support,不支持升级
- 对应IoT_Demo\include\user_iot_version.h中如下定义
参考:ESP8266云端升级指南
六、开始玩转ESP8266
1、概述
1.1 流程介绍
1.2 ESP8266 HDK
ESP8266 Hardware Development Kit包括ESP8266EX芯片、模组和开发板。使用什么样的开发板就使用相应厂商的开发固件
1.3 ESP8266 SDK
ESP8266 Software Development Kit是乐鑫为开发者提供的物联网应用开发平台。按照是否基于操作系统分为:non-OS和RTOS两种版本
1.4 ESP8266 FW
ESP8266 Firmware是一些可直接下载到ESP8266 HDK中的BIN文件,⽤户可以选择下载 Firmware Over-The-Air(FOTA,⽀持云端升级)和 non-FOTA(不⽀持云端升级)的 BIN ⽂件。
1.5 ESP8266 工具集
1.5.1 编译器
编译 ESP8266 SDK 需要使⽤ Linux 操作系统,乐鑫已将编译 SDK 所需要的⼯具安装到虚拟机中。⽤户只需安装虚拟机,并导⼊ ESP8266 编译器(OVA 镜像⽂件)即可直接编译 ESP8266 SDK
1.5.2 固件下载工具
ESP8266 DOWNLOADTOOL⼯具是由乐鑫官⽅开发的固件下载⼯具,⽤户可根据实际的编译⽅式和 Flash 的容量,将多个 BIN ⽂件⼀键下载到 ESP8266 ⺟板(开发板或者模组)的 SPI Flash 中
1.5.3 串口调试工具
串⼝调试⼯具可以通过标准 RS-232 端⼝直接与 ESP8266 建⽴通信。对于不带有物理串
⼝的 PC,可以使⽤ USB 转串⼝模块来虚拟出⼀个串⼝设备。⽤户可以直接在串⼝终端输
⼊命令和实时查看相关打印信息
- CoolTerm(Windows 和 Mac 系统)和 Minicom(Linux 系统)作为串⼝调试⼯具
2、硬件准备
2.1 开发方案
- ⽤ USB 数据线将 PC 机与 ESP-LAUNCHER 的 USB-UART 接⼝相连
- 将开发板置为下载模式。
- 将 USB 转 TTL 串⼝模块与 PC 机连接。
- 将电源开关 (Power Switch) 拨到内侧给开发板上电
- 将芯⽚开关 (Chip Switch) 拨到外侧给芯⽚上电。
- 通过下载⼯具 (ESP8266 DOWNLOAD TOOL) 将固件下载到 Flash 中
- 下载完毕后将 GPIO0 开关 (GPIO0 Control) 拨到外侧将 ESP-LAUNCHER 开发板置为⼯作模式
- 使⽤芯⽚开关 (Chip Switch) 给芯⽚重新上电,芯⽚初始化时会从 Flash 中读取程序运⾏。
3、软件准备
3.1 Non-OS SDK
下载non-OS SDK连接:http://www.espressif.com/en/support/download/sdks-demos
- bin:编译生成的bin文件,可直接下载到Flash中
- documents:SDK相关的文档或链接
- driver_lib:外设驱动的库文件。
- examples:供用户二次开发的示例代码
- include:SDK自带头文件,包含用户可使用的相关API函数及其他宏定义。
- Id:链接时需要的脚本文件
- lib:SDK提供库文件
- tools:编译BIN文件所需的工具。
3.2 RTOS SDK
下载RTOS SDK链接:https://github.com/espressif/ESP8266_RTOS_SDK
- bin:编译⽣成的 BIN ⽂件,可直接下载到 Flash 中。
- documents:SDK 相关的⽂档或链接。
- driver_lib:乐鑫官⽅提供的驱动示例代码。
- examples:可供⽤户⼆次开发的示例代码。
- openssl_demo:乐鑫官⽅提供的 OpenSSL 接⼝功能示例代码。
- project_template:乐鑫官⽅提供的⼯程模板示例代码。
- smart_config:乐鑫官⽅提供的 SmartConfig 功能示例代码。
- spiffs_test:乐鑫官⽅提供的 SPIFFS ⽂件系统功能示例代码。
- websocket_demo:乐鑫官⽅提供的 WebSocket 功能示例代码。
- include:SDK ⾃带头⽂件,⽤户可使⽤相关 API 函数及其他宏定义
- ld:链接时所需的脚本⽂件,如⽆特殊需求,⽤户⽆需修改。
- lib:SDK 提供的库⽂件。
- third_party:乐鑫开放源代码的第三⽅库,当前包含 freeRTOS、JSON、lwIP, mbedTLS、noPoll、OpenSSL、SPIFFS 和 SSL。
- tools:编译 BIN ⽂件所需的⼯具,⽤户⽆需修改。
3、ESP8266工具
3.1 编译器
解锁密码:espressif
3.2 固件下载
在下方链接下载ESP9266 DOWNLOAD TOOL:
http://www.espressif.com/support/download/other-tools
4、Flash布局
- 系统程序:存放运行系统必要的固件
- 用户数据:有多余Flash用于用户数据区时,空闲区域均可以存放用户数据。用户可在任意空闲位置设置用户参数区。
- RF_CAL参数:系统自动保存校准后的RF参数
- 默认RF参数:将esp_int_data_default.bin下载至该区,保存默认的参数信息。
- 系统参数:保存系统参数信息
- Boot信息:位于FOTA固件的分区1,存放Boot文件。
4.1 Non-FOTA
4.1.1 布局说明
可以通过修改ESP8266_NONOS_SDK\ld\eagle.app.v6.ld文件改变eagle.irom0text.bin的上限值。即修改文件中irom0_0_seg参数的len字段。不同版本 SDK 中irom0.text ⽂件的地址也不同。必须查阅 eagle.app.v6.ld ⽂件;确保将 eagle.irom0.text.bin 下载到正确的地址。
4.1.2 下载地址
4.2 FOTA
4.2.1 布局说明
4.2.2 下载地址
5、编译SDK
5.1 编译准备
5.1.1 编译SDK文件
若选择下载FOTA固件,需要修改SDK文件
- 进入window系统
- 根据不同的Flash布局修改ESP8266_NONOS_SDK\examples\IoT_Demo\include中的文件
- user_light.h 和 user_plug.h 需要修改 #define PRIV_PARAM_START_SEC。
- user_esp_platform.h 需要修改 #define ESP_PARAM_START_SEC
5.1.2 加载SDK文件
- 进入Linux系统
- 运行虚拟机桌面终端LXTerminal
- 复制待编译文件至虚拟机共享目录
- 复制 ESP8266_NONOS_SDK ⽂件夹到虚拟机共享⽬录.如:D:\VM\share ⽬录
- 将 IoT_Demo ⽂件夹复制到 D:\VM\share\ESP8266_NONOS_SDK ⽬录下,
- 加载共享目录
注意:2021-07-09 09:58:27 星期五若⽤户使⽤ RTOS SDK,请继续执⾏步骤 5;若使⽤ non-OS SDK,请跳过步骤 5
- 设置路径变量,指向SDK和BIN文件。
export SDK_PATH=~/Share/ESP8266_RTOS_SDK
export BIN_PATH=~/Share/ESP8266_RTOS_SDK/bin
⽤户可以将其添加在 .bashrc ⽂件中,否则每次重启编译器都需要重复步骤 5。
6、下载固件
- 双击ESP_DOWNLOAD_TOOL.EXE打开Flash工具
SPIDownload | 适用于SPI Flash下载 |
---|---|
HSPIDownload | 适用于HSPI Flash下载 |
RFConfig | 射频初始化设置 |
MutiDownload | 适⽤于多个⺟板的下载 |
-
在 Download Path Config 区域内双击“...” 选择需要下载的 BIN ⽂件,在 ADDR 内设置相应的下载地址。
-
配置 SPIDownload 相关选项
-
下载完成后,在 ESP-LAUNCHER 开发板上将 GPIO0 Control 拨到外侧,并重新上电,可进⼊运⾏模式。
本文来自博客园,作者:登云上人间,转载请注明原文链接:https://www.cnblogs.com/lj15941314/p/14969525.html