開發板使用的是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間隔閃爍:
但是當我們點"Save to ESP",會報錯,原因是Save操作會先打開main.py,然后修改,但是我們開發板上還沒有main.py(如下圖):