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:
使用燒寫工具nodemcu-flasher燒寫:
ai-think序列槽調試助手内置了常用的AT指令,比如發送 AT+GMR 可以擷取版本資訊:
使用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\):
在應用的入口點添加一個輸出:
2.編譯固件
(使用VirtualBox+官方基于lubuntu的編譯環境:ESP8266_lubuntu_20141021.ova):
把修改過的 \examples\IoT_Demo\ 拷貝到 /ESP8266_NONOS_SDK/ 的根目錄,切換到\ESP8266_NONOS_SDK\IoT_Demo\:
執行編譯:
按照提示選擇:2(noboot)-0-2-0-4(4096KB)
編譯完成:會在\ESP8266_NONOS_SDK\bin\目錄生成這兩個檔案:
3.重新燒錄編譯的固件,隻需要更新編譯生成的兩個(offset分别為:0x00000和0x40000):
使用序列槽工具:波特率為74880(去源代碼裡面看):
這時PC會發現名為:ESP_6CE44B(後面的數字是MAC位址的後6位)的 AP(閱讀user_init()會發現其中配置了開發闆的AP功能),下圖(左邊是開發闆列印出來的資訊,可以看到開發闆擷取到了PC的MAC位址)是PC連上該 AP的資訊:
通過網絡調試助手簡單分析一下ESP SDK API:
下圖是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
小結一下:
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
nodemcu_init()最終會調用到下面的代碼來加載init.lua。整個NodeMCU的源代碼可以看成是從user_init()開始建構的一個應用,該應用實作的Lua解釋器的功能。
使用MicroPython固件:
從http://micropython.org/download#esp8266下載下傳ESP8266平台的MicroPython固件并燒錄。
小結一下:
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
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提供的接口
mp_task()最終會調用到pyexec_file("main.py")來加載main.py。
下面的腳本會使ESP8266子產品上的LED按1s間隔閃爍: