打印
[开发工具]

使用ESP给AVR烧录固件

[复制链接]
251|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gejigeji521|  楼主 | 2025-5-27 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ESP8266/ESP32 通过 WiFi 进行 AVR 在系统编程
该库允许带有 HSPI 端口的 ESP8266/32 模块成为 AVR 系统内编程器。

硬件
ESP 模块通过标准 6 针 AVR“推荐的系统内编程接口连接器布局”连接到 AVR 目标芯片,如AVR910等所示。

如果 AVR 目标板的供电 Vcc 与 ESP 芯片的供电 Vcc 不同,则必须提供电压电平转换或其他形式的缓冲器。ESP 的引脚暴露在超过 3.6V 的电压下会损坏 ESP。

连接如下:


对于 RESET,请使用 0、2 和 15(引导选择引脚)以外的 GPIO,并应用外部上拉/下拉,以便目标正常运行。


使用特权

评论回复
沙发
gejigeji521|  楼主 | 2025-5-27 16:03 | 只看该作者
相关源码
ESP_AVRISP-master.zip (9.58 KB)

使用特权

评论回复
板凳
gejigeji521|  楼主 | 2025-5-27 16:04 | 只看该作者
#include <SPI.h>
#include <ESP_AVRISP.h>
#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#else
#include <WiFi.h>
#include <ESPmDNS.h>
#endif

const char* host = "esp-avrisp";
const char* ssid = "**********";
const char* pass = "**********";
const uint16_t port = 328;
const uint8_t reset_pin = 5;

ESP_AVRISP avrprog(port, reset_pin);

void setup() {
    Serial.begin(115200);
    Serial.println("");
    Serial.println("Arduino AVR-ISP over TCP");
    avrprog.setReset(false); // let the AVR run

    WiFi.begin(ssid, pass);
    while (WiFi.waitForConnectResult() != WL_CONNECTED);

    MDNS.begin(host);
    MDNS.addService("avrisp", "tcp", port);

    IPAddress local_ip = WiFi.localIP();
    Serial.print("IP address: ");
    Serial.println(local_ip);
    Serial.println("Use y**dude:");
    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 avrdudes
    avrprog.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 purposes
                break;
            }
            case AVRISP_STATE_PENDING: {
                Serial.printf("[AVRISP] connection pending\r\n");
                // Clean up your other purposes and prepare for programming mode
                break;
            }
            case AVRISP_STATE_ACTIVE: {
                Serial.printf("[AVRISP] programming mode\r\n");
                // Stand by for completion
                break;
            }
        }
        last_state = new_state;
    }
    // Serve the client
    if (last_state != AVRISP_STATE_IDLE) {
        avrprog.serve();
    }
}

使用特权

评论回复
地板
gejigeji521|  楼主 | 2025-5-27 16:06 | 只看该作者
另外还有一个ESP8266自带的示例
https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP

使用特权

评论回复
5
小灵通2018| | 2025-5-29 16:37 | 只看该作者
AVR 的烧录协议比较简单吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

2420

帖子

8

粉丝