ESP8266开发记录
一、概述
ESP8266提供WIFI解决方案,即可做STA,也可做AP。有片上SOC,可用官方提供SDK接口编写,支持RTOS和非OS。也可以使用其它MCU通过串口发送AT指令操作。
芯片官方为乐鑫,亦有其它厂家在此基础上集成,如安信可。安信可有自己的SDK环境。
官方地址:https://www.espressif.com。
提供开发环境、SDK手册等下载。
固件不开源,但文档和示例较完备,可快速入门。
二、环境
编译器:名称为xtensa-lx106-elf-gcc。下载地址:(暂查不到)
虚拟机:使用VirtualBox ,下载地址:https://www.virtualbox.org/wiki/Downloads
虚拟机镜像文件名为:ESP8266_lubuntu_20141021.ova,内置编译器。下载地址:参考https://bbs.espressif.com/viewtopic.php?t=86 实际地址:http://downloads.espressif.com/FB/ESP8266_GCC.zip。
烧写工具:https://www.espressif.com/zh-hans/support/download/other-tools。名称:Flash 下载工具(ESP8266 & ESP32),压缩包名称:flash_download_tools_v3.6.7.zip。
SDK手册:https://www.espressif.com/zh-hans/products/software/esp-sdk/resource。有RTOS SDK和NONOS SDK两种版本。
SDK源码:http://www.espressif.com/en/support/download/sdks-demos
其它还有NodeMCU、ARDUINO等。
三、编译
1、直接使用官方提供的虚拟机镜像+VirtualBox,设置物理机和虚拟机共享目录,在此目录下,windows编码、linux编译。
2、在自己的虚拟机安装编译器(解压、设置PATH),其它同上。
3、sdk带有编译脚本,需要选择flash大小等参数,可做成默认值,不用每次都输入。
四、烧写
0、板子准备,连接TTL电平的串口转接小板,IO0与GND短接(即接地,此时为下载模式),上电。
1、使用flash_download_tools_v3.6.7烧写,双击flash_download_tools_v3.6.7.exe。点击“ESP8266 DownloadTool”(其它型号根据情况选择)。下载界面:
界面说明:
- 1 选择二进制文件,输入对应的地址。
- 2 选择SPI速率,默认即可。
- 3 选择SPI模式,看SPI型号而定,例子为DOUT。
- 4 选择flash大小,注意,这些值单位为bit,8Mbit即为1MB,看SPI型号而定。
- 5 确保串口连接正常。点击START。
- 6 软件检测flash信息。
- 7 显示下载信息。
2、选择的下载参数,与代码必须保持一致。flash不正确,烧写不成功。
3、blank.bin文件可烧写,亦可不烧写,其作用为清空指定flash地址内容。
4、板子有32Mbit,也可以烧写8Mbit程序,只是无法使用剩余的flash。
五、开发
开发点滴
1、不同flash,其地址分配不同,使用的宏不同,烧写地址不同,需要区分。
2、SDK有完整的手册,手册列出提供的接口。如TCP服务器/客户端、STA/AP、设置/获取IP、设置/获取MAC、恢复出厂,GPIO,等等。SDK开发有独特的目录和结构,参考Demo即可。
3、创建的TCP服务器,可以同时处理多个连接(最大能连多少个,未测试)。不管是AP可STA,都可以创建TCP服务器。设置回调。
4、手册中说一个AP最多连接4个STA,但可设置为8个(限于设备,实测连接了7个)。
5、AP模式,可设置地址池范围。做STA可选择静态IP连接到AP。
6、AP模式,默认SSID为ESP_<MAC地址>
,无密码。如要加密,加密长度必须大于8,否则初始化AP不成功(但能开启AP,此时变为默认的SSID)。
7、esp8266有时会因为一些代码问题(如越界、非法地址)导致重启。编码时要小心。
8、有时打印信息太多,会导致跑不起来,尝试减少或去掉,重新编译。
9、修改头文件后,一定要全部重新编译,最好每次编译前都清除后,再编译。
10、官方提供好链接文件,一般情况下,不需要修改。
分区说明
Non-FOTA 和 FOTA 分区不同,手册有说明。不同容量 flash,分区不同。手册也有说明。此处根据自己的理解重新整理。
前2个分区为系统程序,地址固定。高地址有3个分区,由高到低依次是系统参数区,默认校准参数区,自动校准参数区,大小固定,地址通过 flash 部容量倒推可得。这几个分区的地址和大小,官方 SDK 已经有一些宏来确认(因为常用的 flash 容量就那么几种),在编译时选择对应的即可。
Non-FOTA
以 flash 容量为4MB(32Mbit)。SPI_FLASH_SIZE_MAP 宏为 4,相关定义如下:
1 | #define SYSTEM_PARTITION_OTA_SIZE 0x6A000 |
分区表如下:
1 | static const partition_item_t at_partition_table[] = { |
根据手册和代码头文件说明,按地址由低到高说明如下:
1、第一分区为系统程序 eagle.flash.bin,地址为 0x00000,大小为 0x10000。这是固定的,不能修改。
2、第二分区为系统程序 eagle.irom0text.bin,地址为 0x10000,大小为 0x60000。这是固定的,不能修改。
3、第三分区为用户参数,容量较大,地址由宏 SYSTEM_PARTITION_CUSTOMER_PRIV_PARAM_ADDR 来定义,此处为 0x7c000,但定义的大小为 0x1000。理论上用户参数 4KB 足够。这部分地址,使用 system_restore 恢复出厂时不会清理——除非手动擦写掉。因此,可以存放一些重要的出厂文件,如授权文件,key,等等。
4、第四分区为系统自动校准后的RF参数。用户无须理会。大小为4KB,地址为 0x3fb000。
5、第五分区为默认的校准参数,官方提供bin文件供下载。用户无须理会。大小为4KB,地址为 0x3fc000。
6、第六分区为系统参数,调用官方如 AP、STA相关接口时,保存在此分区。大小为12KB,地址范围为 0x3fd000 ~ 0x400000。
注:1个扇区为4KB,即 4096,十六进制为 0x1000。
FOTA
FOTA方式下,有2个分区,user1.bin为分区1,user2.bin为分区2。这种方式在升级、启动判断十分重要。
同上例,SPI_FLASH_SIZE_MAP 也为4,其宏定义与前例相同。但分区表不同,如下:
1 | static const partition_item_t at_partition_table[] = { |
在编译时,APP为外部传入,可以在Makefile中添加DEFINES += -DAPP=$(APP)
,在便在程序中获取APP宏。这样根据APP的值可知是哪个区。定义partition_item_t也可根据此值。这样,一套代码可以适用2种方式。
MAC 地址
AP模式下,MAC 地址是虚拟的(为何?原因不知),STA 模式下,MAC地址是真实的。注:出口到某些国家/地区需要真实、合法的 MAC 地址。可到 http://standards-oui.ieee.org/oui/oui.txt 查询。
服务器回调函数
服务端可用espconn_regist_time设置超时时间,当超过时间无任何交互时,则自动断开连接。
espconn_regist_recvcb设置接收回调函数,接收数据、处理命令在回调函数中进行。
espconn_regist_sentcb设置发送完数据的回调函数,espconn_regist_recvcb的回调函数中一般不做耗时处理,因为该回调函数未完成时,不会发送回应包。因此,这些处理可以在本回调函数中处理。如重启,可在espconn_regist_recvcb回调函数中返回,然后在espconn_regist_sentcb回调函数中真正重启。
串口
esp8266有1个全功能串口(UART0),还有一个只有发送功能的串口(UART1)。相应驱动在uart.c文件中。
串口0即可做日志,也可做数据收发。同一时间不建议2种功能一起做。
串口0发送函数为uart0_tx_buffer(buff, len)
。串口0接收只能在中断做。具体在uart_recvTask
函数,其由函数uart0_rx_intr_handler
触发,在初始化函数uart_config
中设置。
理论上,中断处理应尽快完成,但根据实际情况(如某时刻,只做串口数据测试这单一功能),可以不尽快。因此在uart_recvTask
函数可以调用用户级别的处理函数,来处理串口数据。理论上uart.c文件是属于驱动层,但也可以在用户user_main中定义函数,在uart.c中调用。
串口波特率可以自定义,如uart_init(115200, 115200);
,但上电时运行的SDK代码输出日志为乱码(此信息使用76800)。可用UART_SetPrintPort(0);
设置日志输出的串口。
注意,使用中断后,如果在主函数中使用while(1)等待数据接收,这种情况下无法进入串口接收中断。可开一定时任务循环进行额外的处理(如点灯)。不能按轮询的思路来编写代码。
升级
其它
1、如果有能力设计硬件(硬件原理公开),可直接在片上SOC编程(即SDK编程),能减少硬件成本。另一途径为AT固件+MCU开发,即ESP8266无须开发,使用额外的MCU通过AT指令操作。网络大部分资料都是这种方式。
2、GPIO16一般做唤醒,但也可以做通用GPIO,只是使用的函数不同于其它GPIO。
3、要查看串口输出信息,需设置波特率为76800。另使用XCOM V2.0.exe能正常显示、操作AT指令,但sscom32.exe不正常,暂未知原因。