这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下

 
在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器。说“烧”写一点不为过,当年的经典芯片AT89C51在编程时需要十几伏的高电压,加在一个特定的引脚上,才能进入编程。对于某款芯片的编程,都有一个特定的时序,这个时序通常在芯片的datasheet里进行描述并以硬件实现。另外在编程器里的也有一个MCU,这其中使用软件产生这个时序,从而对目标芯片进行编程。电脑通过串口把程序发到编程器,编程器按照规定的时序把程序送入目标芯片。
 
但是这种编程模式有几个问题,首先就是需要为特定的芯片购买特定的编程器。这种编程器通常比较昂贵,且只能用于特定型号的MCU. 对于企业来说,编程器的成本算不了什么,但更大的问题是,编程时我们必须把待编程的芯片从产品上拆下来,插到编程器上,编程后再安装回产品中。这种方法对于双列直插式的芯片也许是可行的。但对于现在日益流行的表面贴装技术是很不可行的,尤其是BGA封装的芯片,通常需要专业设备才能拆卸,拆下后需要重新植球才能焊接。。。为了更新固件而将其从高密度的PCB板上拆下来,是非常不可行的。
为了能不把芯片拆下来就更新程序,人们发明了一种叫ISP的技术,即在系统编程。在系统编程就是通过串口或者其他通用的通用通信接口,为芯片编程。在产品上可以预留一个串口,需要更新时,只要把产品插到电脑上,通过串口把程序传到芯片里,就完成了更新操作。ISP技术的实现,其实就是依赖于芯片在出厂时预先烧写的bootloader程序,bootloader还有很多不同的叫法,比如ISP服务程序(STC宏晶的51单片机这么叫)、bootstrap(MSP430的BSL编程这么叫)等等。但本质上都是相同的。bootloader在芯片复位(或者上电)时,会优先于用户自己的代码启动。这段代码会首先检测芯片的指定引脚上有没有特定的信号,如果没有,则跳入用户程序执行。否则就按照bootloader特定的通信协议,与计算机进行握手,并最终触发计算机将新的程序通过通用接口(如串口)传送到芯片。然后bootloader通过软件的方式(当然需要硬件支持),擦除用户程序区,将新的程序写入到指定的位置。另外提到的是,bootloader是由各个芯片厂家自己写的,因此不是通用的。尽管都是用串口,但通信协议是不同的。比如像国产垃圾STC单片机,通信协议甚至是保密的。因此通常需要厂家提供的专用ISP软件(flash loader)才能给芯片编程。
 
另外,比ISP更先进一点的一个技术叫IAP,即在应用编程。IAP技术允许用户程序修改flash。说白了IAP就是允许用户自定义bootloader,或者说有2个bootloader,一个bootloader是芯片出厂时固化的,另一个是用户自定义的。自定义的bootloader在固化的bootloader之后启动。也许你就要问了,用户自定义的bootloader不就是用户程序吗?其实它跟普通用户程序的区别就是它不会那么容易的被擦除。。。一般是先用专用软件,调用固化的bootloader,来写入自定义的bootloader,然后自定义的bootloader利用能写flash的能力,来给芯片写入新的程序。
为什么需要自定义bootloader呢?默认的bootloader需要在固定引脚,通过串口,以固定的协议传送程序。如果你对这个过程的任何一点不满意,那你就要自定义bootloader喽~
 
再说说DFU,这个名词通常是针对USB设备说的。因为现在的设备基本都是USB了,没用串口的了。。。很多MCU也内置了USB的支持。DFU是Device Firmware Upgrade的缩写,在我的理解中,DFU模式就是支持USB的bootloader。。。DFU模式通常需要特定的驱动程序,因为现在的芯片USB接口通常工作于VCP(Virtual COM Port)模式,插到电脑上后会虚拟成一个串口设备。而DFU模式则于此不同。VCP模式下,PC端是一个串口驱动程序,MCU端是用户程序。而DFU模式下,PC端是DFU驱动程序,MCU端是bootloader。DFU模式的bootloader通常是用户自定义的,并通过固化的bootloader由串口刷入。
 
进入bootloader程序通常有两种方式,一种是硬件复位(或者掉电),即按板上的复位按钮。芯片复位后会先执行bootloader。第二种方式是以软复位的方式进入的,软复位通常是通过PC发送一串指定的指令,用户程序中会通过中断服务程序检测到并处理这些指令。满足触发条件后,芯片将执行软复位,并将指定的地址装入PC寄存器,从而通过软件的方式跳入bootloader程序。
 
最后我们来看一下Arduino和Maple板子的刷写方式。
 
