天天看點

ESP8266 NodeMCU開發闆

ESP8266使用筆記之常用固件

開發闆使用的是NodeMCU開發闆:

ESP8266 NodeMCU開發闆

目錄

1.學習使用ESP8266官方的SDK

        1.1使用SDK提供的AT固件

        1.2使用SDK Build固件

2.學習使用NodeMCU固件(上層可使用Lua開發)和MicroPython固件(上層可使用MicroPython開發)

學習使用ESP8266官方的SDK 

使用AT固件:

下載下傳開發包:esp8266_nonos_sdk_v1.5.4.7z,/bin/目錄裡面包含已經編譯好的固件,NodeMCU上ESP8266子產品帶的SPI ROM大小為4MB,

參考2a-esp8266-sdk_getting_started_guide_cn.pdf:

ESP8266 NodeMCU開發闆

使用燒寫工具nodemcu-flasher燒寫:

ESP8266 NodeMCU開發闆

ai-think序列槽調試助手内置了常用的AT指令,比如發送 AT+GMR 可以擷取版本資訊:

ESP8266 NodeMCU開發闆

使用SDK Build固件

下載下傳esp8266_nonos_sdk_v1.5.4.7z,以其中IoT_Demo為例,熟悉固件的編譯:樂鑫針對 ESP8266 提供兩種SDK:NON-OS SDK 和 RTOS SDK(基于FreeRTOS):

1.修改源程式:

因為我使用的NodeMCU上的SPI ROM大小為4MB,

參考2b-esp8266_non-os_sdk_iot_demo_guide_cn.pdf,需要修改下面的配置(\examples\IoT_Demo\):

ESP8266 NodeMCU開發闆
ESP8266 NodeMCU開發闆

在應用的入口點添加一個輸出:

ESP8266 NodeMCU開發闆

2.編譯固件

(使用VirtualBox+官方基于lubuntu的編譯環境:ESP8266_lubuntu_20141021.ova):

把修改過的 \examples\IoT_Demo\ 拷貝到 /ESP8266_NONOS_SDK/ 的根目錄,切換到\ESP8266_NONOS_SDK\IoT_Demo\:

執行編譯:

ESP8266 NodeMCU開發闆

按照提示選擇:2(noboot)-0-2-0-4(4096KB)

編譯完成:會在\ESP8266_NONOS_SDK\bin\目錄生成這兩個檔案:

ESP8266 NodeMCU開發闆

3.重新燒錄編譯的固件,隻需要更新編譯生成的兩個(offset分别為:0x00000和0x40000):

ESP8266 NodeMCU開發闆

使用序列槽工具:波特率為74880(去源代碼裡面看):

ESP8266 NodeMCU開發闆

這時PC會發現名為:ESP_6CE44B(後面的數字是MAC位址的後6位)的 AP(閱讀user_init()會發現其中配置了開發闆的AP功能),下圖(左邊是開發闆列印出來的資訊,可以看到開發闆擷取到了PC的MAC位址)是PC連上該 AP的資訊:

ESP8266 NodeMCU開發闆

通過網絡調試助手簡單分析一下ESP SDK API:

下圖是ESP8266固件大緻的初始化流程:

ESP8266 NodeMCU開發闆

下圖是使用網絡調試助手與NodeMCU通信的截圖:

ESP8266 NodeMCU開發闆

小結:

1. ESP8266_NONOS_SDK-2.0.0提供了大量API供應用程式調用,user_init()就是應用程式的入口點;

2. SDK 以庫檔案的形式提供,API參考:2c-esp8266_non_os_sdk_api_reference_cn.pdf;

NodeMCU固件和MicroPython固件

NodeMCU固件是針對NodeMCU開發闆,基于NON-OS SDK開發的固件;NodeMCU固件使用輕量化的腳本語言Lua,并使用基于spiffs的檔案系統;

MicroPython固件支援使用MicroPython語言來開發;

上面兩種固件實際上就是把兩種腳本語言的解釋器移植到了ESP8266上,固件開發者基于ESP8266的SDK移植解釋器并實作各種Module,但是NodeMCU隻支援ESP8266平台;而MicroPython則支援多種平台,比如ESP8266、ESP32、stm32等等。

下面通過點亮開發闆上的一個LED來看看如何通過腳本程式設計硬體:

NoceMCU開發闆上有2個LED,一個位于ESP8266子產品上,該LED接GPIO2,把GPIO2拉低可以點亮LED;還有一個LED位于USB轉序列槽晶片旁邊,該LED接GPIO16,把GPIO16拉低可以點亮改LED。

使用NodeMCU固件

燒寫工具nodemcu-flasher自帶一個NodeMCU固件:nodemcu-flasher-master\Resources\Binaries\nodemcu_integer_0.9.5_20150318.bin

ESP8266 NodeMCU開發闆
ESP8266 NodeMCU開發闆

小結一下: 

1. nodemcu預設執行的腳本是init.lua,如果找不到就顯示指令提示符">"用來接收序列槽發來的指令;

2. nodemcu固件裡面GPIO16的index被設成了0(led = 0);

3. 網站:​​https://nodemcu-build.com/index.php​​提供了Build NodeMCU固件的服務,其中可以定制固件需要支援的Module。

NodeMCU固件

應用入口點位于:nodemcu-firmware-master\app\user\user_main.c::user_init(),system_init_done_cb()是ESP8266 SDK提供的API,用于注冊系統初始化完成的回調函數,參考:2c-esp8266_non_os_sdk_api_reference_cn.pdf

ESP8266 NodeMCU開發闆

nodemcu_init()最終會調用到下面的代碼來加載init.lua。整個NodeMCU的源代碼可以看成是從user_init()開始建構的一個應用,該應用實作的Lua解釋器的功能。

ESP8266 NodeMCU開發闆

使用MicroPython固件:

從​​http://micropython.org/download#esp8266​​下載下傳ESP8266平台的MicroPython固件并燒錄。

ESP8266 NodeMCU開發闆
ESP8266 NodeMCU開發闆

小結一下:

1.MicroPython固件預設執行的腳本是main.py,如果找不到就顯示指令提示符">>>"用來接收序列槽發來的指令;

MicroPython固件

閱讀MicroPython的源代碼,可以發現MicroPython支援多種平台:ESP8266、ESP32、stm32等。

以ESP8266為例,應用入口點位于micropython-master\ports\esp8266\main.c::user_init(),下圖system_timer_reinit()和system_init_done_cb()是ESP8266 SDK提供的API,參考:2c-esp8266_non_os_sdk_api_reference_cn.pdf

ESP8266 NodeMCU開發闆

init_done()最終會調用到pyexec_file("main.py")來加載main.py,整個MicroPython的源代碼可以看成是從user_init()開始建構的一個應用。

以ESP32為例,應用入口點位于micropython-master\ports\esp32\main.c::app_main(),下圖nvs_flash_init()是SDK提供的API,xTaskCreate()是FreeRTOS提供的接口

ESP8266 NodeMCU開發闆

mp_task()最終會調用到pyexec_file("main.py")來加載main.py。

下面的腳本會使ESP8266子產品上的LED按1s間隔閃爍: