说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。

这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。

后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。

再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦)

既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢?

可以分为3种:

  • ISP(In-System Programming)

    在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。

  • ICP (In-circuit programmer)

    在电路编程,使用SWD/JTAG接口

  • IAP(In-Application Programming)

    指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序

这3种烧录方式的原理是什么呢?在分析原理之前,需要先了解一下单片机Flash的访问地址,看看程序是烧录到哪个位置了。

单片机Flash在地址映射表中位置

下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。

这张图中,我们需要先注意下半部分

  • Main memory 主存储区

通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可(KEIL软件给STM32烧录程序的默认烧写地址就是0x0800 0000开始)

  • System memory系统存储区

System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序 ,这是一块ROM,出厂后无法修改。

了解了程序的具体地址,还要看一下单片机的启动方式:

启动方式选择

STM32有两个BOOT引脚,通过配置不同的高低电平,可以让单片机从不同的地址开始运行。

  • BOOT0=0, BOOT1任意

通常我们是在Main memory 主存储区(0x0800 0000)运行程序,BOOT0引脚拉低即可。

这种情况,KEIL软件给STM32烧录程序,就是直接在这个地址烧录,烧录完,直接在这个地址处运行。

  • BOOT0=1,BOOT1=0

这种情况就用在使用串口方式给STM32烧录程序,这时单片机从系统存储器(0x1FFF 0000)启动,运行的是出厂预置的BootLoader程序,可以接收串口发来的程序,并将其写入Main memory(0x0800 0000),程序烧录完成后,再将BOOT0引脚拉低,Main memory(0x0800 0000)处运行刚烧录的代码了。

  • BOOT0=1,BOOT1=1

这种情况是从内存中启动,内置SRAM(也就是STM32的内存中),既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。目前我还没用过这种方式,大家平时用这种方式的多么?

BOOT0 BOOT1 启动方式 说明
0 × 主闪存存储器 主闪存存储器被选为启动区域
1 0 系统存储器 系统存储器被选为启动区域
1 1 内置SRAM 内置SRAM被选为启动区域

有了上面的了解,再来看一下ISP、ICP和IAP

ISP(串口烧录)

特点:

  • BOOT0 = 1,BOOT1 = 0
  • 启动地址:0x1FFF0000
  • 使用串口下载程序
  • 系统存储器(System memory)启动方式运行内置的Bootloader,将程序写入主存储区
  • 重启后,需要再将BOOT0拉低,从主存储区启动程序

下图是ISP方式的烧录,使用FlyMcu这个软件,通过串口给STM32烧录程序

ICP(JTAG口烧录)

特点:

  • BOOT0 = 0,BOOT1 = x
  • 启动地址:0x08000000
  • 使用JTAG或者SWD模式下载程序
  • 主闪存存储器(Flash memory)启动方式,将程序在主存储区写入
  • 重启后也直接从这启动程序

下图是ICP方式的烧录,使用JFlash软件或KEIL,通过J-Link给STM32烧录程序

KEIL软件的默认下载地址,就是从0x0800 0000 开始的。

IAP

IAP的原理与上面两种有较大区别,这种方式将主存储区又分成了两个区域(根据实际需要由开发者自行分配),0800 0000起始处的这部分,存储一个开发者自己设计的Bootloader程序,另一部分存储真正需要运行的APP程序。

单片机的Bootloader程序,其主要作用就是给单片机升级。在单片机启动时,首先从Bootloader程序启动,一般情况不需要升级,就会立即从Bootloader程序跳转到存储区另一部分的APP程序开始运行。

假如Bootloader程序时,需要进行升级(比如APP程序运行时,接收到升级指令,可以在flash中的特定位置设置一个标志,然后触发重启,重启后进入Bootloader程序,Bootloader程序根据标志位就能判断是否需要升级),则会通过某种方式(比如通过WIFI接收升级包,或借助另一块单片机接收升级包,Bootloader再通过串口或SPI等方式从另一块单片机获取升级包数据)先将接收到的程序写入存储区中存储APP程序的那个位置,写入完成后再跳转到该位置,即实现了程序的升级