Arduino板上有两个MCU,一个是我们都知道的执行程序的那个MCU,它里面刷写了Arduino自定义的bootloader。另外一个是USB接口附近的一个QFN封装的小芯片,它也是一片MCU,只不过是带USB支持的。在这里它完成USB转串口的功能。更重要的是,它可以监测PC发来的指令流,其中就包含了复位指令。收到USB发来的复位指令后,它会在目标MCU的复位脚加一个负脉冲,使得目标MCU复位,进而将下载指令流放到目标MCU的串口上。使得目标MCU的bootloader检测到,从而完成下载。
Maple只有一个MCU,因此从USB收到下载指令后,只不过复位的不是别的芯片,而是复位自己。将自己复位到DFU模式,从而利用bootloader从USB下载程序。

关于ISP、IAP、DFU和bootloader的更多相关文章

  1. ISP与IAP的区别

    转: ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP ...

  2. 单片机成长之路(avr基础篇)- 001 ISP与IAP的区别

    ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...

  3. 单片机ISP、IAP和ICP几种烧录方式的区别

    单片机ISP.IAP和ICP几种烧录方式的区别 玩单片机的都应该听说过这几个词.一直搞不太清楚他们之间的区别.今天查了资料后总结整理如下. ISP:In System Programing,在系统编程 ...

  4. LPC1800 and LPC4300 Boot/ISP/CRP

    MCU的启动方式有很多种:UART接口,扩展的静态存储单元(NOR Flash), SPI Flash,quad SPI Flash,高速USB0和USB1.另外可以通过对OTP存储单元的编程. 首先 ...

  5. 5.IAP - FLASH

    一.Flash与时钟系统的关系            STM32系统时钟:                 HSE 高速外部时钟,电路上焊接的外部时钟,一般是4Mhz-16Mhz,板子上的是8Mhz ...

  6. 什么是STM32的ISP?

    上一篇笔记分享了STM32的串口IAP实例:STM32串口IAP分享.其中,下载IAP程序时用ISP的方式进行下载.这里的ISP又是什么呢? ISP方式下载程序原理 ISP:In System Pro ...

  7. STC单片机 IAP(EEPROM)的使用

    STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...

  8. 关于MCU的烧录,下载与其他接口的比较(二)

    单片机应用系统由硬件和软件组成,软件的载体是硬件的程序存储器,程序存储器采用只读存储器,这种存储器在电源关闭后,仍能保存程序,在系统上电后,CPU可取出这些指令重新执行.只读存储器(Read Only ...

  9. [WDT]内部看门狗和外部看门狗

    1. 芯片内部看门狗 内部看门狗通常为芯片内部某个特殊定时器,用户可以通过手动初始化.设置timeout.使能.失能该看门狗,然后在线程中定时去喂狗,从而达到检测应用程序跑飞.跑死的情况. 在Linu ...

随机推荐

  1. JavaWeb学习总结(十):Session简单使用

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  2. 深度研究Oracle数据库临时数据的处理方法

    在Oracle数据库中进行排序.分组汇总.索引等到作时,会产生很多的临时数据.如有一张员工信息表,数据库中是安装记录建立的时间来保存的.如果用户查询时,使用Order BY排序语句指定按员工编号来排序 ...

  3. nvflash 报错解决

    0.首先给出nvflash官网下载地址: https://www.techpowerup.com/download/nvidia-nvflash/ 刷入命令 nvflash xxx.rom 多显卡刷入 ...

  4. Reducing and Profiling GPU Memory Usage in Keras with TensorFlow Backend

    keras 自适应分配显存 & 清理不用的变量释放 GPU 显存 Intro Are you running out of GPU memory when using keras or ten ...

  5. jdk下载及安装

    下载下载 jdk 下载 java se 版本的即可. web 开发前不需要像安装 java se 一样安装java ee,只要在项目中添加 java ee 的jar 包就可以了,里面大多是接口和抽象类 ...

  6. Unity Optimization UNITY优化关注列表

    这里主要罗列Unity引擎进行开发的应用或游戏,可以进行优化的各个关注点.(此文会持续更新) C# GC alloc Update LateUpdate Serialize String ToStri ...

  7. 【Java】得到当前股票信息

    import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; ...

  8. uml各类图

    原文:http://www.cnblogs.com/way-peng/archive/2012/06/11/2544932.html 一.UML是什么?UML有什么用? 二.UML的历史 三.UML的 ...

  9. 使用WebViewJavascriptBridge与UIWebView交互

    使用WebViewJavascriptBridge与UIWebView交互 https://github.com/marcuswestin/WebViewJavascriptBridge 核心的地方: ...

  10. svn回退到具体的版本

    svn回退到具体的版本 找到项目的版本号 命令行中输入相关命令  到指定地点找到项目即可