什么是bootloader

一般情况下微处理器写入程序时都通过专门的编程器进行烧写,但是也可以通过在MCU中预先写入一些程序来实现某些基本功能,这些预先写入的程序代码就是bootloader。这样每次复位时MCU就不是从程序存储器起始位置开始读取命令,而是先加载bootloader,实现一些设置和功能,再开始执行代码。

arduino通过预先写入的bootloader,每次通过串口给arduino板下载程序时,首先会令arduino板复位一次,这样就先进入了bootloader,接着向arduino板发送特定的下载指令,bootloader识别到这些指令后就会紧接着开始接收剩下的新的程序代码写入到内部flash中,如果没有进行下载,bootloader没有识别到下载指令,那么它就会跳转到程序区正常工作。

简而言之,Arduino上的bootloader就是能让你用一根usb线就可以愉快下载程序的原因所在

为什么要自己烧写bootloader

有同学可能要问了,既然bootloader已经这么写好在Arduino板里了,那为什么我们还要自己烧写呢,这不是我们喜欢折腾,而是因为:

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

硬件接口

烧写bootloader本质上只是使用编程器烧写一段特殊的程序到单片机中,因此其方法与使用编程器烧写程序是一样的,这个方法在不同厂商、不同种类的单片机上都是不同的。而对于arduino一般的开发板使用的avr芯片来说,烧写程序是通过ICSP(in-circuit serial programmming)硬件接口来实现的

 
uno r3上的ICSP接口

如上图所示,arduino uno上有两个ICSP接口,分别对应其中atmega32u4(左上用于usb转串口)和atmega328(右侧用于正常执行指令),一般来说我们只需要对右侧的主处理器烧写bootloader即可。对于如pro mini等来说,片上则只有一个单片机需要烧写。

   
MISO VCC
SCK MOSI
Reset GND

ICSP接口有6个引脚,其定义如上表所示,其数字顺序从左到右,从上到下,左上为1。其中可以分为三个部分:

  • SPI接口 MISO MOSI SCK
  • 电源 VCC GND
  • 复位 Reset

有些arduino板中不仅引出了ICSP接口,同时其中的SPI接口部分的引脚也可以复用作为普通IO使用,包含在了普通的IO口排座中,而像pro mini等则没有专门设置ICSP接口排针,但所有引脚均引出。

arduino board MOSI MISO SCK
uno\pro mini 11 12 13
mega1280\mega2560 51 50 52
arduino 101 11 12 13

上表是部分arduino板上IO口与ICSP引脚的对应关系。

烧写过程

烧写bootloader可以使用多种编程器,打开arduino IDE的Tools -> Programmer下显示了所有支持的编程器列表,这里推荐使用Arduino as ISP方式,较为简单而且成功率高。

Arduino as ISP简单来说就是用另一块arduino板,给它用普通方式下载一段专门的程序,将其变为一个ISP下载器,再将其相应引脚与待烧写bootloader的板子相连,再通过arduino IDE来控制进行bootloader烧写。这里斜体字显示了分为三个步骤。

  • 专门的程序

    打开IDE,Files -> Examples -> ArduinoISP -> ArduinoISP,使用这个程序下载到一块arduino板中,我们暂且称这块板为ISP板。
  • ISP板与目标板连接

    由前面介绍可知,这里应该是将ISP板的引脚连接到目标板上的ICSP接口上去,连接对应表如下(以使用UNO作为ISP板为例)
ISP板 目标板
MISO / 12 MISO / ICSP-1
Vcc / 5V Vcc / ICSP-2
SCK / 13 SCK / ICSP-3
MOSI / 11 MOSI / ICSP-4
10 Reset / ICSP-5
GND GND / ICSP-6

实际连接电路如下所示,其中左边是ISP板,连接到电脑上,右边是等待下载bootloader的目标板

 
ISP板与目标板的硬件连接图
  • 使用arduino IDE进行bootloader烧写

    按照前面的方式连接好ISP板和目标板后,将ISP板连接到电脑上,打开IDE,首先按住ctrl + shirft + M 打开串口调试窗口,然后点击Tools -> Boards选择目标板的类型。然后在Tools -> Programmer中选择Arduino as ISP,最后点击Tools -> Burn Bootloader,此时会开始进行烧写,同时串口调试窗口里会有相关提示和确认,按照其说明输入相应按键即可完成。

