ESP8266作為AVR編程器( ISP programmer)的使用介紹
- 🌿ESP8266自帶庫例程:
https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP
- 📍支持ESP8266/32的ESP_AVRISP其它開源工程(個人沒有再去驗證):
https://github.com/lbernstone/ESP_AVRISP
- 🔧 AVR命令行燒錄工具avrdude:
https://github.com/avrdudes/avrdude
📘制作流程介紹
- 通過Arduino IDE給ESP8266將
Arduino_Wifi_AVRISP
程序編譯并燒錄進去。讓其成為一個網絡燒錄端口的AVR編程器。
- esp8266固件庫自帶的例程:
C:\Users\Administrator\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\ESP8266AVRISP\examples\Arduino_Wifi_AVRISP
- 程序:
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266AVRISP.h>#ifndef STASSID
#define STASSID "########"//填寫自己的wifi信息
#define STAPSK "********"
#endifconst char* host = "ESP8266-avrisp";
const char* ssid = STASSID;
const char* pass = STAPSK;
const uint16_t port = 328;
const uint8_t reset_pin = 5;ESP8266AVRISP avrprog(port, reset_pin);void setup() {Serial.begin(115200);Serial.println("");Serial.println("Arduino AVR-ISP over TCP");avrprog.setReset(false); // let the AVR runWiFi.mode(WIFI_STA);WiFi.begin(ssid, pass);while (WiFi.waitForConnectResult() != WL_CONNECTED) {WiFi.begin(ssid, pass);Serial.println("WiFi failed, retrying.");}MDNS.begin(host);MDNS.addService("avrisp", "tcp", port);IPAddress local_ip = WiFi.localIP();Serial.print("IP address: ");Serial.println(local_ip);Serial.println("Use your avrdude:");Serial.print("avrdude -c arduino -p <device> -P net:");Serial.print(local_ip);Serial.print(":");Serial.print(port);Serial.println(" -t # or -U ...");// listen for avrdudesavrprog.begin();
}void loop() {static AVRISPState_t last_state = AVRISP_STATE_IDLE;AVRISPState_t new_state = avrprog.update();if (last_state != new_state) {switch (new_state) {case AVRISP_STATE_IDLE:{Serial.printf("[AVRISP] now idle\r\n");// Use the SPI bus for other purposesbreak;}case AVRISP_STATE_PENDING:{Serial.printf("[AVRISP] connection pending\r\n");// Clean up your other purposes and prepare for programming modebreak;}case AVRISP_STATE_ACTIVE:{Serial.printf("[AVRISP] programming mode\r\n");// Stand by for completionbreak;}}last_state = new_state;}// Serve the clientif (last_state != AVRISP_STATE_IDLE) { avrprog.serve(); }if (WiFi.status() == WL_CONNECTED) { MDNS.update(); }
}
- 程序燒錄后查看ESP8266/32的網絡IP地址和端口號:
net:192.168.0.104:328
- ?需要注意:ESP8266/32設備的網絡IP段必須同電腦端的IP同段,只要電腦端所連接的WiFi與ESP8266/32設備在同一個路由器上一般沒有問題。如果不同端的IP地址訪問需要進行電腦設置,具體教程可以網上找相關不同IP地址段訪問方法的內容。
- 使用AVR命令行燒錄工具:avrdude燒錄:
- 通過cmd窗口,定位在
avrdude
工具文件位置的燒錄方法:
avrdude -CD:\AVR\avrdude-v8.0-windows-x64/avrdude.conf -v -c arduino -p atmega328pb -P net:192.168.0.104:328 -Uflash:w:D:\AVR\avrdude-v8.0-windows-x64/Blink.ino.hex:i
- 通過cmd窗口,在默認位置使用:
D:\AVR\avrdude-v8.0-windows-x64/avrdude -CD:\AVR\avrdude-v8.0-windows-x64/avrdude.conf -v -c arduino -p atmega328pb -P net:192.168.0.104:328 -Uflash:w:D:\AVR\avrdude-v8.0-windows-x64/Blink.ino.hex:i
- 🔗ESP8266制作的AVRISP與燒錄目標AVR單片機連接引腳說明
+-----------+-----------+
| ESP8266 | AVR |
+----------------+-----------+
| GPIO12(D6) | MISO |
| GPIO13(D7) | MOSI |
| GPIO14(D5) | SCK |
| GPIO5 (D1) | RESET |
+----------------+-----------+
- 考慮到對ESP8266 IO端口的保護,建議通訊引腳串聯一個1K的電阻。
📘批處理文件燒錄執行文件制作
一般程序燒錄,基本上燒錄工具的文件位置(avrdude)基本都是固定的,只要不重裝系統。我們可以制作一個批處理文件,將批處理文件和要燒錄的程序文件(.hex),放置在同一個文件夾內,雙擊即可完成程序燒錄。這樣可以簡化使用命令行燒錄的操作。
- 需要根據自己的
avrdude
文件路徑進行修改。 - 網絡端口,需要根據自己燒錄的ESP32/8266 AVRISP進行提前設置好。
Wifi_AVRISP_Programmer.bat
:
該批處理默認優先檢索
Blink.ino.hex
文件下載,而不是Blink.ino.with_bootloader.hex
,如果再生產的燒錄文件夾中刪除了``Blink.ino.hex文件
,則會加載Blink.ino.with_bootloader.hex
下載。
@echo off
setlocal:: 設置 avrdude 路徑和配置文件路徑
set AVRDUDE_PATH=D:\AVR\avrdude-v8.0-windows-x64\avrdude.exe
set CONFIG_PATH=D:\AVR\avrdude-v8.0-windows-x64\avrdude.conf:: 檢查 avrdude.exe 是否存在
if not exist "%AVRDUDE_PATH%" (echo 錯誤:未找到 avrdude 程序,請檢查路徑是否正確pauseexit /b 1
):: 檢查配置文件是否存在
if not exist "%CONFIG_PATH%" (echo 錯誤:未找到 avrdude.conf 配置文件,請檢查路徑是否正確pauseexit /b 1
):: 查找當前目錄下的 .hex 文件
set HEX_FILE=
for %%f in (*.hex) do (set HEX_FILE=%%fgoto :found_hex
):found_hex
if not defined HEX_FILE (echo 錯誤:當前目錄下未找到 .hex 文件pauseexit /b 1
)echo 找到 Hex 文件: %HEX_FILE%
echo 正在燒錄...:: 執行燒錄命令(調整后的格式,確保路徑正確)
"%AVRDUDE_PATH%" -C"%CONFIG_PATH%" -v -c arduino -p atmega328pb -P net:192.168.0.104:328 -Uflash:w:"%CD%\%HEX_FILE%":iif %errorlevel% equ 0 (echo 燒錄成功完成!
) else (echo 燒錄過程中出現錯誤!
)pause
- ?注意:以上代碼內容,保存時,選擇
ANSI
編碼格式,不然執行的時候,中文會顯示亂碼。
- 在生成的燒錄文件夾內,雙擊執行批處理文件,默認選擇
Blink.ino.hex
燒錄過程:
- 在生成的燒錄文件夾內,手動刪除了
Blink.ino.hex
文件后,雙擊執行批處理文件,自動選擇Blink.ino.with_bootloader.hex
文件進行燒錄過程:
📒Arduino IDE燒錄文件導出和文件說明
- Arduino IDE燒錄文件導出方法:
- 編譯成功后,會在項目文件夾下,自動建立一個
build
文件夾,如果是AVR單片機,里面會有生成的相關文件:
Blink.ino.hex//不帶Bootloader程序的燒錄文件,文件燒錄后,就不再支持使用串口燒錄,后續再燒錄,只能通過ISP燒錄方式
Blink.ino.with_bootloader.hex//帶Bootloader程序的燒錄文件,文件燒錄后,后續再燒錄,可以繼續使用串口燒錄。
- Arduino IDE 默認的串口燒錄方式:
- AVR ISP編程器燒錄方式選擇和燒錄:
- 配置編程器
- 使用編程上傳:
📘燒錄目標AVR單片機型號ID查詢
- 🌿AVR單片機型號ID查詢:
https://avrdudes.github.io/avrdude/8.0/avrdude_45.html#List-of-Parts
- ID也就是
arduino -p atmega328pb
中的atmega328pb
,可以填寫為:arduino -p m328pb
.如果是ATmega328P
型號,可以改寫為m328p