【SimpleFOC】AVRDudess 烧录 Arduino Bootloader(以nano为例)

前提

硬件:USB-ASP下载器

image

链接:https://item.taobao.com/item.htm?id=584918042898

软件:

1、USBASP驱动安装软件:https://zadig.akeo.ie/#google_vignette

image

2. AVRDudess:https://blog.zakkemble.net/avrdudess-a-gui-for-avrdude/

image

3. Ardunio编译软件:Arduino IDE:https://www.arduino.cc/

image

正文

打开Arduino IDE,

Atmega328P 可选:Uno/Nano/Pro or Pro mini,本文以nano Bootloader为例进行讲解

image

对于 Pro mini,处理器选择 5V 16MHz

对于 nano,处理器选择new Bootloader 即可

image

新建一个空项目,另存为到合适的地址

然后,在项目》导出已编译的二进制文件

image

在项目文件夹中,选择带 with_bootloader 字样的 hex 文件

image

打开 AVRDudess,设置好相关的参数,进行编程

image

 

image

 

之后,再设置熔丝位:

根据 Arduino 中的相关内部配置文件(以下是nano),设置好

image

填进去,然后点击Write,即可设置熔丝位。

image

 

 

 

 

扩展:ATmega328P 常用熔丝位配置

熔丝位分为三或四个字节:低字节 (LOW)高字节 (HIGH) 和扩展字节 (EXTENDED)。我们通常用十六进制值来表示它们的设置。

1. Arduino Uno / Nano (5V, 16MHz) 的标准配置

这是最常见的配置,使用外部晶振,频率为 16 MHz。

  • 熔丝低位字节 (LOW)0xFF

    • CKSEL[3:0] = 1111:选择外部全摆幅晶体振荡器

    • SUT[1:0] = 10:启动时间,为晶振选择较长的启动时间(14CK + 65ms)

    • CKOUT = 1禁用时钟输出

    • CKDIV8 = 1禁用时钟8分频(芯片运行在 16MHz)

  • 熔丝高位字节 (HIGH)0xDE

    • BOOTRST = 0:复位后从引导程序区开始执行(这是 Arduino 能通过串口下载程序的关键)

    • BOOTSZ[1:0] = 10:引导程序大小设置为 2048 words(即 2KB)

    • EESAVE = 1:芯片擦除时不保留 EEPROM 内容

    • WDTON = 1:看门狗由软件控制

    • SPIEN = 0使能串行编程(ISP)(这个必须为0,否则无法用ISP下载)

    • DWEN = 1禁用 DebugWire

    • RSTDISBL = 1禁用复位功能(即 PC6 作为复位引脚,而不是通用 IO)

  • 熔丝扩展字节 (EXTENDED)0x05

    • BODLEVEL[2:0] = 101:Brown-out Detection(掉电检测)电平设置为 2.7V

    • (其他位保留,通常设置为1)

总结值(常用格式):

  • lfuse = 0xFF

  • hfuse = 0xDA

  • efuse = 0x05 (有时也记作 efuse = 0xFD,具体取决于工具如何解释字节顺序,但 0x05 是标准值)

2. Arduino Pro Mini (3.3V, 8MHz) 的标准配置

主要区别在于使用了内部 RC 振荡器,并且为了在 3.3V 下稳定运行,开启了 8 分频。

  • 熔丝低位字节 (LOW)0xE2

    • CKSEL[3:0] = 0010:选择内部 8MHz RC 振荡器

    • SUT[1:0] = 10:启动时间

    • CKOUT = 1:禁用时钟输出

    • CKDIV8 = 0使能时钟8分频(8MHz / 8 = 1MHz)。注意: 早期的 Pro Mini 引导程序可能设置 CKDIV8=1 (不分频),然后通过软件设置时钟分频寄存器来降频到 8MHz。但 LOW=0xE2 (8分频到1MHz) 是更常见的配置。

  • 熔丝高位字节 (HIGH)0xDA 或 0xD6

    • 与上述类似,但 BODLEVEL 可能不同(例如设置为 1.8V 以适应 3.3V 电压)。HIGH 字节通常仍然是 0xDE 或类似值。

  • 熔丝扩展字节 (EXTENDED)0xFD 或 0x05

    • BODLEVEL[2:0] 可能设置为 110 (BOD 电平 1.8V)。

重要提示: 8MHz Pro Mini 的配置可能有多种变体。最可靠的方法是直接从一块正常工作且从未修改过熔丝的 Pro Mini 上读取其熔丝位。


如何读取和设置熔丝位

如果你确实需要操作(例如恢复一个被锁死的芯片),你需要一个 ISP 编程器(如 USBasp,Arduino ISP 等)和相应的软件。

  1. 硬件连接:将 ISP 编程器的 MOSI, MISO, SCK, RESET, VCC, GND 分别连接到 Arduino 上 ICSP 接口的对应引脚。

  2. 软件

    • AVRDUDESS (Windows GUI 前端,推荐)

    • XLoader

    • 命令行 avrdude

  3. 在 AVRDUDESS 中操作

    • 选择正确的 Programmer (e.g., USBasp)。

    • 选择正确的 Chip (e.g., ATmega328P)。

    • 点击 “Read All” 按钮来读取当前芯片的熔丝位配置。

    • 在相应的输入框中输入新的十六进制值(例如 lfuse, hfuse, efuse)。

    • 点击 “Write All” 按钮来写入新的配置。

警告与风险

  • RSTDISBL (Reset Disable):如果将此位编程为 0,则 PC6 将变成一个普通 IO 引脚,而不是复位引脚。你将无法再通过串口或 ISP 给芯片编程,芯片会永久锁死,除非使用高压并行编程器恢复。

  • SPIEN (SPI Enable):如果将此位编程为 1,将禁用 ISP 编程功能,同样会导致芯片锁死。

  • 时钟源设置错误:如果设置了芯片不支持的时钟源(如选择了外部晶振但板上没有),芯片将无法工作。

最佳实践:在写入之前,永远先读取一次当前配置并做好记录。只修改你完全理解其含义的位。

希望这份详细的解释对你有帮助!再次强调,除非你非常清楚自己在做什么,否则不要改动熔丝位。

 

 

X. 参考资料:

B站UP主:光树秫秫

《Arduino Bootloader烧录过程指引》https://www.bilibili.com/video/BV1Sf4y167eS/?

 

posted @ 2025-09-07 22:21  FBshark  阅读(96)  评论(0)    收藏  举报