作者:cheng3100
链接:https://www.jianshu.com/p/2f274f8b3dab
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Arduino 烧写bootloader的更多相关文章

  1. 使用USBASP给Arduino烧写bootloader教程

    源:使用UsbAsp给UNO烧写bootloader ATMEGA16U2.ATMEGA328P固件烧写教程 arduino板由于操作不发导致固件损坏,或者想更新固件怎么办?今天给大家介绍一下如何使用 ...

  2. 用arduino的uno开发板为nano板子烧写bootloader

    这篇文章,是为了记录下某宝上淘到的一个没有bootloader的nano开发板的历程(比较坑),自己搜索资料而记录的. 如果没有bootloader,板子就不能接收上传的程序,什么也干不了. 烧写bo ...

  3. mini2440:通过JLink烧写BootLoader到Nor Flash

    开发板:友善之臂mini2440,64M Nand Flash操作系统:Win7电脑:笔记本Lenovo Y450连接器:由于我的笔记本没有并口,所有买了个J-Link和转接板软件:JLink驱动Se ...

  4. Arduino nano的bootloader文件烧录

    1.买了了nano还没用就用 avrisp烧录器给烧了其他程序,仅仅是的avr单片机了:2.将他恢复成Arduino nano吧. 在Arduino软件安装目录中的hardware\arduino中. ...

  5. 【嵌入式】bootloader,linux,filesystem的烧写

    平台: 深圳市优龙科技有限公司的FS2410(基于ARM9) 准备: 1.用串口(UART1,J8)线与PC机相连,这个是用来传输数据和显示信息的 2.连接USB数据下载线(usb device),注 ...

  6. jz2440烧写开发板uboot,内核和文件系统等的相关命令

    下载文件{ftpget -u 1 -p 1 192.168.2.110 a.out a.outnfs 30000000(destination) 192.168.2.109:/home/fs/work ...

  7. 蓝牙DA14580开发:固件格式、二次引导和烧写

    嵌入式企鹅圈原创团队成员黄鑫提供. 相比NRF52832和CC254X,蓝牙单芯片DA14580在OTA和二次引导上要复杂一些,不仅体现在memory map.引导过程等流程上,而且在固件格式.生成和 ...

  8. 给XC2440开发板烧写程序的N种方式

    转:http://blog.chinaunix.net/uid-22030783-id-3420080.html 给XC2440开发板烧写程序非常灵活,总结起来有这么几种方式:   空片烧写(flas ...

  9. 利尔达CC3200模块烧写程序笔记

    1. 硬件使用利尔达的CC3200模块,仿真下载器使用利尔达的FTDI仿真器,硬件完全兼容官方的仿真器.仿真器支持IAR的调试,单步运行等操作. 2. 硬件连接接线说明: RXD, TXD, GNG, ...

随机推荐

  1. 【译】在 ASP.NET 和 ASP.NET Core 之间共享代码

    原文 | Ken 翻译 | 郑子铭 随着 .NET 6 的发布,使用 ASP.NET Core 可以获得更多好处.但是将现有代码迁移到 ASP.NET Core 通常听起来像是一项巨大的投资.今天我们 ...

  2. Winform实现客户端的自动更新

              话不多说,直接上干货.当然也希望各位前辈多多指导. 自动更新客户端的设计原理图 请花两分钟时间,仔细阅读下面这张图,明白客户端自动升级的原理.        自动更新的效果图 1. ...

  3. WPS:从某一页开始编号,并且奇数页偶数页页眉页脚的页码位置不同

    1.开始页的页眉页脚同时取消勾选"同前页" 此后,这一页就是以后所有页的第一页了 2.删去开始页之前所有的页眉页脚 3.页眉页脚选项中,设置奇偶页不同,其它都不用设置

  4. Pycharm:设置自带控制台的python版本

    之前在用chr将一个编码转化为对应的字符时,出现以下提示 chr() arg not in range(256) 后来发现,只有python2.x才会出现这种情况,python3.x统一使用unico ...

  5. (第二章第二部分)TensorFlow框架之读取图片数据

    系列博客链接: (第二章第一部分)TensorFlow框架之文件读取流程:https://www.cnblogs.com/kongweisi/p/11050302.html 本文概述: 目标 说明图片 ...

  6. Liunxa安装Nignx,Git

    Linux安装Nignx 1.安装依赖 执行语句 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel open ...

  7. css蒙层

    {   -webkit-filter: grayscale(100%);   -moz-filter: grayscale(100%);   -ms-filter: grayscale(100%); ...

  8. linux bash shell 的配置文件

    按生效范围划分两类 全局配置:针对所有用户皆有效 /etc/profile /etc/profile.d/*.sh /etc/bashrc 个人配置:只针对特定用户有效 ~/.bash_profile ...

  9. 二进制部署1.23.4版本k8s集群-2-安装DNS服务

    2.安装DNS服务 为什么要安装bind9? K8S中,使用Ingress进行7层流量调度,需要使用域名,进行7层调度. 以前使用绑定host的方法,来进行域名和IP地址的解析. 在K8S里,没有好的 ...

  10. 如何用Google Drive下载超大型文件

    本文将对「如何下载Google Drive中的超大型文件?」这一问题展开探索和解决. 太长不读:直接看这里 情景与问题 在AI.系统安全等研究领域,一项研究成果的产生需要大量的数据样本进行训练和分析, ...