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

 
在很久很久以前,那是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. 创建vue项目 webpack+vue

    # 全局安装 vue-cli $ npm install -g vue-cli # 创建一个基于 "webpack" 模板的新项目 根据提示填写项目信息 && 对项 ...

  2. 2016最新Java学习计划

    一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 ...

  3. 使用servicestack连接redis

    引言:作为少有的.net架构下的大型网站,stackoverflow曾发表了一篇文章,介绍了其技术体系,原文链接http://highscalability.com/blog/2011/3/3/sta ...

  4. Base64编码和解码实现

    function Base64() { // private property _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr ...

  5. 利用 NGINX 最大化 Python 性能,第二部分:负载均衡和监控

    [编者按]本文主要介绍 NGINX 的主要功能以及如何通过 Nginx 优化 Python 应用性能.本文系国内 ITOM 管理平台 OneAPM 编译呈现. 本文上一篇系: 利用 NGINX 最大化 ...

  6. 转载:http://www.cnblogs.com/double-K/p/6926367.html

    sql专家感悟:不可说的感悟-——十年老技术转型(一) http://www.cnblogs.com/double-K/p/6926367.html

  7. leetCode题解之求二叉树最大深度

    1.题目描述 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along t ...

  8. tomcat idea optinos

    -server -XX:PermSize=128M -XX:MaxPermSize=256m -Xms512m -Xmx1024m

  9. rest framework 的权限管理

    下面是对单个的视图进行的设置的: 请求的时候用postman然后发送信息 我们下面所有的举例都是在用户对Comment这个表的操作 首先先生成一个类似于cookie的字符串 发送给前端浏览器 然后下次 ...

  10. SCLAlertView-Swift

    SCLAlertView-Swift https://github.com/vikmeup/SCLAlertView-Swift   Animated Alert View written in Sw ...