找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 hanreng 于 2020-8-13 19:22 编辑

Arduino 烧写bootloader


什么是bootloader

一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader。这样每次复位时MCU就不是从程序存储器起始位置开始读取命令,而是先加载bootloader,实现一些设置和功能,再开始执行代码。
arduino通过预先写入的bootloader,每次通过串口给arduino板下载程序时,首先会令arduino板复位一次,这样就先进入了bootloader,接着向arduino板发送特定的下载指令,bootloader识别到这些指令后就会紧接着开始接收剩下的新的程序代码写入到内部flash中,如果没有进行下载,bootloader没有识别到下载指令,那么它就会跳转到程序区正常工作。

为什么要烧写bootloader

1)     自己搭建一块Arduino板,如果想自己做一块arduino板或者想将其嵌入到PCB项目里,而新出厂的单片机里是没有bootloader的,这时就需要自己烧写。
2)     某些罕见情况下旧的bootloader会导致一些bug,如我遇到过旧版本bootloader无法使用watchdog的问题,这个时候写入新版本bootloader可能会解决问题(至少watchdog冲突的问题验证过是可以这样解决的)。

ICSP接口介绍

ICSP(In-Circuit Serial Programming)接口为在线程序烧录接口,其在arduino 系列电路板上为一个2*3的排针端子,6根排针与Arduino电路板上的单片机相连接,分别对应 5V,MISO,MOSI,SCK,GND 和RESET,具体顺序如下图所示。

1

1

ICSP接口有6个引脚,可以分为三个部分:
SPI接口:MISO MOSI SCK
电源:5V GND
复位:Reset

烧写Arduino BootLoader的几种方法

一、使用AVR USB tiny ISP 烧写

2

2

使用AVR USB tiny ISP 烧写是一种简单快捷的方式,其优点为使用ArduinoIDE 进行烧写,步骤简单。
AVR USB tiny ISP 可以在淘宝网上购买到,其价格在40~60元左右。

(1)下载安装 AVR USB tiny ISP 驱动程序

驱动下载链接:AVR USB tiny ISP 驱动程下载链接
安装过程较为简单,这里不赘述,保持默认设置,安装过程持续下一步即可。

(2)BootLoader烧写

1.将AVR USB tiny ISP与待烧写Arduino 的 ICSP接口相连,注意检查线序是否正确。
2.将AVR USB tiny ISP通过USB线与电脑相连,若驱动安装正确,在计算机管理->设备管理器中将出现如下图所示的USBtiny 设备。

3

3

3.打开Arduino IDE,在工具栏中选择“工具”->开发板,选择对应要烧写的开发板型号。在“工具”->处理器,选择对应处理器型号。“工具”->编译器选择USBtinyISP。

4

4

4.设置完成后点击“工具”->烧录引导程序,进行Bootloader的烧写。

5

5

5.烧写完成后,在IDE的下方会提示烧写成功。

6

6

二、使用AVR 下载器(烧录器)烧写

以烧写MEGA2560 BootLoader 为例,使用AVR下载器(烧录器)也可以进行Arduino BootLoader的烧写,AVR下载器在淘宝网上种类繁多,不确定每种都可以进行Arduino BootLoader,在购买时最好可以和店家确认下。
本文介绍的AVR烧写器如下图所示。

7

7

使用该方法涉及到的软件及固件,请点击如下网盘链接进行下载。因使用下载器厂家及型号不定相同,遂不敢保证软件及方法完全可靠适用!
AVR烧写器(ZF009)具体资料及软件下载地址如下:
提取码:20px

(1)连接方式

1.将AVR烧写器插到电脑的USB端口上,电脑自动识别出设备,该设备应为免驱设备,不必进行驱动的安装,在连接电脑后,烧写器绿灯常亮。
2.通过6P排线连接下载器与待烧写的单片机芯片的ICSP接口(若没有预留该接口位,需要按照文章前述将6个接口位分别与单片机对应的 5V,MISO,MOSI,SCK,GND 和 RESET接口相连接)

(2)软件设置

1.打开“progisp20”文件夹中的“progisp”应用程序。
2.按照如下参考图设置参数。

