在淘宝买了块NODEMCU开发板,里面默认固件是lua脚本编程。感觉用着不爽,用来玩一玩还行,不能作为实际项目使用。于是想烧录AT指令。
需要工具:
固件烧录上位机:flash_download_tools_v3.6.8_0(乐鑫官网下载)
AT指令固件:ESP8266_NonOS_AT_Bin_V1.7.3(乐鑫官网下载)
开发板:NODEMCU一块(4M Flash配置)
引用官方指南:
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x1fc000
blank.bin 0xfe000 & 0x1fe000
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x3fc000
blank.bin 0xfe000 & 0x3fe000
eagle.flash.bin 0x00000
eagle.irom0text.bin 0x10000
blank.bin
Flash size 8Mbit: 0x7e000 & 0xfe000
Flash size 16Mbit: 0x7e000 & 0x1fe000
Flash size 16Mbit-C1: 0xfe000 & 0x1fe000
Flash size 32Mbit: 0x7e000 & 0x3fe000
Flash size 32Mbit-C1: 0xfe000 & 0x3fe000
esp_init_data_default.bin
Flash size 8Mbit: 0xfc000
Flash size 16Mbit: 0x1fc000
Flash size 16Mbit-C1: 0x1fc000
Flash size 32Mbit: 0x3fc000
Flash size 32Mbit-C1: 0x3fc000
modify eagle.app.v6.ld, as
irom0_0_seg : org = 0x40210000, len = 0x6C000
NOTICE: UPDATE is not supported in non-boot mode; 4Mbit Flash is not supported in non-boot mode;
1.Make sure TE(terminal equipment) is in sta or sta+ap mode
AT+CWMODE=3
OK
2.Make sure TE got ip address
AT+CWJAP="ssid","12345678"
OK
AT+CIFSR
192.168.1.134
3.Let's update
AT+CIUPDATE
+CIPUPDATE:1 found server
+CIPUPDATE:2 connect server
+CIPUPDATE:3 got edition
+CIPUPDATE:4 start start
OK
NOTICE: If there are mistakes in the updating, then break update and print ERROR.
至于还不知道为什么的再看下面引用官方手册:
不带OTA功能的FLASH布局
带OTA功能的Flash布局
我们AT指令是带OTA功能的,看FOTA图即可。
下图是下载地址
知道为什么了吗?其实不为什么,因为程序里面固定死了。
3.注意SPI MODE选择
这个和你的spi硬件连接有关,了解一下 SPI和QSPI就知道了。
我们这个NODEMCU是普通的SPI选前面不带Q的DIO或DOUT。
FLASH SIZE选择 32Mbit-C1??.其它按图选择。
NONOS_SDK3.0以后只支持Flash 1024+1024模式了,解释一下带OTA功能的固件需要user1.bin和user2.bin这两个用户空间一样最大支持1024Byte(其实是<=1000Byte)。烧录固件只烧录user1.bin就可以了。user2.bin用来OTA升级的时候用的,升级后程序就从user2.bin启动。
开发板进入下载模式:
按住flash按键不松开,再按reset按键不松开,然后松开flash按键,然后松开reset按键,灯闪烁。这时进入下载模式。
点击START按钮开始等待烧录(注意开发板的COM口,和波特率,串口驱动装不好的直接下载个驱动精灵来安装串口驱动)
下载成功后,按RST按钮,打开串口助手(波特率115200),发现串口打印出信息是乱码,发送AT指令也不回复。
我们把波特率改为 74880 ,这个波特率是MCU内部ROM串口打印出来的信息,我们无法修改,出厂固化的。
发现串口打印信息,出现分区错误提示。(这个问题我也捣鼓了大半天)。
原来是固件和FLASH SIZE不匹配导致的。
解决方法有两种:
第一种:官方提供的AT指令固件 只支持 2M Flash,我们把开发板4M的Flash当2M使用。
4个bin文件不变,但是地址要改变如下
boot_v1.2+.bin @0x00000
user1.2048.new.5.bin @0x01000
esp_init_data_default.bin @0x1fc000
blank.bin @ 0x1fe000
我们烧录的时候 FLASH SIZE选 16Mbit-C1,
第二种:下载 ESP8266_NONOS_SDK-3.0.3 SDK 重新编译AT固件,编译选项如下:
make COMPILE=gcc BOOT=new APP=1 SPI_SPEED=40 SPI_MODE=QIO SPI_SIZE_MAP=6
因为程序里面做了定义:
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 2)
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 3)
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 4)
#error "The flash map is not supported"
#elif (SPI_FLASH_SIZE_MAP == 5)
#define SYSTEM_PARTITION_OTA_SIZE 0xE0000
#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_AT_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_SSL_CLIENT_CERT_PRIVKEY_ADDR 0xfc000
#define SYSTEM_PARTITION_SSL_CLIENT_CA_ADDR 0xfb000
#define SYSTEM_PARTITION_WPA2_ENTERPRISE_CERT_PRIVKEY_ADDR 0xfa000
#define SYSTEM_PARTITION_WPA2_ENTERPRISE_CA_ADDR 0xf9000
#elif (SPI_FLASH_SIZE_MAP == 6)
#define SYSTEM_PARTITION_OTA_SIZE 0xE0000
#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_AT_PARAMETER_ADDR 0xfd000
#define SYSTEM_PARTITION_SSL_CLIENT_CERT_PRIVKEY_ADDR 0xfc000
#define SYSTEM_PARTITION_SSL_CLIENT_CA_ADDR 0xfb000
#define SYSTEM_PARTITION_WPA2_ENTERPRISE_CERT_PRIVKEY_ADDR 0xfa000
#define SYSTEM_PARTITION_WPA2_ENTERPRISE_CA_ADDR 0xf9000
#else
#error "The flash map is not supported"
#endif
目前AT指令只支持2M 1024+1024 和 4M 1024+1024 模式。
至于如何编译NONOS AT例程,大家去安信可官网下载集成环境的eclipse工具来安装,这种教程网上很多。
编译完成后,用编译出来的bin烧录,FLASH SIZE 选32Mbit-C1即可,其它选项如下图,地址空间改变。
总结:遇到问题多去官方看资料,网上很多资料都是很老的,已经和最新的SDK不一样了,建议去乐鑫官网多看看还有他们的github项目。
我贴几个github地址
ESP8266EX项目
https://github.com/espressif/ESP8266_NONOS_SDK
https://github.com/espressif/ESP8266_RTOS_SDK
ESP32项目
https://github.com/espressif/esp-idf