562 字
3 分钟
Arduino 烧写Bootloader

关于Bootloader#

Bootloader 从字面上来看就是启动加载的意思。用过电脑的都知道,windows开机时会首先加载bios,然后是系统内核,最后启动完毕。那么bootloader就相当于单片机的bios,它在嵌入式系统在加电启动的时候根据基带初始化硬件,然后引导系统内核或者是烧写的程序,直到系统启动1

举个实际案例,ATMEGA328P-PU使用其自带的 8MHz晶振就需要烧写

…\hardware\arduino\avr\bootloaders\atmega\ATmegaBOOT_168_atmega328_pro_8MHz.hex

而使用外部的16MHz晶振则需要烧写 …\hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex

使用Arduino作为烧录器#

首先是做一个以Arduino开发板为基础的烧录器,选择 文件>>示例>>11.ArduinoISP>>ArduinoISP 示例程序,把程序烧写进入就完成了一个烧录器。

然后是了解Arduino的ISP下载接口,开发板上的”1”数字标号或者“.”点标号就是MISO接口,其他接口按如下顺序排列。

将烧录器与需要烧录Bootloader的开发板除了按下图进行连接,主要差别就是将烧录器的D10引脚与目标单片机的RESET引脚相连,具体可查看示例代码的第73行:

define RESET 10 // Use pin 10 to reset the target rather than SS

最后就是烧写了,在 工具 选项中,开发板和处理器 按实际需求设置即可,端口 选择烧录器的端口,编程器 选择 Arduino as ISP,设置完成后,点击烧录引导程序即可,如果烧录成功会在下面的窗口提示如下内容:

BUGS

  1. 如果在连接后的第一次烧写发生如下错误,可以尝试进行第2或第3次烧写,烧写时似乎是有一个响应时间,我个人在烧录时,连接后第一次烧录Bootloader都会有如下错误,但第2次之后基本没失败过。

avrdude: stk500_recv(): programmer is not responding avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00 avrdude: stk500_recv(): programmer is not responding … 烧录引导程序出错。

  1. 如果在多次尝试后都无法烧录,可以考虑检查杜邦线的问题,把一些很松胯的杜邦线换掉就可以了。

Footnotes#

  1. 自制atmega328p-pu为主控的Arduino核心板

Arduino 烧写Bootloader
https://fuwari.vercel.app/posts/嵌入式/arduino/arduino-烧写bootloader/
作者
Asuwee
发布于
2021-07-27
许可协议
CC BY-NC-SA 4.0