8

8

(3)固件烧写

1.点击软件右下方“自动”,进行烧写。

9

9

2.等待烧写完成,在完成后,软件下方会出现烧写完成的提示。

三、使用其他Arduino板烧写

在手上并没有如上2种方法的烧写/下载器等工具的时候,也可以采用使用其他arduino板来进行烧写。使用arduino板烧写BootLoader至少需要两块arduino板,其中一个作为ISP下载器,另一个则是需要被烧写的板子(它们的型号可以不一样)。
本例将用两块arduino nano ATmega238P(Old Bootloader) 互相依次更新为最新的BootLoader。

(1)操作过程

1. 将ISP下载器的程序烧录进第一块arduino板(下文将其称为 ISP板):
打开 arduino IDE – 示例 – 11.ArduinoISP 示例文件,并上传(烧录)进arduino板中,因为两块板子都是old BootLoader,所以应注意此时选择的处理器应为“ATmega238P(Old Bootloader)”才能成功上传。

10

10

2. 将第二块arduino板(被烧录板)与ISP板相连:
本例中使用的arduino nano 的ISP接口是D10~D13口,分别是SS, MOSI, MISO, SCK

11

11

将ISP板与被烧录板的MOSI(D11), MISO(D12), SCK(D13), GND, 5V 引脚相接,将ISP板的SS(D10)引脚与被烧录板的RST引脚相接。

44.png

注:由于不同型号的arduino板在引脚复用时对应的引脚不一样,所以括号内的引脚名称仅适用于arduino nano 和arduino UNO。若要使用arduino mega2560 等其他型号的板子时,注意对应的ISP接口与引脚号的对应与此表括号内的引脚号是不同的。

3. 进行BootLoader烧写
在 IDE–工具–处理器 中选择ATmega238P,选择没有括号的那个,作为要烧写进去的版本。

12

12

IDE–工具–编程器 中选择Arduino as ISP

13.png

点击“烧录引导程序”即可完成烧写。

14

14

至此第二块Arduino nano 板的BootLoader已经烧写(更新)为最新的了。而第一块nano板作为ISP下载器,其中的BootLoader并未更新。接下来对调两者的角色,再如法炮制即可。
需要注意的是,此时给第二块(已更新)的nano板烧录ISP程序时,在IDE–工具–处理器 中就应该选择 ATmega238P了,烧录好ISP程序后,然后再给第一块板烧录BootLoader。

(2) 常见报错

在烧录引导程序的时候有过这样的报错:
avrdude: ser_open(): can't open device "\\.\COM10": ϵͳҲ���ָ�����ļ���
错误原因是串口端口被占用,尝试关闭IDE或其他软件的串口监视器后重试。
还有报错:
avrdude: Expected signature for ATmega328P is 1E 95 0F. Doublecheck chip, or use -F
或:
Yikes! Invalid device signature. Double check connections andtry again, or use -F to override this check.

15

15

(3) 解决方案

在 IDE–文件–首选项 中把所有的调试信息(显示详细输出)打开,若显示Devicesignature = 0x000000Device signature = 0xffffff等情况,其实不是真的芯片签名有误,而是电路连接有问题,再次检查接线是否接对。

(4) 总结

总体思路是:
1)     上传例程“11.ArduinoISP”,将其中一块Arduino作为ISP烧写器。
2)    通过ISP引脚将两块板子相连。
3)    选择BootLoader版本并上传。

值得注意的有两点:
我们会在步骤1和步骤3,两次涉及到在 IDE–工具–处理器中选择处理器型号。其中步骤1中选择的是上传程序的那块板子(跟电脑用USB连接的那块)的处理器(BootLoader)型号。步骤3中选择的是要被烧写BootLoader的那块板子(用引线连接的那块)的处理器(BootLoader)型号。
这两块Arduino板的型号可以不一样,但要注意它们对应的ISP的引脚号也会不一样。不能单纯按照板子上印刷的引脚号相应连接,而应该找各个板子的PinMapping,找到对应的ISP的引脚。

33.png
分享至 : QQ空间
收藏

1 个回复

倒序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册