ESP8266/32作为AVR编程器(ISP programmer)的使用介绍

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

📘制作流程介绍

  1. 通过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(); }
}
  1. 程序烧录后查看ESP8266/32的网络IP地址和端口号:net:192.168.0.104:328
    在这里插入图片描述
  • ✨需要注意:ESP8266/32设备的网络IP段必须同电脑端的IP同段,只要电脑端所连接的WiFi与ESP8266/32设备在同一个路由器上一般没有问题。如果不同端的IP地址访问需要进行电脑设置,具体教程可以网上找相关不同IP地址段访问方法的内容。
  1. 使用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编程器烧录方式选择和烧录:
    1. 配置编程器
      在这里插入图片描述
    1. 使用编程上传:
      在这里插入图片描述

📘烧录目标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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

08-JVM 面试题-mk

文章目录 1.JVM 的各部分组成2.运行时数据区2.1.什么是程序计数器?2.2.你能给我详细的介绍Java堆吗?2.3.能不能解释一下方法区?2.3.1常量池2.3.2.运行时常量池2.4.什么是虚拟机栈?2.4.1.垃圾回收是否涉及栈内存?2.4.2.栈内存分配越大越好吗?2.4.3.方法内的局部变量是否线…

Vue3 nextTick

nextTick 是 Vue 中非常重要的一个 API&#xff0c;它允许你在 DOM 更新周期后执行延迟回调。 核心源码位置 Vue3 的 nextTick 实现主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本实现 const resolvedPromise Promise.resolve() as Promise<any> let …

DISCO:利用大型语言模型提取反事实

DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 尽管在自然语言处理(NLP)领域针对各种推理任务取得了巨大进展(Wang 等, 2018, 2019a;Xu 等, 2020),但数据集偏差仍然是构建鲁棒模型…

【Django】框架-路由系统核心概念解析

1. 最基本路由关系 路由是URL地址与处理逻辑&#xff08;视图函数&#xff09;的对应关系。 本质&#xff1a;将用户请求的URL路径映射到具体的处理程序&#xff08;如Django视图函数&#xff09;。 示例&#xff1a; # urls.py urlpatterns [ path(home/, views.home_…

理解 results = model(source, stream=True) 的工作原理和优势

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;当处理视频或图像序列时&#xff0c;streamTrue 会将结果包装成一个 生成器&#xff08;Generator&#xff09;&#xff0c;逐帧生成 Results 对象&#xff0c;而不是一次性返回所有结果。内存优化&#xff1a;…

重新定义“边缘”:边缘计算如何重塑人类与数据的关系

在数字化浪潮中&#xff0c;云计算曾是科技界的宠儿&#xff0c;但如今&#xff0c;边缘计算正在悄然改变游戏规则。它不仅是一种技术进步&#xff0c;更是对人类与数据关系的一次深刻反思。本文将探讨边缘计算如何从“中心化”走向“分布式”&#xff0c;以及它如何在效率、隐…

MCP 协议知识分享

MCP 协议知识分享 一、MCP 协议概述1.1 定义与背景1.2 核心价值1.3 与传统 API 的对比 二、技术架构与工作原理2.1 核心组件2.2 通信机制2.3 典型工作流程 三、关键技术与应用场景3.1 核心技术3.2 典型应用场景 四、与微软技术的集成4.1 Azure OpenAI 服务4.2 Playwright MCP 服…

策略模式实现 Bean 注入时怎么知道具体注入的是哪个 Bean?

Autowire Resource 的区别 1.来源不同&#xff1a;其中 Autowire 是 Spring2.5 定义的注解&#xff0c;而 Resource 是 Java 定义的注解 2.依赖查找的顺序不同&#xff1a; 依赖注入的功能&#xff0c;是通过先在 Spring IoC 容器中查找对象&#xff0c;再将对象注入引入到当…

Linux》》bash 、sh 执行脚本

通常使用shell去运行脚本&#xff0c;两种方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引号不能省略 我们知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面应该跟一个 command。