单片机程序烧录的3种方式(ISP、ICP、IAP)是什么?相关推荐

  1. STM32芯片烧录的三种方式介绍,串口、STM32 ST-LINK Utility以及STM32CubeProgrammer

    STM32芯片烧录的三种方式介绍,串口.STM32 ST-LINK Utility以及STM32CubeProgrammer 1 概述 1.1资源概述 1.2 STM32串口烧录方式 2.KEIL软件 ...

  2. STM32_基础入门_程序下载的两种方式

    一.ISP串口下载 1.所涉及工具:MDK+FlyMcu 2.硬件连接 3.连接步骤 1.搜索并选择对应串口 2.选择要下载的hex文件,将"编程前重装文件"打勾 3.勾选&quo ...

  3. 返回键捕获 应用程序退出的两种方式(转)

    作为应用程序一个较好的用户体验应该是:在退出应用程序前询问用户是否真正退出?目前普遍做法是,一在退出前询问是否真正退出,二是连续按两下退出. 返回键捕获 应用程序退出的两种方式 实现上述两种应用退出方 ...

  4. java制作oracle程序,Java程序操作Oracle两种方式之简单实现

    Java程序操作Oracle两种方式之简单实现 1.通过JDBC-ODBC桥连接Oracle数据库 (1)创建odbc源,在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名 ...

  5. 【小程序登录的两种方式】

    小程序登录的两种方式 账号密码登录 获取小程序授权登录 账号密码登录 app.json页面顺序 先进入首页 有token就是首页 没有token时redirectTo登录页 {"pages& ...

  6. 单片机程序烧录方式有几种?

    可以分为3种: ISP(In-System Programming) 在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录. ICP (In-circuit prog ...

  7. 单片机三种烧录方式ISP、IAP和ICP有什么不同?

    关注+星标公众号,不错过精彩内容 编排 | strongerHuang 微信公众号 | 嵌入式专栏 学习单片机的同学,或多或少都听说过ISP.IAP和ICP,都是对单片机进行编程,下面简单来说下这几个 ...

  8. 单片机程序下载方式ISP、IAP

    一般只能通过三种方式下载程序到单片机中:1.JTAG    2.ISP    3.IAP 1.JTAG 要使用JTAG方式下载程序,不管是使用J-LINK.ULINK.ST-LINK,只需要把单片机上 ...

  9. 【单片机】一文彻底搞懂单片机程序烧录

    前言   任何和电子相关的专业的同学,相信在大学期间都会接触到一个非常常用的设备--单片机,但是由于课程时间有限,很多人的学习主要还是为了完成课设任务,而不会去思考或研究其中的一些细节,其中就包括学习 ...

最新文章

  1. apktool+dex2jar+jd_gui
  2. 【图文教程】Ubuntu software解决下载速度过慢
  3. NSUserDefaults数据保存使用
  4. 值得一看的PCB接地设计规范!
  5. Go_笔试题记录-不熟悉的
  6. java获取对象的子_java – 如何根据子对象字段获取父对象
  7. Qt之加减乘除四则运算-支持负数
  8. python 时分秒毫秒_第一篇:Python处理时间日期
  9. Tensorflow的可视化框架:TensorBoard
  10. matlab 高阶(一) —— assignin与evalin
  11. Codeforces Gym 100342C Problem C. Painting Cottages 暴力
  12. OnSetCursor 及改变鼠标形状
  13. RHEL7修改root密码
  14. python 循环播放音乐_python中pygame循环播放3首音乐和3张图片
  15. 苹果库乐队怎么玩_iPhone技巧丨苹果手机制作炫酷铃声,就是不一样!
  16. 网易邮箱服务器邮箱协议,网易邮箱全面支持Exchange协议
  17. oracle 字符串中数字转中文大写,金额钱数转中文大写
  18. Java代码小demon(一)SpringBoot+二维码和条形码生成
  19. unity——Survival Shooter:攻击敌人
  20. 超算平台安装DL_POLY分子动力学软件

热门文章

  1. 算法编程例题——枚举法
  2. InterValue项目双周报:20200504-20200517
  3. 如何判断域名的潜力和价值?
  4. USBPCAP工具介绍
  5. HTTP协议与网络编程(二)HTTP消息
  6. 曼哈顿距离和欧氏距离
  7. 使用docker安装nextcloud
  8. 关于神经网络训练的一些技巧NN Tricks
  9. 某校2020专硕编程题-回文素数
  10. OGNL表达式的使用