前言
在淘寶買了塊NODEMCU開發板,裏面默認固件是lua腳本編程。感覺用着不爽,用來玩一玩還行,不能作爲實際項目使用。於是想燒錄AT指令。
需要工具:
固件燒錄上位機:flash_download_tools_v3.6.8_0(樂鑫官網下載)
AT指令固件:ESP8266_NonOS_AT_Bin_V1.7.3(樂鑫官網下載)
開發板:NODEMCU一塊(4M Flash配置)
開始燒錄官方固件
- 打開 flash_download_tools,如下圖
- 選擇要燒錄的bin文件並填寫燒錄地址,不要忘記在前面打勾,至於爲什麼要這麼選看下面?
引用官方指南:
BOOT MODE
download
Flash size 16Mbit-C1: 1024KB+1024KB
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x1fc000
blank.bin 0xfe000 & 0x1fe000
Flash size 32Mbit-C1: 1024KB+1024KB
boot_v1.2+.bin 0x00000
user1.2048.new.5.bin 0x01000
esp_init_data_default.bin 0x3fc000
blank.bin 0xfe000 & 0x3fe000
NON-BOOT MODE
download
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
compile
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;
Update steps
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