【解析】ReentrantLock锁、Syschronized锁面试点解析

面试官提问 ● 公平锁与非公平锁的区别是什么&#xff1f; ● 什么是可重入锁&#xff1f; ● 什么是死锁&#xff0c;怎样避免死锁&#xff1f; ● ReentrantLock与Syschronized实现原理是什么&#xff1f;两者有什么区别&#xff1f; ● 请说明ReentrantLock获取锁与释放…

04.Python代码NumPy-通过索引或切片来访问和修改

04.Python代码NumPy-通过索引或切片来访问和修改 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性&#xff0c;希望对您有用~ python语法…

跨平台数据采集如何解决不同平台之间的数据兼容性问题?

在数字化时代&#xff0c;企业越来越依赖多个信息系统来管理业务&#xff0c;例如ERP&#xff08;企业资源计划&#xff09;、CRM&#xff08;客户关系管理&#xff09;、财务管理系统、电商平台等。然而&#xff0c;在进行跨平台数据采集时&#xff0c;不同系统之间的数据格式…

解决 vite.config.ts 引入scss 预处理报错

目录 报错1&#xff1a;[plugin:vite:css] [SASS] Error&#xff1a;Cant find stylesheet to import 报错2&#xff1a;[plugin:vite:css] [sass] Error: Undefined variable 版本号&#xff1a; "sass": "^1.86.3","sass-loader": "^1…

C++笔记,数学函数

参考链接&#xff1a;C中数学函数的使用方法_cpp里指数函数-CSDN博客 头文件 <cmath> 1. 基本的算数运算函数 1.1 sqrt() - 计算平方根 功能&#xff1a;计算一个非负实数的平方根。原型&#xff1a;double sqrt(double x);示例代码&#xff1a; #include <iostr…

不关“猫”如何改变外网IP?3种免重启切换IP方案

每次更换外网IP都要重启路由器&#xff1f;太麻烦了&#xff01;那么&#xff0c;不关猫怎么改变外网IP&#xff1f;无论是为了网络调试、爬虫需求&#xff0c;还是解决IP限制问题&#xff0c;频繁重启设备既耗时又影响效率。其实&#xff0c;更换外网IP并不一定要依赖“重启大…

道路运输安全员企业负责人考试内容与范围

道路运输企业主要负责人&#xff08;安全员&#xff09;考证要求 的详细说明&#xff0c;适用于企业法定代表人、分管安全负责人等需取得的 《道路运输企业主要负责人和安全生产管理人员安全考核合格证明》&#xff08;交通运输部要求&#xff09;。 考试内容与范围 1. 法律法…

深入剖析 WiFi 定位解析功能:原理、技术优势与应用场景

WiFi 定位解析功能的原理​ 信号强度与距离的关系​ WiFi 定位的核心原理基于无线信号传播过程中的一个基本特性&#xff1a;信号强度与信号发射源&#xff08;即 WiFi 接入点&#xff0c;Access Point&#xff0c;简称 AP&#xff09;和接收设备之间距离的关联。一般来说&am…

NVIDIA RTX™ GPU 低成本启动零售 AI 场景开发

零售行业正在探索应用 AI 升级客户体验&#xff0c;同时优化内部流程。面对多重应用场景以及成本优化压力&#xff0c;团队可采用成本相对可控的方案&#xff0c;来应对多重场景的前期项目预演和落地&#xff0c;避免短期内大规模投入造成的资源浪费。 客户体验 AI 场景的研究…

首次打蓝桥杯总结(c/c++B组)

目录 一、对每个题进行总结 1.填空题 2.第一个大题---可分解的正整数&#xff08;10--3&#xff09; 3.第二道大题---产值调整&#xff08;10--3&#xff09; 4.第三道大题---画展部署&#xff08;15--7&#xff09; 5.第四道大题---水质检测&#xff08;15--3&#x…

林纳斯·托瓦兹:Linux系统之父 Git创始人

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 林纳斯托瓦兹&#xff1a;Linux之父、Git创始人 一、传奇人物的诞生 1. 早年生活与家…